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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯); }% V9 c8 g* N& Y* h
) g" e# B6 f3 i- w. L
出现漏洞的两个文件为:- H3 M5 P- I- R3 `8 K9 a9 y- @
Include/payment/alipay.php
' D! G* O1 x+ y$ R. LInclude/payment/yeepay.php
# S7 U3 l1 }+ L, ^9 D* \6 q# m漏洞均出现在respond方法里,估计这两个文件是临时工写的。
+ [+ j! S: W+ z1 |# V: @! ~  o0 F2 o# f) U. k" E
Include/payment/alipay.php# V6 Z4 \3 K* U2 }$ \7 h

, Y1 h" E6 W4 o7 [. U, |# g......% b: J7 s: w6 z4 n- B6 A: J
   function respond()% W$ Y# h: t! K& l6 V* q* r
    {
3 Q& ^/ P1 O5 b9 h& Y        if (!empty($_POST))+ m- ^) w9 r: I& P$ K9 T) K! `
        {& h: v2 v5 C: e% a  c7 X2 E3 _
            foreach($_POST as $key => $data)4 @* D- t* E* g7 ]6 _" K
            {
+ c/ a7 M( E$ t                $_GET[$key] = $data;
6 S" _4 M+ O6 W            }
! R) x0 J" Y9 U/ q! i        }
7 N2 A5 r6 x& D# }; p2 U1 i        /* 引入配置文件 */
/ H$ }: X- K  V: V        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
7 L6 Y. f- b/ x9 k  f9 W...... + q) R  c" b' [  T. O' z" L0 S

% A* G0 Z4 S! I: n3 q# Z9 Y* w/ N8 a& L* g
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。) j1 ]0 P6 X) w; _& j5 m
: I" V' E7 }' w/ x( N: b" m
Include/payment/yeepay.php5 q& [7 s* D! V# i9 t

3 d! b0 l. P; {# p7 }* |3 u+ r 8 v3 X2 Q! R4 l  P
" H& w' T" A+ p/ J- L
......
4 w, u% A( b2 Q8 U3 Z    function respond()
+ \" @% @5 t  O5 X) w    {
. x) L( m% W% }4 m/ ]1 z7 N ( Q% B; ]1 h6 ?# @
        /* 引入配置文件 */! b* K" W4 [5 U$ e5 R) N
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';5 i) Y+ e3 Q' X* `- @  V

" Y1 i8 v1 R( U. L) R6 F        $p1_MerId = trim($payment['yp_account']);5 B/ K% b+ K9 I* S+ s4 g
        $merchantKey = trim($payment['yp_key']);
( \+ ]9 J: t9 \/ E" E* L7 a1 f......
) \7 ]" |. W+ k 5 p3 E" }) O" V$ K* K

1 v9 Y& D/ t; k, U6 F1 `/ \9 S3 ? # \4 i5 F% N; j0 F7 v

. ?( l( I! e9 s8 l# s$ C大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
5 Y' L) t6 g# s, g0 H% q
+ h/ t( V' f; B7 {) \1 |这两个方法在plus/carbuyaction.php文件调用。# f# X% z) `" \6 `/ [" n$ Y
9 ]5 V, d; ?5 k7 v' T9 H* f0 v+ O* ^
plus/carbuyaction.php- V( `/ h6 R* f6 e$ \
; E$ y8 `- ~8 n) A
......
% q. E: ~" G6 P) M& J% `} else if ($dopost == 'return') {; k) c( c; `: l8 n
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');* U- d: A9 f4 G6 u
    if (in_array($code, $write_list))& F1 g+ X% w* S' ]
    {- ~# k0 `) x3 A. |
        require_once DEDEINC.'/payment/'.$code.'.php';
# h/ h9 O' i% q9 e* y" @3 D        $pay = new $code;
0 D: _8 o; v9 Y: a: A( |- E        $msg=$pay->respond();; R' ?% ]6 T+ q2 a
        ShowMsg($msg, "javascript:;", 0, 3000);
( @8 z3 ~+ w' ^+ J; ^$ v1 f  U3 a        exit();  
0 A% x2 y9 r" C9 [3 W2 r( W    } else {
9 A9 k. \, u$ k% x8 ?: d        exit('Error:File Type Can\'t Recognized!');& ~+ H& q$ f3 }: A
    }
2 M9 f4 [# W/ e& S- Y. n}
2 G5 x9 q' c. p4 Y& a+ q" w...... " e7 ]* y3 K2 {

4 r+ Z0 B- M* v( E  P0 y0 I0 T/ |0 _- d) S+ ?# s9 }9 R
' z0 x. x# l3 i9 \% @

: l  |1 F7 |5 h: ?: O& I   x3 \; I$ P3 q, C1 q4 C

6 X) M9 V+ s0 f: P0 l( n; ?大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。( z0 D+ m4 w* Y& s
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
1 l. \% `1 |' V: w4 A+ y4 y- q; ~; S" \: s# G
回到include/common.inc.php来看看他的机制。
3 s7 Q7 d3 M5 _( t* S& B  d& U0 V) }

, g" t2 o! ?3 h# o6 g. e( z' O$ ^' f/ B& f% x1 ]
......# q3 f$ k" U/ i6 \
foreach(Array('_GET','_POST','_COOKIE') as $_request): g" O5 N, x7 |
{0 [0 z$ S; D4 `
        foreach($$_request as $_k => $_v)
8 O  u. D7 K. G# D& k3 K! J( Y        {1 ?8 Y$ n' B" T0 }- {# i; U$ H4 V
                if($_k == 'nvarname') ${$_k} = $_v;
4 ?) n9 P2 [. b; j) x9 f2 b5 W! X* I                else ${$_k} = _RunMagicQuotes($_v);- ~& n: ]$ q: U2 D3 q# X
        }
! W* |1 [9 L3 h) k' o}
1 N1 m6 ]0 g/ L......
5 f5 b, l4 _, R大概在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 L& V  b& B" m6 Z: h由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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