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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
( X! \: Z" v' N. H# Z- z* I: k3 y) J9 I; D$ X  `' Q5 C+ U
出现漏洞的两个文件为:) t4 T# u# ?+ @1 e$ K
Include/payment/alipay.php
4 O1 G. F0 M1 v) M2 uInclude/payment/yeepay.php8 e; D) p  p  D
漏洞均出现在respond方法里,估计这两个文件是临时工写的。; ^; U+ |  ]! A7 |( w' B

% `7 I# H, B" R4 kInclude/payment/alipay.php; P, m2 x# X* u2 {" a# k. S6 ]& ^
/ m3 }/ f% b5 @; t& F  f9 T& H
......
# m/ {; `, J/ B% L) j  x   function respond()
; J) x5 J  z$ P) U( e/ h    {  ~5 S8 m9 q6 ^8 ^
        if (!empty($_POST))
0 N  z( j! z! p        {; e5 g# X$ l9 a* r( B
            foreach($_POST as $key => $data)# U7 P+ a$ j3 k- Z+ i7 A
            {
$ o7 G1 {# a# \0 A$ e4 u2 B) v                $_GET[$key] = $data;
! G  ^1 f- x" J* ~0 x            }
% U9 W7 s- _* _7 m' S% `        }+ c) @# ^* v  o
        /* 引入配置文件 */7 y& Z, O% F) Z# x
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';' \# X' s- |+ j, [+ d. O
...... + K3 N9 w' z& O* m

" X' N9 v0 L9 G2 B: ^
  r) H% O: f: {7 h, b6 _& U- F大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
: I1 L0 n9 T6 n7 q- q0 g/ x
3 b+ F) `+ b. c) K( {$ F9 o6 HInclude/payment/yeepay.php' Z& m0 u: R( Z: u( c. `: k

8 A  R- v+ o% a  G
+ Z9 j# ]. F4 G) y- \  J, ]8 k
7 I2 c1 t+ c& u! N4 z......
+ x: A3 L: P, C+ C! }2 M/ j    function respond()! _7 |. r1 d9 }! B
    {6 f/ p! }& t: C- q' j6 {
8 L9 [- f2 o' a2 W
        /* 引入配置文件 */
8 u5 s, t8 L4 ~# S        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
7 c  N. g4 u  A
: d: u" q2 N* Y, ~" U/ I        $p1_MerId = trim($payment['yp_account']);
: t2 K1 X9 h. t! ?+ d  C/ s/ h        $merchantKey = trim($payment['yp_key']);1 C) \! Z3 v& v6 C$ ], g
...... ( s% V" _, g" w  Z) x) w# H& h

, r  D' F7 A( C) Y" k( j
( W. i6 \6 r) S% v, K8 E
8 g1 I9 L. U: O$ q. }" u4 g
5 V/ o& ~: X& i2 ]大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。: v- x& b4 _- C( i  n9 |3 J' p- K
# u: `, q' P0 O; ^
这两个方法在plus/carbuyaction.php文件调用。
$ \2 l) ]' x' f. A5 w' j/ u5 G# G, p& f; ~( L* c; w; Y
plus/carbuyaction.php
& L2 R  v9 I8 D9 D& f8 e( ?! i' r" \1 Z& N6 q* K
......7 ~9 E% M! t0 h3 @. u
} else if ($dopost == 'return') {5 l. r( @5 |" _+ N
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');) X: |; ?+ B8 U7 a' _3 L) D
    if (in_array($code, $write_list))6 A( q, o/ u) p* p0 O* A* i
    {
# R1 O; B; B. a( N1 B( P        require_once DEDEINC.'/payment/'.$code.'.php';. k/ C7 H! i. W8 C9 E/ ]* p9 ^- q
        $pay = new $code;4 G. @4 H6 Q, I
        $msg=$pay->respond();% g2 M# Y. p1 d9 `
        ShowMsg($msg, "javascript:;", 0, 3000);
( X  X1 g; {2 O- i% S: Z6 a0 t& w        exit();  
8 B  e! ?- b5 t    } else {0 Q& ~9 S' @- h# _6 d6 T0 Z
        exit('Error:File Type Can\'t Recognized!');
4 d# K( \  |# y    }7 r9 B/ k: I& U
}
" }  G- V  Z7 ~5 x9 t* m......
5 p* S- \3 c' s3 x* `8 |1 t0 e8 h 6 Y8 v/ q1 ^% H

( l( U2 S/ ]8 S4 V5 T ! U. _1 i0 d& E

3 Q7 @" J/ V2 k7 s 7 Q1 z  K" q$ j7 q: E! A$ L
" G4 g- W) F* U" _& N2 L$ ?7 s0 @
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。* U: r) K4 }; s
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
7 g/ r' A- U4 j; P9 {8 g8 d
- b$ V" G; H' ]: O, T回到include/common.inc.php来看看他的机制。7 G7 J6 e2 m* W' ?
( p' O$ X) C7 U) M
) J3 O2 M# \, g2 ~  u3 G: X/ y6 ^! B
4 G% y8 A# B% h  m+ {+ s9 F" U
....../ T/ F. O7 ^' |9 u  Z# T
foreach(Array('_GET','_POST','_COOKIE') as $_request)7 _& d' [9 ~' r0 \( p& c6 ~. O
{
) Y! u& e5 L( c4 n9 S        foreach($$_request as $_k => $_v) 9 b- B( H8 Q5 z) {2 `+ ~
        {% h( Z. C) I, i
                if($_k == 'nvarname') ${$_k} = $_v;" K0 b% ~! h$ ?! m6 }1 Q
                else ${$_k} = _RunMagicQuotes($_v);
! {" |8 y4 ^' W        }
- o& d" R  R& C, O9 K1 U1 p}
5 B4 r& [+ i5 L! u...... 0 k4 k3 k( W$ u  g% z4 c
大概在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。暴路径:; K! r/ d( D7 m* u. X2 P. @
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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