微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
" t, c( g [4 q2 _6 G5 T
; {$ F7 _$ ]7 T; J, _ : [& \* l1 [. R- ^- j6 M/ O6 ^
\api\StatusesApi.class.php4 y( U9 X# z. x, H
" X* F+ F+ Z Y6 P! r) U
function uploadpic(){8 K c# r6 `4 \0 a2 g
if( $_FILES['pic'] ){
' s& f0 f* D0 j: V //执行上传操作. T4 R/ Y/ }/ C, l {7 V
$savePath = $this->_getSaveTempPath();
5 D6 g2 R# B2 U. N, D4 l $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);- }, ]' y/ h( X
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))2 H/ {0 o+ ]$ c6 K/ z. w' h7 g- R! Q
{
! f4 A! s1 ?3 ~; E2 O $result['boolen'] = 1;
+ x0 H4 |- o$ K+ t! Z $result['type_data'] = 'temp/'.$filename;
/ B. \6 M3 i4 r0 @: j8 x $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
u8 c0 z' X: M } else {) F$ \, b% R& g
$result['boolen'] = 0;
. Z6 P/ a, c) U r& d $result['message'] = '上传失败';+ g7 W% M& v* ?& e2 ~% ~
}
2 ?1 u( ?( Y! |4 j. g- a }else{
- K0 C$ r8 t- f* h $result['boolen'] = 0;
% ~$ c% M5 k. ?4 r/ P $result['message'] = '上传失败';
, {8 |) @) J7 ^% W' x# N }
/ I! J$ k5 ]6 l* l- P: Creturn $result;% f2 v ~- m' {6 v' Z- s5 R0 q$ L
}# w5 K# F0 j m5 P* ] B4 e, y
unloadpic()方法没有对文件类型进行验证% y* t5 I7 P/ S8 m; G- r
7 o2 v$ e. x4 L& A, L* [
可以构建表单, 选择任意文件, 提交到( B$ Y9 i- h* U% ^, ^8 r" r
/index.php?app=w3g&mod=Index&act=doPost/ R. {9 I$ J7 [3 e" [3 ?
9 U3 d( V. @% a1 d
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)3 s) S9 o9 W+ d" a2 A' O: |% E0 f
+ R; i3 P. L% f4 D0 l6 b1 j# f0 I9 \. m
: Q9 A- K. }/ J/ g9 a7 i- t0 g
在登录thinksns官方微博后,4 ] o# \2 O1 U) Y$ l7 W/ P
构建以下表单:
8 Y) ^+ V1 C3 { 0 T7 [, e% v/ k3 B
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
* U! y. h! d+ U) }3 H& ~<textarea name="content">test</textarea>
3 U0 z9 v% l" w" U1 [: @/ M3 Zfile: <input id="file" type="file" name="pic" />( G& Y1 x. x5 n$ @
<input type="submit" value="Post" />& ~1 s) l% O( E
</form>
6 X& @' R% J4 N4 b去掉缩略图的前缀(small_ )
0 I/ _$ E$ z( M- y# m4 ?; F, N8 n修复方案:2 d2 d/ z/ k4 v4 C0 [0 H
# I0 p5 o1 K! {* L0 r) R+ p
1 t, [+ L% f# s) t\api\StatusesApi.class.php' ^" I, ?, c$ k% P
. D( D- [9 s I; u& Xfunction uploadpic(){
# b9 U/ a2 Q7 ?& N- N: x /**
z( c: o0 L4 j# ]5 x, g * 20121018 @yelo, E2 J' C1 o9 p. W1 A( \2 N
* 增加上传类型验证3 K7 W! f) ` ^- |$ @9 @3 |
*/; b. x J9 W) W$ [0 R
$pathinfo = pathinfo($_FILES['pic']['name']);
: n J# ~3 a9 f. G1 C7 y $ext = $pathinfo['extension'];" m! Q2 G* j4 I( D3 D) ^
$allowExts = array('jpg', 'png', 'gif', 'jpeg');3 H* J% o2 o _* X. \7 k7 g- P$ U
) I, F- b. G8 U" W+ i* J
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);: e9 P6 o- d- P: j$ F6 ~ O
- n; g8 k6 j B5 I" U9 `9 ] if( $uploadCondition ){
. v I# d6 E& w+ }! E; U) y //执行上传操作' N* J1 V: P. w0 F( }; X
$savePath = $this->_getSaveTempPath();
3 B: J0 k0 x& E& u4 W4 a6 z $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
* r2 s k$ I9 ]+ ?/ X5 ]5 B7 [8 u" h if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
+ Q2 S' t/ ?/ b8 @1 q2 u1 x {
# l k2 G m4 q& B- b+ N $result['boolen'] = 1;
- W2 X5 x, o' {, P1 P $result['type_data'] = 'temp/'.$filename;
) N- y$ G6 T" P; |7 S1 l $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;* K( M+ M5 I6 [# {, \3 X" @* A
} else {1 K- E1 ?, u: Y( |5 j& G$ n
$result['boolen'] = 0;* M9 ~+ \4 W, u6 S0 A! G
$result['message'] = '上传失败';. `& b6 a+ E0 ^9 o6 q
}$ n( D* w7 i4 j- [( w8 V x7 D
}else{ F, s- U6 C K9 c% w
$result['boolen'] = 0;
9 ^/ G3 ~' @& \5 ~8 \9 n r3 [* p& n $result['message'] = '上传失败';
9 `$ H* V3 b5 l9 h% X5 R: V7 D5 \, p }* _( j( i% ?, `
return $result;8 I5 S7 ]0 l0 l4 M4 G
}7 ^7 N1 m! Y% s
- M/ A" Q- \! n5 ]) ~- `9 u4 r4 @. x! x
|