微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。% b) w1 B1 h! Y4 P
z% e. s' E. u- x
) h5 ]% z/ K9 ]1 l/ d
\api\StatusesApi.class.php% y/ m, K; `3 X* _" t9 M- C. {
; U7 l) P }) u- P4 T( k- gfunction uploadpic(){* B c5 I! ^7 L
if( $_FILES['pic'] ){6 w# l7 S7 z/ |, h; z
//执行上传操作
! ~8 K# r' W8 l) R. D1 r $savePath = $this->_getSaveTempPath();0 B! T. N- H1 z, k. c, T0 ~7 i
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
0 y! t( c, M ~/ ]% v( o: O0 | if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))0 f. _+ Y/ v" g
{# M6 C) ~. t3 l* y
$result['boolen'] = 1;
8 T. j' o7 M" `9 i $result['type_data'] = 'temp/'.$filename;1 t6 Y* f$ q. J+ }
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
4 {: e! S6 q/ f9 i } else {2 G2 p. d, \1 _0 q% G" }( o; E- P
$result['boolen'] = 0;1 {: S( T+ r7 l6 ?" L0 r
$result['message'] = '上传失败';
, n- E: i+ K. w- r, P) ]9 u }, _2 k) Z* x0 p$ g I- Z
}else{+ Q% O+ s2 Z1 A5 Y4 Z) R
$result['boolen'] = 0;3 |, @ s; l! t- n3 D7 G$ y' y
$result['message'] = '上传失败';
( W( T. \* H3 W( H }4 |& D( X4 O5 W- r6 n
return $result;+ V4 ?8 L1 T% x5 k3 m
}8 q. [- Y, y3 t% X; Q& F% [0 m
unloadpic()方法没有对文件类型进行验证6 s8 @; }; c: J1 S% v' J
4 a1 C- i- R# }) S& {1 o; _: d- M
可以构建表单, 选择任意文件, 提交到
& l1 j; n+ y8 a8 w p( |; h5 J0 |% R/index.php?app=w3g&mod=Index&act=doPost1 J. c: W8 W- P/ `' y* z9 o1 [0 E
& h* Y, Y. C+ k* r' f
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)/ f3 d" N/ h3 w& I4 Z3 f/ q
5 b: \3 y6 `. j, O! w; O! [- w0 m3 O; j' S9 S
在登录thinksns官方微博后,- \' u0 i$ q9 O O* D2 C% T4 U
构建以下表单:
- f! y7 ]2 i- U8 j0 Z6 [
6 ?. m/ ~" G. }( O) y( ?. t<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
+ e& D z; z6 N. o3 ?- Z! K. H& Y<textarea name="content">test</textarea>
& ]% B" T" A4 M Q: tfile: <input id="file" type="file" name="pic" />
8 |) v1 B, q! q7 r; ~: W<input type="submit" value="Post" />9 j6 ~% k* w9 }: T/ J$ ^
</form>
6 F9 \% i- l$ x! |- a' Y% w: U" B去掉缩略图的前缀(small_ )- d8 ~5 G7 w* O
修复方案:
8 H! |# V; g4 `+ E) j7 I) i
! k5 g7 c C" k1 E2 y) K& d1 ^" l) o9 U8 B I5 A" h
\api\StatusesApi.class.php
* Y3 T5 B" W6 T& v W
/ ~! v) q# C! T' T6 q" ]% Ifunction uploadpic(){4 r3 I) D* s9 R! P1 v4 h) z& A
/**& u! d9 }7 @7 j! C' U
* 20121018 @yelo1 J& k; ^& q0 q$ L; V
* 增加上传类型验证
2 Z, J E, R$ Z( p# F S' ]* o */9 ?5 W# \+ h. y) Q; H! ]
$pathinfo = pathinfo($_FILES['pic']['name']);
" k; q; i! J' v $ext = $pathinfo['extension'];
. x: F1 Y! O6 C! l $allowExts = array('jpg', 'png', 'gif', 'jpeg');' T3 m) }( U7 b- A
3 C( Y% e& a& z3 _
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
) t+ N& r, `* f; a $ |( r9 c$ e/ J. @# t
if( $uploadCondition ){
% i2 U2 _" C& p7 @' M" t1 R //执行上传操作; |" c/ }0 d, X( h
$savePath = $this->_getSaveTempPath();7 Q v0 N, b7 l& J0 b7 _! q6 r
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
. k0 B" z& l# t4 c if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
6 o9 S7 M. Y8 H5 u {3 n/ j& D& z( f4 x5 T
$result['boolen'] = 1;6 `8 b$ E) [4 ?0 g" X+ ^
$result['type_data'] = 'temp/'.$filename;9 E' Y& ~ B* e$ ~9 M) f8 |) \5 {
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;( X; o- O1 n3 [
} else { E3 p& J+ |( e( O! r
$result['boolen'] = 0;
- M4 [0 \# {: @6 S* C7 N& L $result['message'] = '上传失败';
* ~; ?" S1 [' d }
3 t4 ^) s5 v5 M T3 D }else{ {1 M; f; J( b+ S
$result['boolen'] = 0;
: O! k3 z, ^% y( l# ^- T $result['message'] = '上传失败';
, b& d: |' o1 D' k! ^0 p }' \6 N; q1 z# g# G- ]/ \" {
return $result;
0 C0 @, p" i/ ]7 |! b }
4 Z" a P F9 q% D# @% f. p, K! z6 q7 H$ O0 e/ ^- p9 t
& H- _7 O9 t0 Z& A5 w |