微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
& Q$ t3 c. r3 c1 e
2 C. `& ^. ?. N2 \
2 ?2 ?( _- w4 L8 m- \# z* u/ w8 b! s\api\StatusesApi.class.php# q; i+ O1 y/ ^0 h$ b E9 O# c
; b o D, z9 I n8 S* nfunction uploadpic(){
6 `9 W. ] A# {+ J if( $_FILES['pic'] ){* O8 J! U! p! M! @8 `" c9 K' c% V, R
//执行上传操作
; z7 q$ K0 y/ p4 @ \+ U" p $savePath = $this->_getSaveTempPath();, ?* T1 e E! u. j2 N* b
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);! y+ [7 T, f0 u) b
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))6 `; U( C- W- p* D' I
{
|8 R$ X/ _# P8 r, m, q/ N $result['boolen'] = 1;
( _3 k( v0 n" \ $result['type_data'] = 'temp/'.$filename;
* j6 R+ C5 t( Y9 g& i! L% f $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;! f N+ ?% D' I- m% j8 F
} else {
# n- D! E9 i3 O2 t) G. B. c! \; l $result['boolen'] = 0;
) ~4 C$ ?9 t/ k $result['message'] = '上传失败';
* X% E1 G* @. u6 g" p* R, n }2 a% n! X% c1 k
}else{
8 c5 F- P2 O% a( E2 m* ] $result['boolen'] = 0;; o* e- s* ~ \9 D8 @) F
$result['message'] = '上传失败';
# M8 G1 D2 Q+ p/ Y5 ] }! L4 s$ V3 m b- j4 i
return $result;9 I5 Y. ]6 z2 x& } \. e7 V
}
" V* v& y# V" b% [2 yunloadpic()方法没有对文件类型进行验证9 s9 s' |7 b( j. \
; g+ ]5 u# ~# O- T ?( ~& s
可以构建表单, 选择任意文件, 提交到
! Z7 |8 V1 z& R3 {4 t+ L6 v h) Y- u/index.php?app=w3g&mod=Index&act=doPost$ Q: N8 ?% p2 t9 k+ W0 _( h" P
; G J& a$ E; L0 H, d/ ^; x在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
3 v7 ?0 J2 `! @+ p& u2 p
1 b* y7 M, y4 m! @/ l4 f
5 e K4 L. m. a- @8 @在登录thinksns官方微博后,2 p/ C7 ~4 u7 f' ]# G- c
构建以下表单:
, I% }6 z \5 i5 f* f$ ?+ h
! F; }- _+ o5 X9 q% e9 a N<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
2 X. i$ c/ M! ?4 T! i<textarea name="content">test</textarea>
, ^% T" S( G2 n& K0 o6 s! ]- Qfile: <input id="file" type="file" name="pic" /> a0 E4 v0 }" \9 ^+ R$ h) e. I
<input type="submit" value="Post" />
- l2 a. R# k# Y# u* m) N2 `6 U7 d</form>
$ l. }: f" L h/ }* f去掉缩略图的前缀(small_ )% H- T% R4 J, g* ?: y, I
修复方案:7 E" M2 q2 @, x( e1 @9 Y
: d' i$ u1 ]' g, E1 B( ^& c: K. Q/ X. T7 j1 z$ I& ?
\api\StatusesApi.class.php
$ C. P" w( J3 L6 X8 V2 q& z # V; S/ Z" m+ C
function uploadpic(){
5 Y; z3 L B- J/ L+ X /**
% F$ @8 W& S7 |+ ` * 20121018 @yelo
2 e3 \0 \: E3 [4 V( U7 W * 增加上传类型验证7 `( T0 z3 i6 Z* [" R3 w) q
*/
, r I; I0 r# x$ ~3 e7 L $pathinfo = pathinfo($_FILES['pic']['name']);
1 ?5 h9 n6 s) s- P# y $ext = $pathinfo['extension'];
8 Z# [) d* e8 K y, y $allowExts = array('jpg', 'png', 'gif', 'jpeg');
8 z- N6 N/ K; J ( ^3 h0 _% H0 s
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);) v& r( v- c1 ?+ S/ T; r
6 D* m' D/ {! V# s- o5 z9 V if( $uploadCondition ){& J7 W& p( }: i" d3 ^# s" ~7 p
//执行上传操作
% K- l* t* j9 y8 n! H1 ~ $savePath = $this->_getSaveTempPath();
3 E: d# |( h: ~ $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
+ q% j! O- b+ `4 b% W if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))4 K) S$ h. F. Y5 y5 A8 S
{% S6 m+ _% A0 d: S6 L4 c/ d
$result['boolen'] = 1;7 u9 R% f/ {1 Q% P q5 P
$result['type_data'] = 'temp/'.$filename;
- A' F f9 i& a. q% z& Q $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
0 t1 X( k! b- H4 ] } else {
: W. x$ }2 q- Q9 [$ Z; H $result['boolen'] = 0; L2 W1 A' V& n- S' R
$result['message'] = '上传失败';
8 o4 u( K3 G* r+ i) X6 ~) ] }
d9 ]( j: o# I, a1 V5 g }else{
$ B. X6 H" e2 x1 j5 B0 }2 Y) C $result['boolen'] = 0;5 W3 _. I# B3 \3 A6 i a
$result['message'] = '上传失败';- H! ?. w- C% D. b
}
1 r/ Y$ _3 {; E p( U5 Q4 T( ^return $result;
8 i- ], C+ D2 H/ t }
' W! e+ V1 T) U; B; ?; M! a( X; s
3 C& C( i. `4 Y6 r+ X7 I2 S4 K2 {2 B; x; q" U! X
|