微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
1 i$ a' s8 [3 b, I% R4 c/ v h' U1 @' d! K- Y' ~# z M3 a
% f3 x4 L/ b( Q/ U/ l$ a+ H\api\StatusesApi.class.php
, X3 S+ I ]0 \$ O0 d8 c 3 E4 C! Q: E7 [" N' A& w& r
function uploadpic(){
4 B. A) `0 G% ~/ r, q& I3 f if( $_FILES['pic'] ){
: W9 _0 {0 D% d //执行上传操作
6 Y% h. o% X, `" ~" R" q2 R $savePath = $this->_getSaveTempPath();9 ]* B# w; T9 U, P( a
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
( p1 e: S J+ ?' c4 Q F if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename)). t) c6 S: G$ G) Z
{
: w0 o% P8 K4 w7 F$ Z! \& h! K+ r $result['boolen'] = 1;& u, y0 [) t+ U! N& t# F( j z j! }
$result['type_data'] = 'temp/'.$filename;
! }. i& N! t* I5 u! @$ j$ K, k $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
3 h$ n/ ^: N3 i3 ^ } else {
4 D% f$ r2 O% l/ k $result['boolen'] = 0;
9 `7 C; z; i* r; T $result['message'] = '上传失败'; a% J! Q8 }% b7 R9 f# ?5 g* L
}- k) \ T; w* q; {( @
}else{3 v) W" i5 O- v) N: f U/ r
$result['boolen'] = 0;
( v1 k0 E4 ] f* }# J $result['message'] = '上传失败';
% W+ n( N9 q2 l$ H: c# D* O) b }
3 Y l e5 s$ Jreturn $result;
% n+ q8 k7 c! t }
$ a3 D2 v; w* t7 Runloadpic()方法没有对文件类型进行验证1 U) r9 T9 I7 x- z3 J6 H" d! c
# G5 z7 P2 X; J' Q8 D) R可以构建表单, 选择任意文件, 提交到
" K+ R* e% m6 m! V. w. p+ u/index.php?app=w3g&mod=Index&act=doPost
: ^! [: i! ?/ e7 C; [, F 1 @6 _& O/ x. p2 k$ k
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
7 }% g( C9 D- j: }9 Z v* n' Q' e, i
8 C; p; t _. V在登录thinksns官方微博后,3 ^+ Y/ G, M P! s Q
构建以下表单:1 K$ T5 J* ?! ^$ E
! S7 _# |) X# A
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
7 U0 r2 b; M; m) ~<textarea name="content">test</textarea>( C4 y. _! i# f" ]
file: <input id="file" type="file" name="pic" /># ^) a, u- i) J2 p, C
<input type="submit" value="Post" />3 z2 b0 u0 j" j/ ^
</form>
% m8 L" y* O+ ]* @去掉缩略图的前缀(small_ )
- E! k$ }$ j* f% ~3 N! H7 F修复方案:
% `6 d5 G/ H* M' `' r9 q0 [) E& K: z' k' h, e F# _" T, h
, \. b l; ]' q4 i7 v\api\StatusesApi.class.php% O6 x8 e& ]( k2 K
. ?8 V# L6 L6 `/ u' x: P+ dfunction uploadpic(){
$ }* d, L; [- \ /**+ Y- j5 ?' x9 Q5 B4 p
* 20121018 @yelo9 P2 N% b+ R# r3 o$ V! v
* 增加上传类型验证, b9 m, A. p- I8 R
*/
; c( n" P7 J- ^$ {& E0 z $pathinfo = pathinfo($_FILES['pic']['name']);
) c0 J. R5 W2 ]3 K0 `7 u $ext = $pathinfo['extension'];
- o/ Q: i. M% i4 g3 z" U Q $allowExts = array('jpg', 'png', 'gif', 'jpeg');
6 }- b4 j' _ j: e , j& \ M* S! `
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);6 h- L# \- M2 q5 I `: }! c
- c0 E. J3 ?9 o; \* s/ N
if( $uploadCondition ){
7 a7 f3 B5 n, B //执行上传操作' v9 u5 A( u! B6 ?
$savePath = $this->_getSaveTempPath();
, l- t2 h; v8 I' _3 ] $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
4 d) o& B3 m$ k& k& g if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
) E( O; a: l9 z9 b {, k8 k+ u' o0 V8 I# X# K
$result['boolen'] = 1;
8 D9 N" }# l% h+ ?# I $result['type_data'] = 'temp/'.$filename;5 w$ F' [' [- B. S% w
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;. M3 y6 x& u" A9 {; `
} else {
2 f1 n" D% z {1 o+ G4 f $result['boolen'] = 0;
% ]7 J( G; h8 m$ K$ l) `3 U $result['message'] = '上传失败';2 T2 S I, o, L, F: Y) k( P
}; {- v2 E4 V* O# L
}else{
& t! O% w4 g& y9 F( _8 |& F* j $result['boolen'] = 0;
5 e' Q5 [& @- {3 w' U $result['message'] = '上传失败';
6 p7 y) m& s e1 @" ?' z }2 o% M3 c$ N" z
return $result;& N% M/ B Z L+ l# P% Z( h
}
+ b8 O: R& n0 o9 ?+ v* u( u7 G3 }4 g7 h& K/ F
+ V) u- W( T6 l0 G/ R |