微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
4 c; C- u, j8 C9 Y1 ~% K" ?: E& m% Y/ ]+ j6 g5 \
( ^4 _- c" r# W5 t9 T. P
\api\StatusesApi.class.php/ R3 s8 d1 k" Z# Y; A$ q, j1 u
* m: A2 r$ l$ K6 t0 S7 Q( w0 {
function uploadpic(){
. P0 _6 U7 `" y$ T% U8 @* v( N' c if( $_FILES['pic'] ){
+ I! P5 e7 q" j. m; D% L //执行上传操作
1 M/ _4 m" j. G R9 f $savePath = $this->_getSaveTempPath();
0 o n! Z+ r. t; t+ K0 ^ $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);: P$ K6 y! |( [
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename)): G% ^* z$ W# ?" T2 ~! C
{1 ~3 u8 w) R: ]' o2 b$ s
$result['boolen'] = 1;& Z( U6 J, Y: K
$result['type_data'] = 'temp/'.$filename;
- l6 ^( h. h4 Z: I! l+ X $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
% B* H) H1 H9 t2 |7 ~ } else {
) m" ^( `- `% R* u" d. \" m7 d7 E $result['boolen'] = 0;
/ L1 C" v8 l, Y% P $result['message'] = '上传失败';0 m( j( ` m. y! [; A8 W9 v
}
6 X1 P5 c6 L# a* M( \1 ~; [ }else{" Q) f6 R! L0 J- v: t/ p, e
$result['boolen'] = 0;
* `0 v3 }5 l; T7 d" Q $result['message'] = '上传失败';) d7 z. ]9 x q
}5 z5 z/ i9 ?; Q( u5 j) a7 Z: p
return $result;
% P% i# }! Z* L$ x! a }
) f! V+ V& F% Munloadpic()方法没有对文件类型进行验证( O+ A! F) X/ D+ z3 x
) i5 B" N$ D3 p7 k/ E可以构建表单, 选择任意文件, 提交到' _% Q* [+ K. a& z8 q: M/ }- I
/index.php?app=w3g&mod=Index&act=doPost
6 n+ `. a8 }% C 7 @5 _, _& w! Z( _! Y9 k
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)/ `" R! c' ^1 X0 X Q9 t
/ n4 [* ?4 n U. @9 G
1 ]" u3 g+ u! W3 A2 P' R在登录thinksns官方微博后,) L3 f+ N8 E/ E; E5 c7 S
构建以下表单:% J1 c0 n6 A% ~* s8 F/ `8 B; B; Y
8 A4 E6 U' i! Z, P! T0 H<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />- Y+ A( [/ d! u) h) d) A
<textarea name="content">test</textarea>1 i8 G" t# L8 `' t
file: <input id="file" type="file" name="pic" />, d* q. I4 n3 P' t
<input type="submit" value="Post" />
+ ]: Q* j. U0 j* Z3 X/ c0 a/ L</form>
{ O J1 b' x' @" c9 b% x/ n去掉缩略图的前缀(small_ )2 e8 D/ {( [' g$ ^
修复方案:
% [$ c) R0 }5 r1 N% I# S. ~
' L8 G: m# J/ t) r$ V3 _6 o3 j, d( R1 d, j. k" L4 G2 g. U. Q" U
\api\StatusesApi.class.php
; ?" T; K/ F$ H# d& W4 w( d 1 T! K4 \6 ]" a4 P0 U& j5 ^
function uploadpic(){2 K( ~& H1 k) J( p; \0 ~
/**
" x( k2 \7 E4 }/ z4 G& f * 20121018 @yelo# p, l% C7 I0 ]
* 增加上传类型验证; c* Q5 V9 U. v
*/
& P/ C% m2 J2 }# |8 E" Q. x $pathinfo = pathinfo($_FILES['pic']['name']);! h/ h! u4 M7 i- A- }4 B
$ext = $pathinfo['extension'];( F: h! H. A( r( U1 P `% k
$allowExts = array('jpg', 'png', 'gif', 'jpeg');5 q/ t: e& c j' S
( M' Z. \1 n$ _9 w+ U $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);# @2 |1 {8 V1 w/ }- M
6 n: I% b) w& {- B if( $uploadCondition ){
) {) E" y1 c# m8 Y% `9 @7 R; f //执行上传操作4 Z7 Z8 i8 o4 ^/ B+ A
$savePath = $this->_getSaveTempPath();
r% h; `9 G- O9 A $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);2 P3 c, B7 W0 U9 O+ J3 K d
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
" ` ^* P" Q B6 @8 g {" n( v! E9 x6 U9 L5 K- _
$result['boolen'] = 1;6 ~/ a. ^$ p" N. \& U H; R ]. o
$result['type_data'] = 'temp/'.$filename;( X* a; X! o; j b
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;& v2 W8 E5 a* J* Q, N* X4 }
} else {2 Q2 v/ Z4 A' N( x
$result['boolen'] = 0;. T6 }7 j* J8 E
$result['message'] = '上传失败';
& e, `; {% q% V: x% O }0 q/ b" s+ {9 Q; I
}else{
% g$ {3 [! }. c2 b. N3 | $result['boolen'] = 0;; h9 q- j v- @+ B7 A6 [9 v
$result['message'] = '上传失败';) c6 x2 P$ B! k
}6 e- V$ W* ~0 h$ S
return $result;0 s& Z& F a* P8 r
}, E5 v: y" |9 O- i7 o
: b7 a1 ^. g+ i- I+ G4 P3 P" F
; ^ C. Y9 U' g- [ |