晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
5 O) j0 h! `* Y+ ~$ V$ @; D0 ?% i
& H& E' [( ]% K+ w" g; B! R; a2 d6 j出现漏洞的两个文件为:6 Q8 {9 s# A9 V( G N3 I
Include/payment/alipay.php( ~: m- V4 m$ G D' J
Include/payment/yeepay.php
2 f0 `1 c/ x8 i8 A0 C漏洞均出现在respond方法里,估计这两个文件是临时工写的。$ z6 M4 V( g3 [% s; G- c7 A! J1 |
$ `0 B7 Y& P# ?7 T; x2 s, R
Include/payment/alipay.php
8 Z F# ^ M3 c1 |: d f. g7 \
. k }5 c8 R1 V7 J" G% [......& y m1 N/ R$ L) O$ j
function respond()9 a! R' R5 b5 H/ u# x& G
{3 s& U5 M8 Z# ~$ W! {+ M* ^7 [
if (!empty($_POST))8 ^4 w* d: h4 _6 a( F
{
6 |. ~6 L# n3 I X/ s6 O' C8 P% Y foreach($_POST as $key => $data)9 X3 [0 g3 w+ y/ T/ x/ n- I; j r) s
{. w9 a6 ^6 ~- Z: r r" r
$_GET[$key] = $data;
" h4 O4 Y; b+ Y/ O# T1 H" J }
0 W3 c" o6 z/ ?# z }
6 ]5 R4 |$ |/ `0 _6 r7 F: V0 e /* 引入配置文件 */! ^ s: |, \4 Y. W0 h) P
require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
- V- I* s4 |1 Z% E...... 8 }4 c& Q* l+ P! C, u! f) B1 P, C
! v# @: \6 q0 R3 q) f5 m; f
: ]7 A! k. `. v: e; s' `) I' h
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。' Z' U) b5 x. h$ h; h3 m! J
5 B8 k6 g, L5 d; T s! `* F
Include/payment/yeepay.php
5 J/ T1 k8 e! L% P' n5 Y7 m3 t% |' T7 r" r- Z | [* B9 J5 h
! ^" S# L5 z; ^5 g/ M- e8 X
; v- }. {4 A+ M3 W' w$ S......
2 A; q% h4 i, e: P" i9 d& C3 T function respond(). x6 X# S% D+ V+ N2 U+ w" |
{) [5 z( h& R3 x+ z! b
: K' Q$ Z0 Q- P% C$ C3 B7 D /* 引入配置文件 */
|& _; `, O. f* w; N require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';1 Y1 a! J e/ ]: w8 y
% {- E0 T* }- t8 _7 O
$p1_MerId = trim($payment['yp_account']);
A. @1 x9 ~3 Q8 o9 H; S& H# \ $merchantKey = trim($payment['yp_key']);
: z/ p# ]6 [/ i......
9 F& `- Q4 p0 X2 ?8 C$ p O 8 s: o1 V F" f4 E* |0 @) s' I
2 {6 z& u+ h! F0 v3 \
n2 |/ O/ ^( z) A
# ?, C0 G1 C4 S5 |8 T2 b大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
. q& Q& }' s' q# _) h3 @: w4 O. w1 A% E- D
这两个方法在plus/carbuyaction.php文件调用。/ B+ _+ _0 G. F# Q+ H0 Q0 j7 ?
1 W+ R- `2 z; i2 r; P2 }4 P
plus/carbuyaction.php5 L" A+ x3 r0 }+ ~: Q) {" m
; {0 X' d" I4 Z+ t& F* M: b
......
" w9 {. @# p# ?3 Y} else if ($dopost == 'return') {2 F5 \ }" O' P8 c8 b) w7 q
$write_list = array('alipay', 'bank', 'cod', 'yeepay');
1 t' u: o7 V' L! n/ _0 ]8 c if (in_array($code, $write_list))
1 ?) J4 V' N& g2 @ D9 y0 k% i {
m0 m( J( |$ ?; k require_once DEDEINC.'/payment/'.$code.'.php';- t9 j* |( ?- _( d$ D
$pay = new $code;
8 `; ~- X2 T+ m7 M- F $msg=$pay->respond();4 R$ W8 d$ r$ j
ShowMsg($msg, "javascript:;", 0, 3000);
3 W6 O! ?) O+ ^/ l exit(); ) U8 p9 `" Q8 n
} else {5 j) o+ P2 k/ D; A1 M& S
exit('Error:File Type Can\'t Recognized!');
) u, m. u9 X( O5 q. u" s }5 O2 l2 Y: @/ n; V% O: h' i
}' `3 z# v* f/ o4 |% T
...... * S8 j; b6 d' K8 a' Z, l5 z
( m! C" m5 [0 i; r2 o3 [ a
" g; i& Q4 F& A9 g1 U
1 N F5 d) p8 t' a: H: [' ?' _0 l+ U3 K# h- d3 C; d
6 N5 W2 M. y; z, B3 P+ r1 O/ k5 U; P3 O
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。2 Y$ j ?& V& H/ i2 q. A4 |" {
所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
3 z% ^7 O" N5 A2 [
. h s& r0 O4 X回到include/common.inc.php来看看他的机制。# j- s' Y2 A$ l: F
6 u5 f1 @& v4 Y* I8 ~4 f) C
! A. S }) d! V
/ r2 o& j* X. ?1 p
......& S3 B# P' A' |; C
foreach(Array('_GET','_POST','_COOKIE') as $_request), y# W! _. l1 _& _4 f! d. s% [$ B
{; x7 A6 Y2 Y: z; t- r# r
foreach($$_request as $_k => $_v)
2 O& e& [8 v' d* k3 ~& P, U {
8 g: u( e; e) K6 G if($_k == 'nvarname') ${$_k} = $_v;, Q; z" e& B/ O0 R4 e/ K
else ${$_k} = _RunMagicQuotes($_v);+ t' Q, K6 C u- m
}) a$ ?0 [+ W8 Z( B, A9 o
}
( m, p# s, L' t% a......
8 I3 E4 R. O E5 W( A K) _+ v- ~大概在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。暴路径:* Q" ^5 I/ L2 _5 G* o7 N
由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。 |