微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。9 v5 X! M4 A; @) B+ M; q; I
5 Y/ I; v) z2 P- r( h
/ ^- p1 Y/ H, U
\api\StatusesApi.class.php
3 B1 i# U: [1 e8 s2 ?: j- I6 V1 B 8 j7 h/ e( _! w" }* q( D$ s! M
function uploadpic(){
( B( Y2 \9 e1 B+ S% y* F if( $_FILES['pic'] ){
- W/ R3 }: q* q6 W8 `2 r //执行上传操作
! X ^. E8 P, G+ o# A+ W4 j7 ^ $savePath = $this->_getSaveTempPath();
0 w+ J, F$ |- q# W7 j* D" C $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
: L- H1 S8 t/ ^6 F2 j G if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))5 }' W$ K7 l" T8 T# ]1 ^
{
% ~0 r" n7 {2 o9 S7 I1 z $result['boolen'] = 1;
7 S9 \8 | ~8 \: S: J6 R1 [$ [0 r; Y $result['type_data'] = 'temp/'.$filename;
& _/ w9 A! T l0 S8 f $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;9 Z2 W3 _1 y# _5 U
} else {
$ W2 F$ `2 @- ~6 V& v9 | $result['boolen'] = 0;6 ~( v% U% {/ W' E
$result['message'] = '上传失败';
! L' G: A% E8 w1 { }
) o# a: v A- T7 e! W+ E }else{; L$ Z, T4 F" @1 d
$result['boolen'] = 0;/ E9 b7 j0 d/ l3 }% E0 e" d. `. J8 x
$result['message'] = '上传失败';" \, N5 G- W9 V$ P2 b
}
" r. |3 \0 T' x/ w7 Freturn $result;
9 T7 x# G8 g0 r4 t8 C, N* ` }
# K& ?$ h" V9 }( q' }: R, x. funloadpic()方法没有对文件类型进行验证! M! l5 X4 A$ F" v6 t
/ }: k/ \* R$ f
可以构建表单, 选择任意文件, 提交到
/ X8 a/ {' C: a/ I3 V9 H' Z/index.php?app=w3g&mod=Index&act=doPost
6 }" I; L% O3 ~/ ^& F " [. l9 z+ D# g, A' M; U
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)* B& X6 B1 B1 k5 ?0 t& ]+ b0 L
. q0 l. ]* T5 {9 t- Y8 S+ `2 u2 h
) W1 I% m8 w$ x! r在登录thinksns官方微博后,
2 k- u( X: v2 u$ R构建以下表单:
. K. [" p' P; @2 G: {; Z7 M& a$ ^
* j# x( R) s( U8 P, ~8 l<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />; t! N! c* M$ k/ z" r
<textarea name="content">test</textarea>6 C( v* G5 P: ?
file: <input id="file" type="file" name="pic" />
; A$ k9 ~+ V7 w<input type="submit" value="Post" /># f# M5 @$ @5 Y) H- z* ~9 A
</form>
8 B* S' W) p8 R0 Y; \& T& D去掉缩略图的前缀(small_ )( D1 I* A5 `4 x
修复方案:6 [- J- Q, A- y/ Y& f* H/ S' Q
8 l7 f( K- q; a; g, g) v0 \0 w
+ S$ ]1 T' P% d' H
\api\StatusesApi.class.php
( B" Q; P; g X0 H" Z3 u ' U& A, ~1 R! M7 k7 k
function uploadpic(){6 X* n# _# |, x3 ]9 h
/**$ ^* j& j! w& G& O; [. t
* 20121018 @yelo
3 j; k' p" T" V * 增加上传类型验证
2 l+ l; M t3 v- E |8 _ */5 W( J( }' s( D7 M9 k: q
$pathinfo = pathinfo($_FILES['pic']['name']);
) e4 E/ O$ z* i- i0 i6 l $ext = $pathinfo['extension'];; ?3 H8 z* f ]% D- o
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
j# G" K1 r3 u5 J" t9 I
" Q/ Z) B1 Z2 i ]9 Z $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
* R& [2 P0 q9 ]7 Z7 E9 h/ l6 r4 ` ! |0 R& L& k3 k1 ^/ |. O& h- ^
if( $uploadCondition ){7 {4 U2 @- h) ]
//执行上传操作
* S# j6 f/ X: D& P $savePath = $this->_getSaveTempPath();/ y( @2 E8 h E5 L. V9 o) {7 r
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
0 B/ }: I S( d5 Z if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))# A% w$ @5 R! c/ P9 Z( I/ o: {
{
: E: s0 W [( b) J $result['boolen'] = 1;& c/ U3 f3 S K9 y
$result['type_data'] = 'temp/'.$filename;
- f7 _9 I4 i/ L) r/ v2 s- A $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;, y/ V2 F3 q3 G R
} else {4 r$ P4 x+ x8 A( c' Z9 ^6 r" w& M
$result['boolen'] = 0;8 s- z- U/ i+ H6 H' u0 N9 F
$result['message'] = '上传失败';* O7 @1 e9 C* P8 |; ~
}
. Y# G. e8 ?! s: L9 w }else{
6 \6 O6 b) J5 t: B+ a0 S $result['boolen'] = 0;
) L5 L" d- {$ A1 S $result['message'] = '上传失败';
- x" ?) z% w* W: Y( { }' [7 w" H$ b4 `7 X" J3 _
return $result;2 z9 l1 v0 G7 O3 g% r! u
}+ u/ b% o# `' K! a3 ~/ o, f
5 ?; U) H+ F1 J' @9 z* I( R5 H. ^ N2 M
|