晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)/ u( {' ]6 u5 t; `6 m( H9 m: ^! o3 e
" ?7 |5 Q0 A) V1 H& c
出现漏洞的两个文件为:
# T c# p; v! `: e% bInclude/payment/alipay.php, z" S" g; }+ o& g# i
Include/payment/yeepay.php( |# [/ K @8 z2 R" ]
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
- B5 y! d" j1 B! J
8 |% E" e+ [9 e+ s$ u* X# {, kInclude/payment/alipay.php+ c G( V0 l! o1 {6 ?
# l, e- c6 T% Y V1 ^, g! r......
( S) s" ^8 X) n" j4 n# ^2 E function respond()
$ A7 v# J4 Y# O4 }7 a: V {
9 X- U( S/ D2 P$ L9 y( t if (!empty($_POST))
: H+ j/ W) f# P6 i5 `: Q {
: _; k" |% c8 ~2 d5 h2 M S+ ~ k& j foreach($_POST as $key => $data)
" H/ A) m3 {4 f W- ^7 d' r {
" P- e. R! s7 y2 b $_GET[$key] = $data;5 q; e. w! Q2 S, Q' N. n/ z$ i& E
}% n5 Y, \! [+ y7 H/ p) J* a
}" Q/ L6 n$ k- X) F3 x
/* 引入配置文件 */0 d; [2 b3 T5 j0 y; U0 h6 T
require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
% o+ Y% W/ X' h...... $ s: I% ^6 ] ]! G
6 ~( r, W. A3 r7 l
9 Q2 ` ]( U( t- F: N: z大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。7 s/ s% m7 | H3 w. e; \# T
0 M$ ~2 B. N5 ?8 Q7 C& b6 `; Y6 ~
Include/payment/yeepay.php; ~' P1 X4 E, y; l m; }0 B$ T
- E. A& r" c! p/ u) d- M6 ]" H
; o2 ^$ Z% I4 g. x. X6 r
6 k# `- @7 S; U2 K7 w$ r......( ~& b5 q0 k! g
function respond()
, Q% U5 d# C8 r! a& N+ {' p {$ e, v' e$ F8 C4 D' r
, T& O+ S0 {9 \7 _. S x! J
/* 引入配置文件 */
: v' N2 [2 E8 S0 {0 G require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
7 V/ Y3 y& t4 g9 L/ I
7 `" m# l7 u/ I; [& _4 I $p1_MerId = trim($payment['yp_account']);
0 D( H0 K. ?- e+ k2 [ $merchantKey = trim($payment['yp_key']);$ t( r7 l/ r% Q( D$ X0 ]# A
......
$ H: H' a' |! O y8 Y3 o
6 e- b5 S. h) K- G/ M# X6 Z6 L5 s: |$ @
* m0 b+ S5 y4 i: }) t' m% ] g4 D7 c. n- ^
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
% c2 f* Z, m5 ?! W; a: `" h1 j9 d- O7 O/ ]6 `
这两个方法在plus/carbuyaction.php文件调用。
, Q) G! O- c6 }3 ~' L" K
# p' }( G; b$ t# R) z9 Nplus/carbuyaction.php
0 V2 s" j/ r) C
: ^9 M+ ~( n3 x1 U3 M......0 r( j1 U+ G5 t( h+ X; C# _0 J0 d2 p: @
} else if ($dopost == 'return') {6 w; l4 ]: q5 w8 c8 D$ v9 z- l
$write_list = array('alipay', 'bank', 'cod', 'yeepay');
: n" C6 F6 j! J$ N if (in_array($code, $write_list))1 Q6 Y* Q0 g& U4 o( B4 ^( J
{
2 w! S9 n! y. k; i: J# D+ u require_once DEDEINC.'/payment/'.$code.'.php';
+ q: T8 k+ O: ~5 r5 c $pay = new $code;4 X3 c1 ?( h4 d( P7 M! K
$msg=$pay->respond();
B+ ]: {* Q* x! L7 T ShowMsg($msg, "javascript:;", 0, 3000);
! m" r+ D4 V9 z8 k8 I( S* x9 j exit(); ) ~+ `6 ?1 f0 ?8 V" ^) w! f
} else {; o- a. m0 l" C, e9 s' X1 {
exit('Error:File Type Can\'t Recognized!');
$ h$ ?# O# v( i7 b+ c6 p }% J& Z, {0 N6 a
}2 q! R0 c2 u0 z/ H+ H+ P @2 s$ W: d
......
. y5 q, t+ P& U- t: |8 L5 O) F7 q # s6 b- E2 I/ Q" [" g- q* H# s
" n/ }) e. h0 N* V* c' c
$ w; \6 b& G2 R% T) D
. m% w9 s5 O$ y# b/ Q0 t4 @ 9 Y0 P# R2 q7 X* S
6 a& ?! W, g! S, e" Q( r/ _大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
7 J7 V3 ~) \8 f& l+ j所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。3 E/ U2 e1 N7 H; F
7 L; e% a p8 W5 O1 I: @% ^回到include/common.inc.php来看看他的机制。3 r6 v4 I$ E1 f& h0 D. i& W
0 J4 ~5 k9 ?2 u( R0 p2 ^0 k; T
" O+ r0 y6 G4 i9 n0 Y
1 Y" m! Z& o4 s2 I, Q8 x7 @ T......
% L3 @+ G r L R3 Uforeach(Array('_GET','_POST','_COOKIE') as $_request)
4 ~# L2 y2 y6 Y3 X- S# D{/ L! M% z3 q1 \% h
foreach($$_request as $_k => $_v)
# x( i$ w/ Z y) Q+ \# ]7 l7 _ {3 N- G/ s0 R" W
if($_k == 'nvarname') ${$_k} = $_v;1 e) a) f$ X* ~
else ${$_k} = _RunMagicQuotes($_v);" w% q& a: ^9 e9 W& Z: c3 K
}, z2 ~/ N9 m% ~8 R* Q7 P
}
% W6 Y! m2 w* Q0 u...... 4 W0 e4 a5 T& r3 K: 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。暴路径:4 g+ W4 k$ n6 S6 Q, ^
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。 |