微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
' l( i) m4 k# O* ~+ V
: v: |% p8 x# K" z2 \$ |/ U 1 F0 L* G+ A' [
\api\StatusesApi.class.php0 n0 X& Q7 j' O0 {. r) e/ |/ X! f
2 M* L/ w( L( g5 s7 u/ Y0 Q2 {& A
function uploadpic(){
2 w* l9 h! w7 B7 d( ] if( $_FILES['pic'] ){" e6 b9 j2 y2 a" V5 W: \4 o/ P: ?
//执行上传操作; w$ O! ?$ C- G
$savePath = $this->_getSaveTempPath();5 Q+ V- a9 b/ r- J4 {7 y( ?. [1 w
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
: d5 S! Q7 }+ ?; b if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename)); V: D, {% A- _; m( X9 e& V! U% |3 V q
{
% p4 }; R0 r6 [% D8 c- V6 e $result['boolen'] = 1;
; i+ Y; p5 h6 v1 Q3 m Q# B% g6 h $result['type_data'] = 'temp/'.$filename;
% T- \+ o" s( u O% q $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;+ V/ @( y P2 l9 k
} else {
1 Q/ ~- ]; s& I: k2 T d $result['boolen'] = 0;( D0 Y- V- h; I7 v7 C; _5 I
$result['message'] = '上传失败';
9 |; C2 R2 E1 B) n# T) } }
& [" ~! ]% B" D+ I/ e* a! J" J+ Q- u }else{. W: m9 R% a5 M4 d
$result['boolen'] = 0;
& L7 U) A& U5 ~ $result['message'] = '上传失败';
9 W0 a0 e# `7 G1 a1 O }
/ j" z$ E+ ]: }return $result;; q/ D, _5 ~% d
}
9 X# M _$ r; `9 @% Kunloadpic()方法没有对文件类型进行验证0 F6 P$ x2 F& }- Q9 e
, V; k$ i( z- P# T+ {" B. H- C3 i
可以构建表单, 选择任意文件, 提交到& @* \: ~& `1 p
/index.php?app=w3g&mod=Index&act=doPost
) F0 ~: K% l+ P% d + G* w( P! e9 l: b& x
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
; K x& b& z5 h: H' s# H7 r( t4 F7 r/ i. r" d+ O) x
6 o0 E& w, T2 _, K' Q" Z: \ X在登录thinksns官方微博后,
5 E6 i) w8 S f; P构建以下表单:7 r6 \; J4 i% H4 a- l' K
0 c+ T! b6 q- T6 O) I) [/ q1 ^- J) y<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
1 P4 @: K5 i0 b' T; r8 u) X* E8 z<textarea name="content">test</textarea>6 t( W& t8 L8 x
file: <input id="file" type="file" name="pic" />1 k& |# t9 [! p! P/ T+ b
<input type="submit" value="Post" />7 @. u3 V% g1 v# D
</form>
]+ [8 C# g8 o6 i4 Y去掉缩略图的前缀(small_ ); `* R( L( k5 Z) [2 V2 x9 q1 T
修复方案:
1 v- y( V1 O* c0 i' h3 v+ B( r
2 G1 m( V5 n5 n$ j6 }; b
\api\StatusesApi.class.php
- L* L$ |( h, l$ ^& i, T4 r
+ Z: l9 ^; Y$ dfunction uploadpic(){
\1 |$ ~) D; K- u7 B /**3 @4 w5 X9 j V4 ^' o, m" y
* 20121018 @yelo
& J7 O% S. R, T9 }5 ? * 增加上传类型验证# [' }' h" D K) {& O, ?- A
*/6 `. n% L- J# H% `
$pathinfo = pathinfo($_FILES['pic']['name']);- `' v6 G$ j2 a* ]8 F! d, T
$ext = $pathinfo['extension'];/ J8 P$ v( P5 U0 U6 h6 V! e, \
$allowExts = array('jpg', 'png', 'gif', 'jpeg');; F5 M# P* l4 G4 O$ N. v( M }
6 J3 g, I$ d' \4 D; W
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);) E4 _6 N" B8 T$ |5 ?
8 X6 K2 Y% c7 ? [" {$ {& V" V
if( $uploadCondition ){
8 Y; _7 U9 ]5 o# _$ \) W/ b; n //执行上传操作
7 D. Q% z- G" s" k" i5 K, g $savePath = $this->_getSaveTempPath();
9 A) n3 l' `0 `1 p' ] $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
$ b; p& T7 {4 s- ^$ H9 [" W if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
/ i+ o4 ] [' W3 p6 t$ S {
2 N+ x' `& W8 M; u/ G7 s) b $result['boolen'] = 1;
# i3 h+ A2 m4 `5 x $result['type_data'] = 'temp/'.$filename;
2 D1 F) h' n0 {/ H $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
0 w0 |8 T: @2 U) c } else {5 x! p$ q( O0 S* n( r) q3 |
$result['boolen'] = 0;: u" o# ]9 N a" k% J
$result['message'] = '上传失败';
9 t! g( y: }; I5 m. O! h! ? }1 G% d4 y8 w- J8 O9 M. H0 d
}else{
. N- L4 \; q; @# y/ k. \ $result['boolen'] = 0;# M/ Y ]% I( n
$result['message'] = '上传失败';
. s! h' D8 C: _4 |" O' @ U }+ J8 a0 {, W8 K. t/ p
return $result;
! h8 c( h3 d4 F& x. t) r$ @. A }
U& s+ q. w9 D* {5 |
4 K" @! m1 R1 i7 U4 `' O( w
3 ~' f% v1 J% d* x9 Z+ v |