晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
' E2 C4 a) K4 j, ?$ b3 J6 Q. G
9 T6 D0 ]4 D5 v' f' Q出现漏洞的两个文件为:
9 A4 I3 A& `9 F. E7 WInclude/payment/alipay.php
; Q" `2 T) K2 b0 ^6 o* ^Include/payment/yeepay.php# J {( W" N( G! R6 u" f. u% {, V& _
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
& i; n& L4 a; t* a
% z/ ]/ w/ {# L: P$ n; K. k$ \Include/payment/alipay.php
4 w! ]: ?" \. N5 J1 f# }, \% [8 q0 N1 L$ ?
...... O3 b2 I3 X* C; w, E
function respond()/ S5 J7 k: u& B5 E
{1 Y4 y- r$ `, `7 m, L N- }8 A- B
if (!empty($_POST)). a& W$ f1 r" w8 t* ^8 x' _* D
{3 N- x+ e" a" W" G
foreach($_POST as $key => $data)' P* q! a8 N$ q b+ n
{
( K: U( D, }: ?" i $_GET[$key] = $data;. C# u% [9 k" m! B
}
+ l- c# ~6 @# c6 S3 h4 M }
$ g& h" u& `- r6 l4 O- J% P2 E /* 引入配置文件 */
0 C0 Y( E& S$ ]" t+ E, g require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
! p0 u0 f$ }9 n: O......
5 C5 N- V, t4 E* h. n' r - c" l' m# m/ V* p0 n1 S5 ~- _
7 @" T a. B. o3 I, F
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。* n j; H& G( n$ h; o$ @
4 y4 Y8 x4 j1 k1 I7 h; `' zInclude/payment/yeepay.php% [6 F/ D/ \, a* C
3 s' V" r9 y5 I9 l* p' X' o
& W Z. @3 U9 L* }- R& u
3 k/ C5 ?" `9 l8 [! @......
9 o1 B R2 U, `6 I& |" k0 D2 J3 ? function respond()
/ k1 N5 h& J2 H5 e {4 u1 C6 }3 [1 W; L# H3 z
1 i' G8 Z% L4 M. A! F3 F
/* 引入配置文件 */' U, v: G6 a- U7 ^6 N5 k
require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';, h, [% }5 }: V
, K5 K9 V: u y" s8 i' T1 c" ^ $p1_MerId = trim($payment['yp_account']);
: r% Q- u% {2 I* E $merchantKey = trim($payment['yp_key']); l' i) F) C9 a/ R
...... 9 _ Y! F) o* D: q! Y7 u1 M% S" s
$ ], U3 ~. b8 ~; ^
2 o+ U6 W6 q# ~4 k4 q2 k
9 _# q/ D" u( n; P- [' c2 `, ?- G; W& p5 }8 }5 o- D w5 J6 o
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。) w3 F: C7 J$ f7 N. W6 l4 O
5 s5 K6 \- L9 U `4 A这两个方法在plus/carbuyaction.php文件调用。
- Q1 L3 z" L8 l0 k* `% E F( b3 u/ ^2 r
plus/carbuyaction.php8 h! D' }' K* O+ _+ `' B. t% T
, X3 G5 k# k- ?# X( E7 k. m......0 m- {# C/ Y% q7 J; Z2 E- x. S
} else if ($dopost == 'return') {
: a3 w- X, ~5 b5 [ c% c+ u( B $write_list = array('alipay', 'bank', 'cod', 'yeepay');, f4 e, Q) j, N# i. [" Q7 r
if (in_array($code, $write_list))
4 x" X& K; O7 }8 y D1 i {
- v5 q9 e1 d4 j: d0 U$ M2 ] require_once DEDEINC.'/payment/'.$code.'.php';. x7 r: M/ Z& D7 M8 S3 b- s% z* X
$pay = new $code;) G$ y4 K7 G1 t4 {
$msg=$pay->respond();
' d; {) X0 c5 E8 C2 {; X0 o/ ] ShowMsg($msg, "javascript:;", 0, 3000);
3 q8 s7 M9 C- Y+ T3 X& d% o4 G exit();
: z9 l: s7 z" C- j9 U! E } else {
9 c- c4 f o. b% }# v: _- s/ B! M. { exit('Error:File Type Can\'t Recognized!');
1 J: i7 b! Q- | }
4 R u1 i0 Y% n+ d}
7 e: Z; v$ D" i( H) ~ K9 l5 {2 g...... 1 X# ?7 B9 S3 A' F7 g7 x2 w
0 P9 ~+ H/ h8 S7 K
. y! Q$ _7 C: C4 ^
* T/ R: \5 O. S+ z! @) Z; F. H
3 Q) Q) A: H: D1 Q 4 D- k0 {$ y5 e$ p) y, n6 W- Y
2 v8 R0 i7 h* F2 k: U大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
5 M& d7 w# N' h4 { R所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。# w' d0 q4 b3 x% S
" D& S. d" E5 w6 E `回到include/common.inc.php来看看他的机制。
5 @$ d3 C& M6 W) ]0 c4 Q7 }" g, i. u) J9 C' R
5 }" u* A# I1 y0 E X0 T
% [% y5 x/ v9 o9 ]4 y
......% a8 j8 M4 g6 S$ J* T1 j( Y
foreach(Array('_GET','_POST','_COOKIE') as $_request). B! q' F5 r1 H e* \
{
- r8 C8 Q. F4 { foreach($$_request as $_k => $_v) 4 ?) I5 \5 B( Y/ @' |
{
" c6 V( G8 R* C& z5 H3 I+ v7 I. V if($_k == 'nvarname') ${$_k} = $_v;8 Z$ p- U$ _4 |8 j* ^ L$ Q4 s/ a
else ${$_k} = _RunMagicQuotes($_v);6 B% \% _( ^7 e6 N: ~
}" x1 l" X5 C0 I3 ^( V
}
: D, s% r) Q8 M& V; P7 |6 {7 J......
L7 a6 c0 L% Q( z! v( s" ]& P# j9 m( C大概在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。暴路径:
* ^7 u& _. J, m% X: D9 D3 O由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。 |