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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯), w$ v6 r1 Z& ^/ c: v1 @7 \

- q3 i3 Z% h7 M出现漏洞的两个文件为:
' H% u2 B( }0 B4 q# Q$ J' m, K0 xInclude/payment/alipay.php
( n! a6 \; l$ F# b. C8 J/ hInclude/payment/yeepay.php
8 ~, D: a( p9 l! {# S漏洞均出现在respond方法里,估计这两个文件是临时工写的。
7 u3 a4 Q* g5 X3 n: a8 h. d' o9 T: K# M- H$ X4 I
Include/payment/alipay.php
; F5 h  J6 ]+ {/ w
$ R' `7 f8 F- v8 l( N......
$ N' [% I/ N) @$ h* p   function respond()
8 H5 V! }8 V1 i' O6 B  w8 C    {
" M& d7 z  Q* d3 Q! C8 z        if (!empty($_POST))
. S4 D9 L& R, c  Z/ X4 u        {3 f: k: O) A2 }1 P& N6 f- w
            foreach($_POST as $key => $data)
- t$ T2 }+ V, u! E            {% q+ G% q9 U5 L8 I- A
                $_GET[$key] = $data;
% a5 j- |; @2 V            }
9 L/ e4 J1 n- e! m4 j" u: z        }
: k9 s' A* s0 N9 o/ C# m# I        /* 引入配置文件 */5 f/ _3 }9 s! M" |
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';9 x5 z2 O) @( @4 ?; @1 A
...... 9 S7 W5 C9 q( a4 k' a- _. Z

$ ]9 A$ [% x6 g. z7 q0 T; B7 r3 K6 f4 N
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。5 A2 e  o$ A) Y  |# I) G

2 \! G! q) L5 l+ u: x. yInclude/payment/yeepay.php3 v  P% J$ u, k: l9 e
0 q0 c3 g0 f  i

  X- f1 o# R# S7 Z8 [8 z' }
# {, C: O% A. F& c9 I......' e" r! p7 a8 w# R; }2 M
    function respond()
1 h2 y# Y- ?& p5 T+ A( b# ~( F6 s$ w    {4 p: i4 M4 P* F! S, K, B( v8 G: t
5 `+ H- K6 |: ?9 }8 m9 U
        /* 引入配置文件 */5 n, C4 k4 L7 I! s
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
1 P! r% Z) q' ]0 b4 Q
. T* d8 q3 k7 K0 {# m$ Q        $p1_MerId = trim($payment['yp_account']);% l6 X4 B- u+ ^7 G9 D1 k2 z
        $merchantKey = trim($payment['yp_key']);! }" x4 e  }6 k1 W$ T
......
2 W2 M! N( R- @0 g7 J2 X3 N
) Q; J) t* l2 F
- O& k" y2 o% c; [) t: v% E + V, u# z& N4 E& r. J, J

3 z0 h- u& w0 y' o( }" v: I, h* j大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。1 t& t0 ?0 W( f) Z: x

' S- G! \1 T, Z3 ]* b这两个方法在plus/carbuyaction.php文件调用。
4 ?1 f6 U) V5 b7 F) ~' m
5 K6 y9 W/ }' [8 wplus/carbuyaction.php
2 O3 g- }7 m3 `' c
0 U8 T2 ~: i8 H6 x! V1 l......
$ W% Q' j  r& X; D' E} else if ($dopost == 'return') {3 A$ O7 z6 L2 \( P7 h* x
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
- R: T- }; q. d: T& n    if (in_array($code, $write_list))
4 R+ B/ q& |' m% Q/ E8 {    {8 `, d. K, j- ~; ^$ ]4 U
        require_once DEDEINC.'/payment/'.$code.'.php';! W, x/ c( D  P1 Y6 ?. i9 P' V# x6 m% j
        $pay = new $code;
' W2 A& a/ t  }8 j7 Q$ ]        $msg=$pay->respond();1 I& f  o; T1 O4 H9 Y
        ShowMsg($msg, "javascript:;", 0, 3000);
2 L- z) \8 [9 w$ H7 Q- ^        exit();  % b7 q6 ]/ ?1 |" t
    } else {2 d  t" ]" w, W' A) C
        exit('Error:File Type Can\'t Recognized!');6 ^6 d( S; T, @: p. O& M1 s8 G
    }' E. K5 C# s, M! e
}* S2 S. g: x& }7 D" I" G
...... 4 }4 {% N+ `- t% S+ O8 D

; T1 c4 A/ [7 L8 T% ~+ }
$ P0 A* \& ~- `3 } 8 @9 U# u: Z/ p3 A

; ~& p) v& l! ~  u0 X
% s1 B/ v! l  m* I1 R  i/ v
  I0 l! J4 I+ V/ K大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
# }+ m- W: u  ]; E8 p) [4 e所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。; |' p' R; h) Y  U& G

7 v$ |0 @7 ~  u回到include/common.inc.php来看看他的机制。
3 C* Q! M& p# e9 P0 X0 |0 V6 I3 m. v  {' X9 \
* Y3 A! x" }- J% d' e: n4 C6 ?7 \

. F- c+ i* T) i+ F6 C) _......* A: L, o' F# |6 |+ w6 O0 `2 S
foreach(Array('_GET','_POST','_COOKIE') as $_request)
4 K$ T; r9 v1 E6 j2 i' g0 u{! B$ Q! N9 A& O+ O# W
        foreach($$_request as $_k => $_v)
6 i6 i  `& M0 y- y        {5 {  X5 U( @2 y: M  ?! P
                if($_k == 'nvarname') ${$_k} = $_v;
# g9 v9 x, c6 X                else ${$_k} = _RunMagicQuotes($_v);
. y9 L3 X% K. D        }
* R7 \; ^* A9 {" E: {0 q# F}7 R2 H; G" U( S8 n5 i; ?3 \
...... 4 f9 X9 U  Y" K- }0 |
大概在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。暴路径:
( W' ~) ?' c9 C, v4 f  s由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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