晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)& \1 `% W* B. [3 u
: @7 o( _% p9 F7 f0 G2 r出现漏洞的两个文件为:' w# V2 S6 q" w. l% A) u3 Z
Include/payment/alipay.php0 j+ g4 x- l1 o7 k' s y
Include/payment/yeepay.php
3 U+ s5 w. Q2 D8 ]漏洞均出现在respond方法里,估计这两个文件是临时工写的。. I$ z% L8 @, S) B: J/ g5 ^
! l, V8 a0 G* a( g8 WInclude/payment/alipay.php
' D" u) e; I0 q9 y
# Q5 h1 k$ P3 P, t9 {* }......
+ F( X, |/ V+ m function respond()
K! k: ]0 t( I# @( ~$ |6 e {3 T& p, b9 A: O% w7 a, e
if (!empty($_POST))7 k3 [: Y% U$ `# W6 T$ i2 Z
{: C9 ^, p; Z1 C# s& t; s. Y" n3 }
foreach($_POST as $key => $data)8 x2 X8 B# W3 ~: r5 i
{
( { Y! }7 ~7 u( T4 N v, S3 h7 l $_GET[$key] = $data;% E) H1 d8 M2 u) M4 S8 _* u6 ^
}4 L2 ^1 o6 i- S' A4 z. w
}
6 N$ E [" m4 M$ A$ [% y( F /* 引入配置文件 */
' {# _2 M2 K3 @9 T& a" \- o( s require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
- D$ I' M. |; U; C& l' e2 Z" A) y+ e, Y......
6 I4 K& |- P- G& u 2 ^ _ L/ }% r( ^- x0 E
" r/ H+ S4 J" L) s8 L& l6 M大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。/ L7 Q% r' {' c; g* }1 E
* q- y+ v F/ \& e/ m) d
Include/payment/yeepay.php
2 a4 }0 G8 M$ @ H# `1 j7 U. v5 _% w+ ^* c, f" U
2 E- T: a: ?/ |+ P# s
! Z3 [& y# }' D8 C: J: M......
9 [: Y1 [6 N. k0 l1 \6 r function respond()
* q, U% s9 z' d( y! c( O8 p {
* ?0 c, G" X" k* C% V: k : s/ {" o! M' r8 O' V2 t' ]
/* 引入配置文件 */0 g' [+ a0 @/ }2 n _+ M4 D
require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';0 D( N, ^6 T6 v) g% \$ O" K
' C. p Y$ d2 X/ N" C. d* b
$p1_MerId = trim($payment['yp_account']);& B& @3 \9 j0 _' v
$merchantKey = trim($payment['yp_key']);
: X: Y4 y- A; O......
& X6 ^4 t" ]( l, q9 ]1 y& D
# B$ f# I/ A! Y4 d, R5 e; G% }& \7 o" C6 z
! X) ~. H+ m" Q2 u n3 ?, k, y5 e: d' X& F9 d- Y* f! j" V9 {$ i; n7 v
大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
. j4 z! F) @9 V2 T7 A# @3 u( p/ m- }6 \; Z# E- w- U( O
这两个方法在plus/carbuyaction.php文件调用。6 O6 `. R9 f2 z' Y0 A* K4 u
* O9 N+ G. I" \+ rplus/carbuyaction.php
3 O+ f! j, t: ^0 ^( v) b' }* X4 Z3 U; W3 _& i |
......+ B6 c3 t" I( c
} else if ($dopost == 'return') {2 x: h) @! x- ^3 U
$write_list = array('alipay', 'bank', 'cod', 'yeepay');
+ l' | R, k8 a& F if (in_array($code, $write_list))0 X& Q, l" l& L* k8 o, j5 T
{! s- g3 \# I9 A/ k: }
require_once DEDEINC.'/payment/'.$code.'.php';' U! t7 ^$ b5 a4 r" J2 G7 ~ Y
$pay = new $code;( e% ]8 e( c" k5 W% i$ [
$msg=$pay->respond();' |4 k8 \2 { d" Y
ShowMsg($msg, "javascript:;", 0, 3000);
5 M' w) c7 Z0 V9 j exit();
9 |* X- [! Y' i* Q0 G" Z1 ? } else {/ s1 U7 r' w/ o Q& t
exit('Error:File Type Can\'t Recognized!');
' c: M( w5 g2 y0 A }& b- i; ^+ Z7 f }8 A; |
}2 E& ?7 k) }. q6 D, N
......
1 t2 ?0 n% q6 H: s" G% B/ x& t
. A1 h m0 {% |9 b8 [8 O7 `7 }" Z _1 ` D t
2 W' Y! f" \ e' X: Q) x6 R4 W8 I! y6 N
5 ]: m' @+ Y4 r" D, M2 n" i
2 \6 q( D3 [$ O/ }8 x. G K- {! s
3 b/ ^. v2 }/ X大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
- a/ j( B% R, R8 F- R H所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
: ~9 C. q8 V& d' E m
# n. I; c! S# F" O; h8 d; o回到include/common.inc.php来看看他的机制。( b, d2 ]* ]9 \1 Z8 U% `
. N" Q) \ S" k) { H7 e% C- Z
" K* k+ D8 n; W, O) a0 p
9 J2 \2 g. _; J2 |1 f0 b2 Q& z
......6 B; V; d- r. Y
foreach(Array('_GET','_POST','_COOKIE') as $_request)
/ A4 }( h/ ]: x! G, h7 U{
! K2 ?, y' u( f/ P3 b# g foreach($$_request as $_k => $_v) ! p0 ^' U5 _4 g6 }9 { T
{
9 t- z( g0 }/ Q2 a if($_k == 'nvarname') ${$_k} = $_v;
( f, C+ M# ]5 Q. U) u* E' \& ~; { else ${$_k} = _RunMagicQuotes($_v);
; H) [# Y! y; J: I }" @% F, ?/ _0 ^
}* F3 ~" }, z7 W1 r8 ]( H
......
, k" E7 Q% k. U1 M0 k& }大概在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。暴路径:
$ M; ?9 @( `6 n( Q4 r9 v; S由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。 |