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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
% y" e# @) D2 L6 m
! Y2 o' l. Z# V. Z+ V0 d" d出现漏洞的两个文件为:$ n* L0 K/ [, s+ n5 W0 e/ L# i8 K. {5 u
Include/payment/alipay.php7 U6 A' l4 v& `: N- \7 j6 t$ }
Include/payment/yeepay.php; i0 @/ p4 ], o) Z" t
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
8 I" {/ B$ c: q/ u* Y
5 G* R9 q; [- s% D. C' b! `Include/payment/alipay.php$ e, Z$ T7 L; a7 P+ a+ l
' V3 K# s) }1 }, O0 I! r- }
......
4 Z4 S0 Y- i" O! P   function respond()) L0 r$ p3 i5 e) G
    {
; n0 r- z9 y' G8 r2 ?0 d        if (!empty($_POST))
7 F! c+ E. c' w0 c& U  b: y        {# e0 L3 L( s. w" r4 g2 l
            foreach($_POST as $key => $data)
; e7 e3 `& T% i) }, B" c4 x1 `+ O            {
- A3 n& r. v' v* Z4 W. k/ _# h                $_GET[$key] = $data;; T% K& y( N  _( _; K! Y+ t
            }
1 `; m% e3 A! |( b. Z        }
$ V& B1 h5 z+ q        /* 引入配置文件 */
6 {. E7 E: a; X2 W) p; M        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';1 H( n, J' g3 d* W' x
......
) {- [6 L/ n9 d# T% ]" g
+ L' }* ^# Y9 p8 v5 Q( {* N
* H; ]4 z7 Q0 Z大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
" V+ l0 M* |7 ?" G3 t' @1 d) H( x0 y9 W! d
Include/payment/yeepay.php
4 P  y  w, n9 {  `) B) ~0 T
* o$ J- K! [6 f  ~+ ] ) W+ m7 a$ }, G, t# n% w$ g
( A4 B! a. B8 B9 W& U
....../ k5 _/ ~& ?: o. k1 W% K+ o
    function respond()) x6 s- }, Q* m! I. H
    {6 s0 E  I  W  U2 ~' Y# u7 c
# l" Z# i7 S( v* J+ f& Z( X
        /* 引入配置文件 */
, h5 A" `6 G. d' [$ V1 {( |$ s        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';. S& P5 R) s! z& v% |/ Q0 N
; o; u2 p8 J" ]
        $p1_MerId = trim($payment['yp_account']);0 e7 N% h7 A! a" g* L
        $merchantKey = trim($payment['yp_key']);
/ o) V4 m+ W4 ^9 F...... 3 B: ?: W8 H, G3 l- X

0 g/ v9 p! D6 e8 N  a7 F* ^. J$ l$ B' f; r  r2 d

* i: }( H* x. n% V/ D
+ J: c3 d* b/ U: d2 S大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。: S: U5 _2 B) v4 B) O. r& Q2 V4 v# A
2 X$ E$ O1 E  D! {" }/ i' e) Q
这两个方法在plus/carbuyaction.php文件调用。
# k) ~: _6 _$ s/ R9 }: L& b3 j2 a: `% u9 U0 P2 L# p
plus/carbuyaction.php& M  |/ \; W7 x" p" Y+ P) C

. ~/ @! X: r: r4 X......6 o# D0 [7 y1 n& O' p3 X6 G( s: y/ h6 x0 Y
} else if ($dopost == 'return') {
* d6 o" c* d# \4 F3 G8 k9 z    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
- \  v8 b- |/ x    if (in_array($code, $write_list))$ G1 F5 m2 z, m0 f- f3 K
    {; q: W" r. o4 [% Z
        require_once DEDEINC.'/payment/'.$code.'.php';
' t* z. R6 L9 x0 m) `' I. ~: O        $pay = new $code;
+ J: h8 z1 Z( y) Y& U7 x        $msg=$pay->respond();
- Z( Z1 |) R/ P0 V. i        ShowMsg($msg, "javascript:;", 0, 3000);
* w: O3 u. x% X# V8 I6 Y0 h        exit();  # b8 w/ R! B  q+ B; Z9 @
    } else {1 ?) R5 [2 i4 {' _2 z2 A9 Q
        exit('Error:File Type Can\'t Recognized!');
( `. Q" I% f" k; k8 S    }
' f1 Y3 |1 w0 a/ E0 L" |$ Q}
) E3 q0 b+ F4 q. U......
2 N3 B# `' q3 n  d4 V( ^+ P
7 h( l2 f- A6 W. \$ d5 P! t- ^" Y. V3 [* i0 y% z' D" N

; `) T9 C  R1 f) k$ U' y* P" d' C! k1 o' w, X: t
$ v& g4 T! v( A* @1 k% [  j

4 o5 B; D/ _+ X) I: k0 z大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。# H: [- O- W5 b
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
/ e+ ]7 d7 h% n8 U3 P* r  R# U+ I' d1 R4 z, x  Z1 @
回到include/common.inc.php来看看他的机制。( S6 y/ @8 h* o" y$ f- R

! ~! q) q! ~5 o- t
6 `+ ?6 x" X5 ?: e$ y  ^, T6 I- M
; R7 {7 V$ Y0 O" R......7 O- P$ i2 X+ K
foreach(Array('_GET','_POST','_COOKIE') as $_request)
# `7 i2 _' C9 o- G! a: o{
" f+ e9 ]8 u' e: O3 B/ ^: U        foreach($$_request as $_k => $_v)
7 h3 S* {2 e8 P! C7 h9 J6 m) A        {* k0 s. {* A/ P9 o
                if($_k == 'nvarname') ${$_k} = $_v;# `8 u+ P1 T9 h& ?2 |2 ^6 m) [
                else ${$_k} = _RunMagicQuotes($_v);
1 j5 p$ C! }1 g0 A        }
; [8 b: ?8 P% @}
" w/ t" ?2 p* b3 T$ z...... 1 f7 {' ^. }: X8 y2 L. z, a
大概在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。暴路径:
/ I5 U% T; G5 q+ H" w5 l5 V- _7 a由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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