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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-4-4 17:25:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯): C# L" A" o, X
& g  M$ W, u% _1 W  B3 |
出现漏洞的两个文件为:" ]$ ?! o8 b2 n- F
Include/payment/alipay.php
$ h1 T8 u* d! b! B% |; G* oInclude/payment/yeepay.php
. T* z+ k$ z- m& D! m% ?% X漏洞均出现在respond方法里,估计这两个文件是临时工写的。4 E3 d" x: w7 m# V# P0 n4 P7 u1 i

( p2 E! E9 t9 ^9 x% n6 uInclude/payment/alipay.php
! _6 L! N" R+ {6 s
% c" R  D& ?+ K; J# G9 o0 _% n( L. u......$ a0 n. T1 Y8 X% c- z+ E. L
   function respond()
  _% h3 Z; x+ I    {
* S/ A2 v$ Z; x9 J) a" T        if (!empty($_POST))! e, P# A% g, T: D1 }0 w
        {
) q+ ]' R/ ]# A            foreach($_POST as $key => $data)5 `* [/ x, b' }+ l# ]0 K
            {
7 g2 v% Y6 A+ ^7 C5 p3 w                $_GET[$key] = $data;7 {4 t7 f: T8 g$ O, ]
            }
7 W- E4 Y' `7 [% h+ F, o" [( r, N5 o        }
) m! |' k4 y* z5 T* c        /* 引入配置文件 */
- m  G! y& E" o& D2 ?/ ]        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
% g( l5 @* h: \% Y/ v...... ( N7 \1 T( c7 f
. X: I% q" q$ T8 Z/ Q
4 \+ H# Y' o; h7 H+ U! k. \
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
4 s6 g; ?- p6 V! w2 f/ h. a& w) x' P" \; J8 k1 i- M) R. Q
Include/payment/yeepay.php
" Y! \) T) k0 Q5 ?% {$ G5 G1 [' l$ Q
! l, z9 m; i; e ( ?5 U* H( n# ?: \8 q: I) H
* Y5 A  O, w* @6 m, e# C+ @" ]
......7 i' g" u6 G5 L3 A# g% s  `% C) q! F
    function respond()+ F( H3 M( _# v  ~
    {
0 J$ D* ^3 t# H* g" ^8 F
) z6 u- x0 `4 `1 h1 W        /* 引入配置文件 */; i( D( m$ @' i$ C, N
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
5 i) _! M3 c6 m3 V6 l ) l1 ^3 u' x# S* O
        $p1_MerId = trim($payment['yp_account']);
5 c, a/ |1 K  s% s+ H        $merchantKey = trim($payment['yp_key']);
9 k; d+ V1 W. A......
) l, u# L" x4 a( l6 ^% m+ J + s- v- ~; j( X, ~: q  m* D2 c
; U" Q6 _! y. h/ J2 F
9 }4 w4 G5 v6 ~. r$ B
) P. q" W8 A5 V; x+ k
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
3 R- @6 x$ Y# N$ |! o$ m- d5 o! l: X# q
这两个方法在plus/carbuyaction.php文件调用。7 c0 S3 b3 Z# ]5 E. P& S
4 W3 Q3 ^" ^* c# i0 c$ L
plus/carbuyaction.php" K9 \1 G# Z" X: ~/ Y" y

2 N; ]- s; s3 a) N3 p* [) y......
. \1 M8 S4 R: _} else if ($dopost == 'return') {# [' q/ x" g0 v) H2 s' n0 M6 Z
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');+ ?. `" |/ i; z* P. w
    if (in_array($code, $write_list))- I+ ^5 u  G3 n, |) c
    {( w0 I0 v5 A& r/ |- y8 M, @
        require_once DEDEINC.'/payment/'.$code.'.php';% s) @% T' }3 q7 r$ w, ^
        $pay = new $code;, k  y2 t( ~* }6 n9 x
        $msg=$pay->respond();; j& Q$ `! U& \& v0 X3 Z# P
        ShowMsg($msg, "javascript:;", 0, 3000);
1 L! w2 p- w0 N+ f- M+ S; F        exit();  
9 L% F& D5 f% n: [& F    } else {3 x% z2 \5 k" O$ g) \4 Q
        exit('Error:File Type Can\'t Recognized!');
3 E# m6 g& D9 Z    }4 n4 o, v) u' n" h3 ^$ t* ]
}
  w9 V7 u) ~' S( {' P...... - D9 D' I1 r: R) \
7 F8 W( r4 E: m2 [% B4 h2 m' a! A

8 o& E) K' i* m1 X$ F7 d  e
' b! ^! \$ m+ j& e  o- N  J
( t7 h: a  g3 W/ F: r8 N& @  m 3 y, |5 N) O  a8 W! G

( p5 H/ V$ p( ?+ @* c大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
6 d4 y" J6 h3 A, x所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
  t$ c5 [! b. D( R
# c: W' p0 W# T6 ~+ N7 B- G7 G: J! b1 T) Y回到include/common.inc.php来看看他的机制。
! y) ?6 m6 B8 M* N/ U4 `3 g) s3 V6 j5 F
: W1 O9 m8 g1 a+ N' H- h6 | 7 H; }* `# w% r% [
; Q' g. M2 k: T: t/ d  ]
....../ \/ ?" n+ p, ~- ]& ]4 @
foreach(Array('_GET','_POST','_COOKIE') as $_request)- W( }  b7 w( w9 F. O- U
{0 q7 W2 \* }5 z8 i* N5 G& |: u
        foreach($$_request as $_k => $_v) 6 J4 g# G6 s9 T. b8 O
        {
( W' g+ S, Q2 [  I* Y' O                if($_k == 'nvarname') ${$_k} = $_v;
0 s* Y& W! o6 k! o& H* _( t                else ${$_k} = _RunMagicQuotes($_v);! Y, P+ ]  z# v- e) R2 p
        }
9 z( D, L- E& b+ s: ]+ b+ s6 N}
( L9 n' |( g8 y6 y- o8 t......
$ X+ C+ h, D+ V6 u大概在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。暴路径:! R6 k: v: z* [9 R. b" B2 l) M5 X
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
回复

使用道具 举报

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

本版积分规则

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