微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
7 q% [# Q; k3 s8 e0 ~2 W; M' |: Y
- i; J# F" ?+ z 3 `1 K2 e9 R3 c
\api\StatusesApi.class.php: E! M* } C+ e# |. V. j( q2 k+ V
]( e( k) q2 c( u( c& y! rfunction uploadpic(){* ?8 w$ y' c. N
if( $_FILES['pic'] ){; j) \3 u* E5 L6 k! M
//执行上传操作; \& k. G( V) x6 u0 d4 t
$savePath = $this->_getSaveTempPath();* `. Y$ X, B9 L, Z. }' k& r
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);' K p3 p9 a$ O/ ]% A
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
' g7 s2 _( D1 M/ F8 \; q+ F {+ X; \+ M# G1 I
$result['boolen'] = 1;# E2 s5 O6 I7 ^' f2 z+ k
$result['type_data'] = 'temp/'.$filename;
E w1 ^! O% o' H& y i $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
- u% k3 `% [" t' V ^ } else {8 K# `" ?0 F) A: F( a# k
$result['boolen'] = 0;
9 l& a/ G% n3 n: L# k $result['message'] = '上传失败';
$ e/ o% {3 ~6 H }" {! q1 Z: j' I2 E }3 T) L7 X7 N3 R/ p4 d* @: l
}else{+ o5 X0 L3 h$ @# F& F
$result['boolen'] = 0;+ S) o- b# v& g) Q
$result['message'] = '上传失败';
4 F' |5 v2 u( V3 G# Z }$ ^$ ^+ h5 P; D, C
return $result;3 A6 J4 t6 C: |7 {+ i A
}5 y( f1 ^, r! U
unloadpic()方法没有对文件类型进行验证% y& _9 K% i5 y- r+ p) T
0 u, m/ O3 Q# C a" ?( C可以构建表单, 选择任意文件, 提交到
, U) y$ ]7 v8 n6 D8 j/ Y& [/index.php?app=w3g&mod=Index&act=doPost* j3 ^6 R! `; M
5 ~$ s2 H* t- H# O, l
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
+ j5 N- W1 k* o9 ~; j7 L
5 f( _1 P- m( [2 |
3 b) _+ g6 B5 W% p# n在登录thinksns官方微博后,0 A4 u9 b4 }: A; S
构建以下表单:
7 I6 s. C+ Z) m3 l7 O9 q4 u O
. S2 \( v, w* P; X<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
* X+ H0 a* R/ l1 x( U9 e<textarea name="content">test</textarea>
1 f% x0 j1 p( d: {, Vfile: <input id="file" type="file" name="pic" />
+ R4 ~1 ~8 C; L$ U' D% {! a<input type="submit" value="Post" />
& a5 V( ?; I F5 j8 L$ P</form>
( P# V: p1 X! R! G去掉缩略图的前缀(small_ )
g, E. f& g1 F) m& Y# h) L- H: W修复方案:
" b7 M2 b; @7 w! ` L
" I3 q+ N* }( a" X" M
5 M9 J& ^$ g% g\api\StatusesApi.class.php) }! T6 O1 }7 J2 e+ u- d, P
% m T* f) u* Q5 A, U2 i X) Ffunction uploadpic(){
5 ?+ D' x2 D( O; ?4 L /**( W% w& A4 V6 A2 C; ~/ @
* 20121018 @yelo: f4 C1 m# ~0 `/ C, h" t s# N
* 增加上传类型验证
% @" [9 x u% L. g. C4 _ */
' g T! q' `9 D" [9 z4 ^2 W $pathinfo = pathinfo($_FILES['pic']['name']);
# L3 Y5 Y$ X: L$ r $ext = $pathinfo['extension']; B! G* b. j% N' I W/ D
$allowExts = array('jpg', 'png', 'gif', 'jpeg');, o6 ~1 ~# Q6 X$ Z+ y$ R b x
4 Z8 @/ m' Q2 J7 j! C/ p/ D
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);/ v5 i( f0 b8 {! f0 `
9 J- \+ e9 h, X0 Q. g+ I) x
if( $uploadCondition ){
$ f R" H% A6 u" M/ ` //执行上传操作' N& C; W. ]9 n. h4 Z. J
$savePath = $this->_getSaveTempPath();# `! {" u1 q/ ]/ B: _0 N
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);0 Q7 q/ n$ N( A/ i
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))( ]! v9 @7 u% R& V9 j$ ?
{+ o! M3 P* c" {5 V" G9 I: t6 o9 p
$result['boolen'] = 1;6 F8 Y% C5 j. M4 U! B
$result['type_data'] = 'temp/'.$filename;
4 u; p& ?3 E; ] @" Q2 g4 P $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;; A v3 \8 K: v1 }/ K5 D
} else {
& W# M4 V4 ]2 S- f- L9 ^9 l $result['boolen'] = 0;
) c+ y' N* `2 m( w9 _ $result['message'] = '上传失败';+ A0 F) A% a5 d( O& e s- U _
}
' ?9 }* j$ _2 ]) ~1 c9 Z# O; a, h4 H: n7 P }else{, M/ o( P8 ]7 N$ [) w+ o1 w9 _' c
$result['boolen'] = 0;
$ z* V' ]9 g% ?$ | $result['message'] = '上传失败';7 H" w5 x) V- q2 g9 Q- m
}
. ~6 o+ b k( T0 X( m3 o! }return $result;
/ s5 w4 Q+ o* q& @% } f }5 D& K) S9 x- S' M7 X* E& N3 R
4 d# z. E. P$ A! j& k
+ n+ r k2 W& V0 N; Q9 F8 R! t/ t6 T
|