中国网络渗透测试联盟
标题:
dedecms本地文件包含及物理路径泄露0day
[打印本页]
作者:
admin
时间:
2013-4-4 17:25
标题:
dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
" O( j! @% N/ e5 U6 Z' r2 {% t6 |$ T
6 J: u& V9 [, h2 { n( l& n. P7 K
出现漏洞的两个文件为:
& J% _% X" {" a0 S' v% w3 `. \
Include/payment/alipay.php
* q; |* w) m% J" o! ^
Include/payment/yeepay.php
1 o$ J3 f" H0 ^( ]3 ~' {
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
7 `# j1 ^- h8 P' o ?) X
9 n/ w3 D$ m0 Q9 Z* R# p+ e
Include/payment/alipay.php
2 b/ P- k: v0 G; n1 o9 K# x; [! _
4 ~/ t, D( s o- j
......
! e. l* A' P6 O* N5 L
function respond()
. M0 u+ ~+ T% S
{
. K, A# A" ^. c
if (!empty($_POST))
/ L7 ]* V/ p# H0 Y# G( @' A
{
* r2 Q' e/ J: |: R
foreach($_POST as $key => $data)
6 W$ G1 @ t! [# c. S- j
{
1 E9 _ U: R- i$ u @
$_GET[$key] = $data;
% H' ~4 I1 }8 _" p7 h
}
) Q' J7 U/ u q7 I4 P1 I3 I* ?# c7 Q) B
}
. M# k. g8 c s( s6 h; y$ h
/* 引入配置文件 */
8 i; G' i. W- m3 [2 m& p# G
require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
0 d" t/ A1 a' n: V
......
7 g- x7 h9 f. V" t+ u
; Y4 t4 W$ a! ^7 ~4 J$ r2 h
% E7 }3 M- n% ~) G1 T
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
I( t6 ` |5 N! j! j0 u H
0 w# C: M; |1 v
Include/payment/yeepay.php
' R$ A' K% h) P' C, f7 }
0 B9 d3 m. t o! g- O7 ~9 |. R" t
3 {) x: g9 X: T4 F8 g1 q0 R6 c/ K
+ H T' t7 L3 B' \3 D% q2 |; f% B
......
8 A# s1 g' [9 V( I7 k
function respond()
v) h6 R8 P, L+ W2 s7 H* o
{
K0 A! g' v# Y
$ J: c5 n+ F- `' n1 E% E
/* 引入配置文件 */
5 G/ S" w) J$ n& R# `( j2 b! f
require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
+ c) H, S" P: {9 O! t! s7 j. M& Y* m D
# f6 k# }. @) V+ I
$p1_MerId = trim($payment['yp_account']);
- v- a0 I. o5 b) `" \. @. A/ l
$merchantKey = trim($payment['yp_key']);
! o2 X5 H7 i1 A! n. V
......
/ G) L8 z: F' q, f- U
* m, }% d+ g$ m% N
# g) ]0 q! ?7 Z
) H7 s' N# d$ x; d# z* a. W; B
i1 t0 _( d- u7 e
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
2 x+ j; n, j: p- d
- S* h- j- e8 k- R- c* b$ L" p' A
这两个方法在plus/carbuyaction.php文件调用。
7 P: O. l+ q: K, ?! }( W
' |9 Q3 @; N5 l/ z" ^2 V( T
plus/carbuyaction.php
% w! h7 C' ?2 ?/ I- E( `8 y
4 d3 ]5 ?: g" O
......
$ _7 u- g) M( C P$ u
} else if ($dopost == 'return') {
C( a; {3 f; [& Q7 L
$write_list = array('alipay', 'bank', 'cod', 'yeepay');
. M$ @" o$ D4 c3 q
if (in_array($code, $write_list))
: E+ q' l; x6 M) B7 G7 Q
{
" [! |: y' e" j# e& [0 G$ I
require_once DEDEINC.'/payment/'.$code.'.php';
t* M" y% i7 t- v. h7 e* d
$pay = new $code;
' K- {$ h. R) ], r9 E
$msg=$pay->respond();
, I0 d# D8 F- V8 t8 U# n1 o7 i- u
ShowMsg($msg, "javascript:;", 0, 3000);
& s) y3 A/ Z' L c
exit();
- L2 ~# z+ {/ k0 J' G, R$ N
} else {
$ F! x2 I" K+ \& D; p, |
exit('Error:File Type Can\'t Recognized!');
) O: m) g. g: L/ d8 M4 n! ]1 G
}
3 E3 _7 r( v" o/ L
}
8 a2 c" {1 `( Q3 R. d, U. ?
......
0 P3 d, F- T) H1 w1 _$ y1 c
( t! J4 R. x6 u+ a4 {
u8 s3 q- b. f
! J( O% _: X2 g9 m" G# @
# [( x6 n$ L% g0 Q) n
# G6 Y9 `" k: {# j% w4 M
7 m( z! [; o& m% V( j" B! D/ A
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
' D5 n p. w+ q/ q$ f8 q
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
+ ~' v3 _2 @+ B) I+ @7 z, B
/ S9 `/ g/ k1 i& Z1 k% P
回到include/common.inc.php来看看他的机制。
+ t5 b! Y- E5 h+ M
: J' \9 M3 U- U3 A1 R1 @0 [7 p
" n) R* H7 \2 U. ~8 j( R* R
: ]' @( L2 M2 l/ k; k1 U5 P: s1 @
......
& a8 e/ P0 }% U5 r$ w* o
foreach(Array('_GET','_POST','_COOKIE') as $_request)
: ?: a9 M. k6 l+ _# ?% w, y
{
8 x) x% G" b/ y }
foreach($$_request as $_k => $_v)
( S; y$ r: f& h7 @
{
2 L7 u; i/ k6 D* \6 t/ R9 X
if($_k == 'nvarname') ${$_k} = $_v;
7 U# [1 G, [1 X; c# ?( ]: W
else ${$_k} = _RunMagicQuotes($_v);
6 s+ \0 G/ Q9 Y
}
1 U: p- c' ]5 S/ [( i+ X( _/ m
}
% d- Q% G+ U: t$ d% i4 j
......
& m0 p) ~6 W3 Y5 g! S" b0 @/ O
大概在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。暴路径:
& A* G( V0 _2 o& [8 n s! W
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2