微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。$ \+ B5 g4 T1 l6 T5 Z
O' G9 ]% O/ ]! R1 g
- R6 m( h' E* M\api\StatusesApi.class.php' z4 ^5 K* d" P' s9 g( x. M! v
1 O0 n% N; e* T3 ]function uploadpic(){
" {8 V" K8 U/ M% i if( $_FILES['pic'] ){! L0 T0 w+ y0 c& P: Y0 Y+ l( P
//执行上传操作" |2 w! k v: c, Q
$savePath = $this->_getSaveTempPath();
$ m; A4 c+ D1 X/ }+ w8 X $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);4 M2 k( `0 f7 n, A
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
X* I+ R+ [' K! Y- v% d {
5 c2 f3 b; L+ _. W8 q: {( | $result['boolen'] = 1;! V& }3 e( ?: q( v, r; Z% W
$result['type_data'] = 'temp/'.$filename;# Y) R% _) U8 Q* k+ z+ S6 i* a
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;2 ~2 W/ }" ^: u& t2 z
} else {5 [6 d) r! x' M) C
$result['boolen'] = 0;$ ?* P# ~, |+ N
$result['message'] = '上传失败';
2 p8 d5 s" a) j* D. [ u }6 h5 S% w: i6 B/ r, H' y
}else{
: E! E( E) u- y $result['boolen'] = 0;
7 b* h; R( U+ X# W8 F& T6 T $result['message'] = '上传失败';" f# A G7 `8 ^- S
}
/ e/ M7 ^% t) L# E+ {3 ^return $result;* V$ v% S: n- \* x
}) j4 `8 c! K; P1 M
unloadpic()方法没有对文件类型进行验证
+ a+ W& T4 p8 e2 _ ( A, R4 P& l$ t/ j
可以构建表单, 选择任意文件, 提交到( H2 C: k' U1 F
/index.php?app=w3g&mod=Index&act=doPost
- b2 E2 S: ^, y; G) i
8 l3 M$ |; G4 d! p. l在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)3 K0 |8 F) ^3 M3 m- N: _
" l! n$ b- _/ l$ D+ N
. ]" W4 T! D3 @ b* M0 \
在登录thinksns官方微博后,5 W. h/ p5 ], K+ L: a. Y7 S
构建以下表单:
8 G0 l' J) a' d/ v& t$ h" R7 _ ) m7 Z; M, |/ Y8 z2 v6 D' [" s
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />4 {5 D3 [5 ?1 ^! ?9 Q, {+ X
<textarea name="content">test</textarea>/ d! c- ]. O! E4 t3 R" m. A
file: <input id="file" type="file" name="pic" />
& R" ]: |+ y! C- r<input type="submit" value="Post" />
; S" U$ j- l7 r( J</form>
/ g. w7 W! _# b% X4 D, [( ]% B# c7 H去掉缩略图的前缀(small_ )
& }; b& m9 \+ t修复方案:3 u7 [/ n2 d8 j7 w9 O
8 \' _: @6 T! `, B4 ^
. N. o& |1 Q' @ ]\api\StatusesApi.class.php
# m- G+ r W0 q ' C# b/ `' ~: q# W: ?0 I
function uploadpic(){
- m, y5 D; P6 [2 S. ^1 i /**
1 T& u3 v# Y7 o5 W) F9 f# J: r8 ^ * 20121018 @yelo- m/ J. c$ H3 J$ S8 z
* 增加上传类型验证5 |) g" H! a; ~! F) B- U
*/, s6 H `3 A9 g/ P+ Q% X# I
$pathinfo = pathinfo($_FILES['pic']['name']);% y; s: c9 f2 b4 }% N1 w# m
$ext = $pathinfo['extension'];
5 {; x: y$ p% {7 B) ?+ f( M $allowExts = array('jpg', 'png', 'gif', 'jpeg');
Q. N$ _- w/ e. d: o0 H0 ` % _& ^1 O, {) y8 [4 R: g
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
. S0 K9 y6 T; Q2 k2 {
5 e% e0 M7 l! \4 K8 c; \9 A if( $uploadCondition ){' b) Q9 S- M) a5 q1 E
//执行上传操作/ D5 U- w8 I4 u
$savePath = $this->_getSaveTempPath();
) k. B" I" F5 z- _* y+ S1 c $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
* W9 u( F6 r: ~ if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
$ ~7 g+ `$ j+ I5 ^* s+ a; ` {3 h. Q6 m/ E' |- w- }; n
$result['boolen'] = 1;/ l8 h4 }4 B+ K* S: i" x% Y: D
$result['type_data'] = 'temp/'.$filename;
. B2 |1 H, Y+ F- { $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;6 y4 V8 K, @8 Z/ R: D
} else {
# Q) \5 {2 w- E7 l% X$ ` $result['boolen'] = 0;) ]! w1 x( j% n0 A
$result['message'] = '上传失败';
- p4 _+ ? }7 r }
! `! u$ O* w: y2 w& | }else{' B0 J) i a8 k; e2 {! l9 q
$result['boolen'] = 0;% T9 o; L' I5 E1 `5 R
$result['message'] = '上传失败';
- Y* z4 V1 i$ [; d# A# | }2 V2 o, y, C) c f8 |. x
return $result;
7 n6 o* i6 @+ p" ~! ^# | }/ G* T. d6 S7 X9 }
6 N0 p$ J9 X. A$ p2 `, D
) V& _8 ~; P6 a% ]) o% ? |