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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)3 M& v$ J7 t1 ^
4 H  Q0 x. G" h" S% ]. K
出现漏洞的两个文件为:
  s2 s! A& L1 J, b" e" P' G! i( jInclude/payment/alipay.php( J" D, T. E( |, i( W" F/ \9 H0 ^0 t
Include/payment/yeepay.php
) q& d" [6 e. ]+ {漏洞均出现在respond方法里,估计这两个文件是临时工写的。0 k$ O& U1 X! K+ N

9 Y! L; c3 l% H+ x. yInclude/payment/alipay.php
" J# E. O6 D& n3 m
+ O& h# W9 ^% N% S! P2 p......( y. o" o. y( C
   function respond()+ Y6 y9 }% {8 O2 I3 ]* l& J$ g% [( d
    {; q% b8 N! r7 E: `$ h
        if (!empty($_POST))
3 b2 \' X' [; @0 l1 ~% A8 O        {- O" n# `5 O: M, l4 x
            foreach($_POST as $key => $data)6 _- W, k: D# [/ A' D; _7 J
            {+ Z) U+ @/ t+ Y
                $_GET[$key] = $data;
4 x: Q* k0 P% T* P- A6 f3 n            }2 ?) b/ [; Y% k. {) G6 R% f
        }
# s7 H' M& v1 p1 A+ P! I        /* 引入配置文件 */
: H. [* f; u* s0 B4 b        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';# J# Q! a4 {1 f0 G! @
...... % s* R# M5 L- k* C5 M1 a  F0 P6 I
1 E- x; u% P6 r
- h8 ?" w4 e) M: }' j
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
4 P. {) u3 \2 v) {/ D+ x; I% x/ D. u9 \! _/ E7 J
Include/payment/yeepay.php. q! F) p5 t( H' g
  I! R) z1 V6 P

/ y$ [( U& K4 _1 T; x% r4 u8 n: m: d: Y/ z% L+ A% c
......9 f6 ]( |8 G* p
    function respond()2 v* K% ]; Y6 [' g5 C& \5 i1 l
    {$ B4 e/ y6 g) Q4 @' t

( R3 n# `& o+ |# s        /* 引入配置文件 */2 V3 K) Y9 _) N: S, h% Q
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';: ?8 P, x" H& }+ j+ u, N: F" r! \
( {# U% {4 g' P2 R% \; V% B5 G  L
        $p1_MerId = trim($payment['yp_account']);6 ~/ h( b! ~: s* x$ T8 W
        $merchantKey = trim($payment['yp_key']);" z2 L) S' }" w4 N0 ~, U" p. v
...... 3 _; {: g  ^0 N: l0 p

; U6 g; W/ S) ]4 u9 ~# n+ V4 x
  [* a5 B- Y- h% Z9 q
* W+ ?, |+ S+ u
) t( ^/ f3 ]- C$ n8 q2 I2 M大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
; a3 _# x5 A% |& V% r$ f3 |% U% e: W7 ~. ~6 z7 j: i
这两个方法在plus/carbuyaction.php文件调用。- |+ e. M7 }3 k: V8 `+ Q# j

, Z. ?& u! Q$ ^9 S+ [9 D0 F9 Aplus/carbuyaction.php
6 S' T2 p; d, @" _
$ W7 G& b0 O0 c* r/ P* K......
2 ~0 d4 V( X; Y- }' H/ ]/ y} else if ($dopost == 'return') {
" x# Z8 p; M5 a: R5 E    $write_list = array('alipay', 'bank', 'cod', 'yeepay');, Z8 Q* q& U) t
    if (in_array($code, $write_list))
) _, c" i6 F7 t8 D! D    {
: J6 q3 a" }6 x8 H" w        require_once DEDEINC.'/payment/'.$code.'.php';0 w4 P9 [6 k" Q6 b
        $pay = new $code;3 p1 T' `. |: l- S& b1 y( p
        $msg=$pay->respond();- j2 W* }# n3 t8 o
        ShowMsg($msg, "javascript:;", 0, 3000);' B4 `6 P( Q1 \3 V% J/ o! u* p
        exit();  4 d' Y3 K: P# H
    } else {$ l; b8 L( J) b0 X7 T0 B! Q
        exit('Error:File Type Can\'t Recognized!');
9 f6 [9 }7 C8 B- N1 _0 w# x" n! @    }
7 ^8 d" S7 I4 B* }( c7 h3 y}
. c; \8 k& q; B* \6 a$ E, [8 C......
# R0 k  K$ e% E+ y. _/ E# p 2 F2 W1 `& M) y/ Y
' ]3 V$ }) @$ I  n# F" J8 g& ^- d) \

: g5 s% q6 K4 U5 K9 S6 O- R
. e/ m& T* [: E5 S# \ 3 S& Y$ O2 m( \7 A& f

5 ?+ S) ~) ^' P3 f& N( N大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
3 j  C0 @) N+ ~" p5 V( v所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
2 t8 Y2 e! r* S# S) U4 \& G- W% X+ r/ i# m" y
回到include/common.inc.php来看看他的机制。
/ p4 J5 S' D  ^! z6 c* o( V9 W( X% \7 Y

2 G, a0 d9 M% b( m/ _) Q( F2 o5 B  s" y. A. _1 i8 J( h
......
$ h, T3 h- d$ m+ E+ H; Zforeach(Array('_GET','_POST','_COOKIE') as $_request)' |9 `7 C( k, C% D# L8 i! i( N
{+ {( o* x- _7 L$ U
        foreach($$_request as $_k => $_v) " k& M( Y/ J* v8 j6 Z: H
        {0 V' X) ]9 m2 Z3 y
                if($_k == 'nvarname') ${$_k} = $_v;
6 T( P5 I* m3 C8 s% l2 r! C/ H9 c5 s                else ${$_k} = _RunMagicQuotes($_v);
! r8 n: A4 H2 R9 a& |' {        }& {2 }. }$ H9 f! e4 n' Z! y- w
}
) i, i' S: Q2 f' D1 T0 i7 u......
# j+ D7 k; M5 ^8 Q* Y9 `大概在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。暴路径:1 ]3 t& j  Q! p& K
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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