晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
' f) O% ~+ U+ ~# d+ P- ~/ A3 _8 w7 \) p0 U4 g: x7 U3 X1 }1 I+ {& o$ {
出现漏洞的两个文件为:
* o$ k+ l h) x: [! AInclude/payment/alipay.php, J4 ~+ _# Q: E1 j$ F& [4 e, `
Include/payment/yeepay.php" `5 g ~% P+ a2 t
漏洞均出现在respond方法里,估计这两个文件是临时工写的。; V* T0 U3 w5 }% Q% p) m: K
8 M0 @: @6 v \& B+ z5 c/ `8 @Include/payment/alipay.php5 R3 K* y7 @% e N6 I3 ~
, w* Y# Z$ P$ S% m9 G5 n% }* u......# Y3 m6 ~' E |" v5 O2 ^6 A
function respond()
& \- f. x& z2 w/ y7 Z) B. G) v2 B& u {- }. U1 E( E8 v+ C: I
if (!empty($_POST))( J' g1 t# X5 v9 U3 X, p# X
{4 f% ]1 W1 G" P! u1 J' V! v4 s' A1 Z
foreach($_POST as $key => $data)
9 b4 a5 j/ P. K( A* o7 S6 N" K {
5 ~# x2 ?" i7 v $_GET[$key] = $data;$ `5 x# g0 D5 G
}
. c6 q7 a) ^2 y, U4 [ P }
& R/ J6 K c5 U: J- X. Y /* 引入配置文件 */- i* L' A1 l5 e" A( b3 D4 {: K
require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
% q8 A+ L, @* B7 k$ b* h8 H...... {3 q4 p( R& ] V. S+ _3 e( K" r1 V. l
9 \; N6 ]& Q+ L
$ ]$ G. `3 W; t9 A( \- D, h
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。" A3 v8 Y0 i+ H Y
$ ^& Z( G0 v8 L+ d$ J: q% L
Include/payment/yeepay.php6 i0 }6 B! ?) v7 Q
, _$ F- Q( T( [: l : m1 A. @+ K7 F, n
! W; F7 W$ x4 {......
7 d0 f+ B7 y; k \) u* y/ a: l function respond()
9 B& d1 z6 ?5 l3 v: I6 `1 G$ v {
n8 I- g0 y; t$ @, l( ?- i3 H
* A1 m2 C) d4 D9 S2 y /* 引入配置文件 */
$ Z2 H# p6 ?2 r' G6 C9 @ require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';9 y% p& t a9 x& F" X0 Y
% z3 C' Q5 R6 s0 O$ p" m9 `+ c
$p1_MerId = trim($payment['yp_account']); L& |) W3 m- l7 E
$merchantKey = trim($payment['yp_key']);' a, s# P/ v6 [) M( M
...... ! I3 H( z& v# n; W
( e( ?# U& z; E5 D$ U) `. c v" k2 z; L) x, R3 [: p7 `
' i5 `) }: h! L+ d0 Q: n; f9 u: n
/ C0 c& D5 ?" m; |0 H
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。) ~- H1 y' O0 V5 F3 {" K, r$ B
, ]% h& ^ j4 R这两个方法在plus/carbuyaction.php文件调用。4 _3 V7 }3 _6 t; N, n$ y
! R6 Y9 q& v3 S. X9 f# Yplus/carbuyaction.php/ v: r4 G8 f: T! |" l
! V$ z* ~) R3 J- b, x6 E......
) s% S5 {2 T' w) ?5 s! `5 W; L' l) w} else if ($dopost == 'return') {4 N; @( K1 q4 o+ n* q; L: `
$write_list = array('alipay', 'bank', 'cod', 'yeepay');/ b8 t" O# T6 u# [3 M2 b
if (in_array($code, $write_list))+ V0 q& i0 Y) l; g- z
{% P) w0 }+ A3 E/ C% V4 @
require_once DEDEINC.'/payment/'.$code.'.php';& j' ^/ x% C+ Y# Y' r5 i
$pay = new $code;- R0 _9 ~; S2 T+ `
$msg=$pay->respond();8 [. J V. x6 F
ShowMsg($msg, "javascript:;", 0, 3000);
v( ]+ g5 N: ?+ F2 b exit(); 0 s5 l( s L4 a
} else {
+ ?& J/ S) N6 R) T( @4 a0 m+ e exit('Error:File Type Can\'t Recognized!');
- N5 o5 } M& V9 D m* h. N6 _ }
0 R! Y/ j2 b0 ^% w5 \}
% @5 x/ o2 a% o) r......
! J; O7 j2 `+ ]) y
! ^- Z8 L- M/ f: z, ^" b+ b, @* n7 B1 y; g" X6 C2 m
0 b- u: I) M7 p5 m6 r" ?5 F
& Q+ g$ j8 `3 d
, Q' }2 u r s/ [ Y
4 g8 G; o( o; ~! J, u1 V" C' @" E
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。/ h9 F* c, I; s# E7 y7 T/ w
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。( [0 R" H7 B1 F+ U
# r" o2 T7 D6 |) |5 k, m- `
回到include/common.inc.php来看看他的机制。
$ R9 M5 a i: f
1 O& g8 g" s) c; o/ r - t4 K6 p& X! `0 m8 ?$ q) Q( C
" x: O, O2 v+ H6 t4 ?9 g....../ z$ v; K! N. i# K
foreach(Array('_GET','_POST','_COOKIE') as $_request)2 M& r7 b/ A5 a2 a9 B
{" D9 y. m; F# ~" `7 p* m
foreach($$_request as $_k => $_v)
9 B6 ?! j6 q' w* D3 z( z {
) [$ k9 s; J! E _& f- N$ N \8 o if($_k == 'nvarname') ${$_k} = $_v;
$ A$ P q1 ~$ N, U+ U" j, F$ V else ${$_k} = _RunMagicQuotes($_v);1 e( Q/ e! l0 }6 \
}
, b5 O/ V q2 i1 A}$ e ^( f0 Z8 x* }
......
3 i! G* Y$ L/ ~1 G+ W2 d R大概在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。暴路径:
5 B7 w, @# K& O/ x8 {4 A# M由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。 |