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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)2 S% j& k! q3 B4 o7 J$ I
. M2 n, Z# V8 f5 l. q
出现漏洞的两个文件为:; L% s# r* Z) _" g
Include/payment/alipay.php4 V) z2 x0 W7 u5 a; r- a) m2 R# {
Include/payment/yeepay.php: z5 G7 n! H- X. m0 P( B+ @8 B
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
4 u; W! e1 {2 P" J
! D/ m: y! E: X, e) P! uInclude/payment/alipay.php
" ~8 N2 k- w  |% t9 R; Q6 C( d; G- [% c! ?* N1 m
......
9 X& H  T0 A4 G1 V   function respond()
4 `5 a8 `% P6 B. H# ?    {
$ k' c+ I. X' X8 {$ K        if (!empty($_POST))
. C& c2 N4 m4 Z9 e+ s6 j/ X8 S2 [: k        {; m7 ?: C& R5 N3 q# x
            foreach($_POST as $key => $data)7 I$ h- O7 d& ~: G
            {- m5 g% Y) C5 G
                $_GET[$key] = $data;
) M8 s3 U8 I- o: S$ L+ R& Z            }: O- V; u3 r  |! Z/ B  X7 M
        }1 u5 @& o! d& `3 |% q+ T9 \
        /* 引入配置文件 */7 `7 @, w" H7 w# q* k
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
+ g0 O7 c0 l0 q- y......
& O$ c2 k: a, ]+ ^ : O* @( d& h, q$ I
) P4 ~- f# U8 x( W% ^# w, |) V+ P' P
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。* [1 g! v0 v7 g3 j' q+ m0 ?7 s

7 U9 K; w$ U) f! K: }Include/payment/yeepay.php
8 M, Z  t+ L$ z. s% ^( G. C; K& A( f, h2 v2 e
7 _' S% x# P  G
7 a# i4 N5 ~2 w  A7 ^, ?
......5 V8 p- |' F' L3 R
    function respond()3 h0 \+ E6 {: h9 U5 S
    {$ K2 N; G% |6 u7 j+ N" z  B  K

& i! _. V! `1 |* \- }5 z        /* 引入配置文件 *// |; `) u; J! z, C
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
* u, l. {( H2 i* K
) q- O1 x! N( y; ?9 L8 g        $p1_MerId = trim($payment['yp_account']);' N$ p7 f+ y8 \& t% s$ B2 ~; o
        $merchantKey = trim($payment['yp_key']);  v9 c0 d5 P1 `! ~+ h1 R
......
3 R5 z. Q% x/ _, Z) k9 Y9 Z 7 _) _: N. g( L6 M  P, _' m, n
# G0 J: y1 X. B+ N/ V) n% C9 t
  b+ _3 W( d: _! s& X
5 M8 C8 `( c, X7 A
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。, v" M. L% e7 N  U: d- t1 @

. l/ u% n& y0 U. m# ~& G" C这两个方法在plus/carbuyaction.php文件调用。
$ p. ?6 ?0 I! h. m8 L& c4 Y3 a- A" }# I$ C9 w  ~( n- ~
plus/carbuyaction.php
! g) h% C1 s" \* h; z) M1 D) k3 F5 P$ v6 B1 B  @2 N
......
* n; p& ?9 x: P- s* ?} else if ($dopost == 'return') {' n+ y  M- a3 H
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
4 B' ?: e. n- w8 O8 a& Y    if (in_array($code, $write_list))3 b1 D3 {+ I- \  r
    {. ?7 M' h5 [# M
        require_once DEDEINC.'/payment/'.$code.'.php';
( K# }9 I9 z4 K$ s: t8 U( X        $pay = new $code;
* s3 V7 C: C* ^& ]3 C. q3 @        $msg=$pay->respond();) O" m' C2 b) v3 B
        ShowMsg($msg, "javascript:;", 0, 3000);
6 w7 V$ N' d6 Q; S        exit();  
9 n) \0 ~( d. \    } else {
( ~( d7 h7 I8 {) g9 ^        exit('Error:File Type Can\'t Recognized!');+ p% [& K: ~! r9 l/ J% {8 n
    }, [. r0 `$ L  ~, s) k
}
0 E! \+ u8 r1 w  H3 L...... 9 n% j" Z( |7 ?

6 A: W! e6 E2 s) u/ j  A- }! U& Y9 A. t+ O
+ S% V. x  E2 r
% @: d; |  d( u/ N. H
& N7 [3 g, B+ ?/ S4 ?9 X
/ F1 x  @4 |& z' w) Y; [
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
& D) q$ i# x4 [# S3 E5 B9 ^所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。9 r( j' S: L3 m

4 _2 Q7 B) X; G回到include/common.inc.php来看看他的机制。
' ?  {. `" r2 |& j+ G4 N
9 y$ b& A$ K3 P
5 n1 N$ m$ i. Q6 P1 h
1 [6 {" C: _* d7 q......6 \/ Y. }: a+ F$ g
foreach(Array('_GET','_POST','_COOKIE') as $_request)
! ^0 g/ R0 i/ x5 @+ H- I0 W{
! Z  m; ?3 I0 W) D- q        foreach($$_request as $_k => $_v)
6 H* g. Q6 R- g) \/ ^& b0 o$ }        {
1 x4 s! v! s/ {+ ], q) d                if($_k == 'nvarname') ${$_k} = $_v;4 K& ]' [. S" X& k2 K; q
                else ${$_k} = _RunMagicQuotes($_v);
6 Y6 U: t: Z' g8 l, y        }/ P+ W3 V+ U7 T& m1 T! ~
}: M( N. E* e* s0 G4 X
......
% N! `5 D% B  w( w2 K9 x3 J大概在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 d* y* J! T( N( J$ V, ^4 ?由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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