微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
* k, V4 m" N, ]4 {: M
' O' k7 U D" L! Q
2 p, b7 S" o2 I$ L% X, O\api\StatusesApi.class.php0 _( l6 z' |0 ^5 x# b3 I
: Q" o1 o- M- I) |# I4 Sfunction uploadpic(){8 n [1 @! c. U6 U) V$ V: n9 t
if( $_FILES['pic'] ){
I- P* l4 @1 I1 o; w: F //执行上传操作
7 j6 d/ ^$ w7 B: }5 i $savePath = $this->_getSaveTempPath();
* n8 J7 v3 X$ P& g' p8 L $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
; P N& b, Y# H0 `! m if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
) l+ J. x, [2 t7 X0 C {& W0 y4 M5 b b, _9 i. \
$result['boolen'] = 1;# o% m/ q+ R3 L3 Q# t8 [
$result['type_data'] = 'temp/'.$filename;
1 P# m7 u8 W# v! [ $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;) G M) i) ~4 x+ f9 d
} else {
2 _/ Q( T" y$ A% G, x9 S $result['boolen'] = 0;
$ C0 F8 g2 H0 e* @3 M; P $result['message'] = '上传失败';
4 p$ f' y, F! S1 d6 ?, w( y }
& Z" s% ]0 R- Q; T6 y& n6 K }else{' F& [7 q q- P7 E, f
$result['boolen'] = 0;
8 D$ b$ P8 M/ g" K" s$ r# C $result['message'] = '上传失败';
N& L* H6 ?+ X9 \ }
7 h4 x6 M9 x$ b" mreturn $result;. O9 P# }/ a/ S9 V3 l% |" O& Q
}- {* [& j0 U4 w" D$ P! X/ U4 H
unloadpic()方法没有对文件类型进行验证6 L$ B z" l0 y7 ~
* U& W# Y( d5 P; g
可以构建表单, 选择任意文件, 提交到
8 u! ]- [4 \+ Z/index.php?app=w3g&mod=Index&act=doPost
; @+ Y0 H! O4 [$ B0 a. x7 H
$ r% g, b+ d$ K. q在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)" [8 y6 A5 X! q7 r
; ?7 i' T/ I0 M9 G! R& \+ @
6 W G7 g: h5 V+ [2 y' T. t0 U在登录thinksns官方微博后,# g( t9 Y/ d' d5 v' m! c9 m" w
构建以下表单:6 `- ~! b' P e: r
0 c! X, Y: {* Z3 w p, }
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />$ E: ~% j( V7 Z4 m, X
<textarea name="content">test</textarea>
3 }, C3 [% G2 p& K8 ofile: <input id="file" type="file" name="pic" />
7 n: Q- T8 A2 u- m* J<input type="submit" value="Post" /># T! v: a6 x) }6 a
</form>
3 C5 |1 R9 h4 q3 o& [$ X去掉缩略图的前缀(small_ )7 E* `. t) e" _8 L: O v
修复方案:' U- C; r# ~& [1 }4 U4 \4 h: N$ q
; V: ~5 S0 v; ]9 b: Y* f9 l7 ^0 A! w$ Q& K2 a1 v- j
\api\StatusesApi.class.php* X {0 i! n. p5 B3 v# [0 ]/ y
" A& }/ ^3 v! H: o
function uploadpic(){) y! ?/ X6 u, ?$ I* R( y
/**# l3 H, _) Z2 x* M0 \
* 20121018 @yelo
1 }, P/ `0 D( F- z5 W * 增加上传类型验证9 e. u7 d, V2 K4 {/ N
*/; E* b0 F0 s/ t3 H' ]8 e. Y9 }
$pathinfo = pathinfo($_FILES['pic']['name']);" w$ L1 L, u- o
$ext = $pathinfo['extension'];4 X% ^ x9 Q, R
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
2 n* G" F1 F& z' t9 y + z# Y2 Z& q) u P( e, Z5 g
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
# e) g: x M5 y$ G2 } k
6 f7 E1 I- I3 v, K if( $uploadCondition ){' _8 P+ T0 y' A. M8 u9 l- X8 Z+ O1 D& \
//执行上传操作
5 J# w. ?1 y3 o- W/ ^, F$ q9 k h $savePath = $this->_getSaveTempPath();
: V' M3 e5 U4 H/ z7 \+ C $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);. q: G! y3 `, L5 o5 w
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))3 L5 m0 r( v7 O6 x- C7 }
{
; w7 w1 W0 o5 B8 y( j1 X9 b1 S $result['boolen'] = 1;
; K4 H4 [# z% r5 }' B8 F/ P# H $result['type_data'] = 'temp/'.$filename;
9 w9 R* O! u' A5 [3 Y4 t0 R $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
* P" r5 E* e- f& r2 m } else {( m7 P0 Y, `: x8 {
$result['boolen'] = 0;
, U8 B$ T3 M; h $result['message'] = '上传失败';
2 f, w, U2 t5 u3 }! i8 i% u }4 e. O9 M( f8 T# ?( j
}else{
- a$ B/ |/ C( g7 u3 Z $result['boolen'] = 0;$ n5 c, T6 i! S1 J
$result['message'] = '上传失败';
$ F7 O; w" V3 n8 R }
: ^" f* A. q% |1 Z2 G# Ureturn $result;. N+ h- B0 Z6 I) ~( M6 G: r
}5 P1 o9 ~5 u/ v2 l0 ~5 M& U
, b3 i( S# V! I' X
# G0 t- ]+ I" V1 V0 O |