微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。8 C9 {4 @8 \9 W; H7 @. Y9 z! b
4 x6 V0 ^2 G8 H4 `, N% H" @
" I( L) R; \4 L0 k& j% ~\api\StatusesApi.class.php4 t3 c& @4 S; E, f, H& r( B6 _! l% ?
2 I1 y2 N1 X+ I% v: [6 t& c2 Cfunction uploadpic(){! }0 W; ?4 X# H) J! h
if( $_FILES['pic'] ){
& ]! e4 t& P# Q/ t //执行上传操作$ [+ E" S3 d4 T5 N+ R* @% b& |
$savePath = $this->_getSaveTempPath();
/ L$ ~3 l/ r" v) s+ Y% x $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
5 \2 G- a7 W2 I! | if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
6 a* k: F" j+ H+ [/ W {+ z( F8 ~: ^5 C) `2 C
$result['boolen'] = 1;! M5 k3 [8 x% z6 e
$result['type_data'] = 'temp/'.$filename;" t6 q" y5 K' N9 P# q; r( O3 v4 A
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename; {# k" \7 }1 ?3 u! m! r8 d
} else {
Q7 c+ b0 U* D- r0 A! F $result['boolen'] = 0;
% g" o8 s0 t* N, o$ @8 U9 ?1 T' H. W $result['message'] = '上传失败';9 [7 d% ~' \' w7 K1 C0 \
}$ \7 ? B9 I a4 X
}else{
) J% k! i8 O' X, n W# | $result['boolen'] = 0;( g5 P$ P' M% X" [& Y. Z
$result['message'] = '上传失败';
/ s) n9 L. [) D- g }
8 U- ~6 i: R- p" b4 U$ \" Hreturn $result;
& n4 V' k) s$ m8 M. i$ { }
0 j. l0 k: B) N5 |' D& q' |5 xunloadpic()方法没有对文件类型进行验证
2 Z, f8 t' U6 W. [' u3 q+ }$ ` ! P4 }# {9 O5 V
可以构建表单, 选择任意文件, 提交到6 [* `, w' b# d& W J
/index.php?app=w3g&mod=Index&act=doPost
, l+ O* z5 K3 X
4 Y# m% d, |+ H在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)5 z; E3 ^8 b& e$ a, x
2 g$ |0 z5 M9 p+ U! \
2 I) r& P& ~2 m( ]0 w6 U
在登录thinksns官方微博后,
% t8 n) E M2 Z& ?! ^构建以下表单:
! K# X+ x; \3 T u) d ; \, @/ k# V' z D7 r- E+ b$ i# B
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />0 \! [' Y3 \( p5 h3 f* h
<textarea name="content">test</textarea>
e3 o' D$ G" q& O8 Cfile: <input id="file" type="file" name="pic" />
( W! Y5 C7 s+ y: i<input type="submit" value="Post" /># ]1 k& ~. D5 U& s- `% d
</form>
( T4 L, z+ k6 V+ q! v6 \( G去掉缩略图的前缀(small_ )
8 u% r9 A* O8 S修复方案:) N: P- J" b! r% F/ H: ^( P: k
7 g; w# g' _' ]7 k* z! ]) Z9 U9 e1 K2 U
\api\StatusesApi.class.php
2 p, ~1 n. J. ]8 ^! f# Z
4 Z8 P) b# |; ?+ bfunction uploadpic(){( r1 C B( R, H2 C- Y
/**4 t$ W( S1 a; B
* 20121018 @yelo# e% N0 D: H; L
* 增加上传类型验证
9 [* G; v+ p% {/ x O) q */3 n$ S4 O% x j8 j: f
$pathinfo = pathinfo($_FILES['pic']['name']);
# T' f/ N7 T0 ^ $ext = $pathinfo['extension'];
, _( O$ h) J5 i" I) a* `; p/ A% C L $allowExts = array('jpg', 'png', 'gif', 'jpeg');5 y, z, w4 e' C5 W0 u$ g
4 g) U, `) v* T) a8 o5 ?5 V4 l $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);* e: k" F7 {+ K- {, _" ^
+ d% ]9 t- E2 C" }$ H if( $uploadCondition ){
9 o, H: P% n! ?, k //执行上传操作 P4 y& s5 C, h- a8 t$ K0 ^; X
$savePath = $this->_getSaveTempPath();
- f+ W, \: O. [: L' i $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);" m2 e9 Q2 m; [$ l
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
! |6 a6 `. R5 F! A& s/ @ { g5 c' t- C* X- o5 C; w2 R6 [
$result['boolen'] = 1;4 j) I$ m2 v! f) p3 j
$result['type_data'] = 'temp/'.$filename;
4 G$ b3 e% H9 I* z3 a8 Q. J $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;9 \3 W+ n9 V; Y' d8 r7 T k: a+ e |
} else {" Y$ a0 a4 I* `7 F- ^
$result['boolen'] = 0;# x5 j0 l% F- X9 m$ f9 k
$result['message'] = '上传失败';" \$ ^8 F7 F8 O& \ s
}0 i h# m2 v G/ o
}else{
: z& F; Q/ v# Q, a $result['boolen'] = 0;+ g2 h* x3 {. A! n* ~/ M
$result['message'] = '上传失败';5 X4 D U' y* {( N$ F
}/ I8 b3 q4 c% k8 H; J7 W, U
return $result;
" C, N/ W& x- a2 ]# T } @& o7 L7 x; Q& o) e8 y# q
2 ?* K, b7 F j3 R/ H
3 l* S& M, G7 z& s. f5 h1 [ |