微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。9 Z$ o) |1 g# W8 @% X0 O3 }
# M# C" P( E* H- ]' Y 6 o7 K9 z$ |& o4 f
\api\StatusesApi.class.php
* x5 I! X/ a% d1 N3 U0 Q/ \* ~% F+ m
# I. V! ^! b2 o g: Y1 S- Z; C/ Wfunction uploadpic(){
5 M& ?$ [4 ?, c: j if( $_FILES['pic'] ){
4 b" P8 V) I/ r/ r- F6 o/ P //执行上传操作& Q) r+ u5 o; J) F% W% [% |; R
$savePath = $this->_getSaveTempPath();: L' }0 R# ~' {6 D! Q, I( d- {
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);3 n' b: {' p5 j9 N# Q5 O2 U: W5 A
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
0 E, w9 W, `6 R% p( ]' b0 L {' L" s4 b( f8 ^9 q( j4 j
$result['boolen'] = 1;
& v* n. `: ?7 g, r" Y) K/ q' n $result['type_data'] = 'temp/'.$filename;3 H6 C* ^7 L) v% i8 Q9 R
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
% e# f, a' `2 }5 ]9 r" s1 [ } else {
( I6 Y) I" \, w- k; ]) ~ $result['boolen'] = 0;# L/ z1 t3 n; V8 F7 _5 R8 Q
$result['message'] = '上传失败';0 ~* @1 U, d5 Y/ C% h- |! E( Z' B
}
7 b* E) a8 v7 M O }else{
/ \1 f2 o5 x u0 J/ w/ z4 j $result['boolen'] = 0;
8 `; |( z: i7 u: e5 B $result['message'] = '上传失败';4 s: G s# _% x
}
2 [) v G1 [7 v4 ]8 lreturn $result;0 Y. K% R3 |0 v* {8 [
}0 l) t: ?( E- T' }" S3 I7 S
unloadpic()方法没有对文件类型进行验证! z5 @6 Y- N# ^, ?0 }
8 A0 } `# O% |1 N% b+ _
可以构建表单, 选择任意文件, 提交到5 ~1 ?& _+ n7 D2 ~
/index.php?app=w3g&mod=Index&act=doPost
$ C5 d7 Q5 A1 H7 {- G1 Y) ^( C
( W6 d( V& e; R+ y在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀), {; d( Q1 I" k% f9 @3 t
, y3 `; Q2 p0 _0 y( c: [( L
: L$ D* N" V" b G* O+ [
在登录thinksns官方微博后,, M+ M& G+ D0 G* o( c; r
构建以下表单:! J! N9 D: ^; s( t; ^
& D: `3 |2 n1 u( `4 N$ u
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
" z! Q! I; L5 r& q<textarea name="content">test</textarea>
) Q: e% E; D& ?0 a' g! Vfile: <input id="file" type="file" name="pic" />7 J$ s2 g. V( k
<input type="submit" value="Post" />
1 d+ M% Y. D3 W0 n: r* w</form>
7 G( ~, }) e% z$ T0 R' e$ Z去掉缩略图的前缀(small_ )
+ R) W0 @1 }! }2 _- O3 I修复方案:- O. Q/ q# _: ~2 b2 e
: C# n! V; d! n; I
0 C7 q/ M0 k; x9 S0 t. j+ k\api\StatusesApi.class.php
, u9 L4 T7 P7 Q4 q4 F
- ~/ T' S( d$ d" B' k, P8 l, a4 e9 ffunction uploadpic(){& w7 Y' L* A" B9 \
/**# Y( P5 d8 C8 u" p) |
* 20121018 @yelo4 W5 f- b o# G+ d3 z N' i" ]
* 增加上传类型验证
- Z. ^ E3 S" K+ t1 H/ t( _+ I1 ] */
1 g( N7 |/ D3 W% D $pathinfo = pathinfo($_FILES['pic']['name']);& E; u3 g4 [5 R& q
$ext = $pathinfo['extension'];
2 r: A- u' q$ L. k $allowExts = array('jpg', 'png', 'gif', 'jpeg');
* l" w! H `2 ^( f* {
+ H1 k& |! C+ O4 ?1 ?3 B4 p( s $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
4 q2 }- q% c1 z- s: l% |2 o * r, {4 F/ G6 I" \" `5 w
if( $uploadCondition ){# l+ s! I; k' H! z
//执行上传操作
7 J, u+ ^; n0 e/ ^* E+ q $savePath = $this->_getSaveTempPath();
7 ^5 ^9 |& ^" g $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
8 @0 J: Q# `( `- t" s if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))/ H7 m0 q( Y# B5 e
{
3 F- T+ _- U( k4 ]9 I4 N/ o3 H $result['boolen'] = 1;
; {9 c9 c5 h4 A+ s' z- [ $result['type_data'] = 'temp/'.$filename;
# S6 T `& I% V& X8 t; s1 X! V( k $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
& x+ u3 h8 x4 U! Q, d8 ^! F3 o } else {( m- r4 u" a0 r
$result['boolen'] = 0;
+ K O9 N. b; o) Y/ } $result['message'] = '上传失败';
4 {# R# M, E- M0 o, |+ b3 l }
+ R/ O; F- @. M! ?: ~ }else{
+ V$ E$ q3 E1 d) `2 P- d" C+ O $result['boolen'] = 0;& f9 u7 O( M5 {5 ^4 U
$result['message'] = '上传失败';) F- u3 E- b. I. u2 ^) @
}. s; V5 u7 l7 D g/ f- V( N
return $result;* o+ Z8 s( a( S0 p& w1 B
}! S+ M4 m" i) B! k
; L' J. Z& n- r4 P; r. J6 ?" x# l
7 s6 A+ o; u) W2 D% @( h7 \1 @ |