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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯), o; I! w8 d, O9 R& d

0 B: @. C+ h8 j! J8 S3 A出现漏洞的两个文件为:
# W: K" o- K4 \- P) X- H( mInclude/payment/alipay.php
6 B% B% `  |5 @' w$ y: ~Include/payment/yeepay.php/ g3 S" e+ G* j3 {! K! G
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
& l. Z/ x- k+ e& h& o6 k' U
- T( c, G2 @1 a6 e+ IInclude/payment/alipay.php9 M1 z7 Q+ M' e8 P) a# O
! T1 y% H5 u* S  G$ v% u
......% _8 B' h- b' X. E
   function respond()
: R, w9 m5 n3 ?4 m/ S/ Z    {2 V) C0 n0 v8 h- x6 L& |: T5 Q
        if (!empty($_POST))
. |' d( N: e" H1 R/ G        {
/ I# {) d$ ]' N8 u) t; o  R5 R% N            foreach($_POST as $key => $data)4 w8 Z+ ?: r, a
            {; G% c0 v* \& s" i) g, T
                $_GET[$key] = $data;% |- T0 V+ C! |" S# I. M
            }
5 n* _7 A, T+ d4 t7 g        }
7 y8 O/ U. J4 H7 R+ U& T0 ?        /* 引入配置文件 */
" d; R# O! M7 ?8 Z4 L2 {        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
4 T- Z% b" M. W+ f......
: ]4 Y( h7 ]. A5 M- o   j: r" j. d# q* O

( v2 a( Z0 P4 _  `! h0 p8 N大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。8 k4 {/ y$ y# H5 a( w

# D( U' h/ ^) E0 K! m6 L+ N! Z* x7 dInclude/payment/yeepay.php: z6 H/ J: y8 B* L+ u9 I
$ s0 e& ]9 p7 \5 Y; d; e

  K' `5 i$ |3 K3 W0 a- J
2 {2 P' G7 ]1 m! K' q....... E0 r  V) r7 u6 o
    function respond()" j; q$ x+ Y6 E+ \- b' m* S# M
    {
0 M5 U9 J: m7 c  i& O0 N: Z
% ?. R7 q) i/ L' i+ X; [        /* 引入配置文件 */9 Q+ T0 m5 S5 j2 B
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';6 U% q; S/ c5 M2 b) E! Y
$ D4 m6 {0 _& ^( P7 r
        $p1_MerId = trim($payment['yp_account']);
$ i" C0 B! W; P' Z' K6 U        $merchantKey = trim($payment['yp_key']);
& e5 l' P2 ^9 r8 I( c; T......
! T4 c8 x$ o. `& t+ g 9 |# e9 s3 S: T' i  g  O! u
, {/ x/ B6 L/ V7 G
: Z# b: V5 t/ I! V9 k
5 {( I1 Y, y, b4 Q/ G& R2 t
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
4 l! ?2 ~7 `; h6 ~/ F4 D  S! A8 z1 a% D( r  ?+ a& C# l
这两个方法在plus/carbuyaction.php文件调用。
7 H: o" j- B8 i/ X1 H
& _3 u5 g! {  ^. P* xplus/carbuyaction.php4 S( Z' h, m4 b6 L" Q3 s

+ D9 o$ `, ?. Q  c( }3 M% p2 R' `- ^......
7 I3 h+ e$ @) Z/ p" ]' w2 D: e" D} else if ($dopost == 'return') {
" ^6 \( q6 [: W/ I/ U6 c* L- e1 a8 P    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
4 h6 P4 T9 A& d+ `; t    if (in_array($code, $write_list))
& E6 H1 W; s8 ~1 n3 t0 `    {
) ~. W6 j& M/ L5 m6 A" J1 {        require_once DEDEINC.'/payment/'.$code.'.php';. }+ n6 X. s4 D
        $pay = new $code;
$ _7 M# H) j5 b7 N% b' {! R; }2 _- Y        $msg=$pay->respond();7 m8 v' F4 G- o$ h% M7 J4 P2 H6 b
        ShowMsg($msg, "javascript:;", 0, 3000);7 V6 ?' j  b& \  e
        exit();  % k( Z- h/ Y5 n
    } else {4 |1 w3 J: g# a& x8 Y
        exit('Error:File Type Can\'t Recognized!');3 U3 T) t, N1 {! u- _$ L' c% \
    }
! M0 C8 G% s) }' a- V+ n}
9 w& C6 U" o% ?! R7 O& R1 f: R& x9 H...... , u6 Z! [! a5 C# i  L  o

6 \, c7 t9 @8 e! V: U  r% ~
  z' h  j. m) u7 H4 s# }3 w
3 U9 W/ o, h1 f5 o4 @+ d, z
; A" [* d+ F1 X  \* W$ s   L! C8 t2 d* [1 A4 O7 |) }& w

( f; r0 l( o% ~. w5 s4 E大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。2 r! e; @$ M# o. v# N' l6 l
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。- R# X6 z. G& i2 `& C" x
  J4 [; j8 t( r
回到include/common.inc.php来看看他的机制。
, z% P% k' p( i+ J7 X$ w) n; A* I6 I9 I! E0 g

5 j4 ?+ ^1 v% M% d8 h' }3 H: W$ @
......
$ ]. l* Z; A6 C; J' H9 Iforeach(Array('_GET','_POST','_COOKIE') as $_request)& o7 T8 H% _  i& b% k; M
{) f2 b5 ?3 |* [2 @/ w) k9 F1 @
        foreach($$_request as $_k => $_v) - }- k/ g+ f: R( E2 u
        {
$ p8 }$ `- n4 L- r                if($_k == 'nvarname') ${$_k} = $_v;) j( k' T& a' [* j3 j
                else ${$_k} = _RunMagicQuotes($_v);( y$ m! V( y: m- Z1 s1 W; R7 I
        }$ Y& x! y3 D$ b/ e! \8 x
}5 G( a; u$ @. O9 `
......
0 y* j6 [8 D% M% l1 v5 {大概在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。暴路径:
4 i& K1 I. @, _5 n! y+ a由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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