微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
& P: b7 ^. V9 ]( Q @
- ^0 x0 Z6 V9 j \; B& W $ A+ _9 h- x" q5 m
\api\StatusesApi.class.php/ b5 ^/ u y' W1 ?& g: Y. p
8 S3 d9 I7 Z; e; U0 D& K/ }
function uploadpic(){ |3 n9 O: Q, e% M
if( $_FILES['pic'] ){6 _ \$ i2 O6 y& `7 h# L! K0 @) ^
//执行上传操作7 }8 e: A, W8 ], R4 C9 ]
$savePath = $this->_getSaveTempPath();
, ^- q g( m6 t $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
8 D% E0 X. Y9 a) R0 R4 y: z if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
/ ^; i% {0 ?7 p& U0 o" w {% Q5 _" r" q/ h: b0 [* p, }
$result['boolen'] = 1; R1 b8 l4 |) V, x/ k
$result['type_data'] = 'temp/'.$filename;5 S4 o2 C) I/ u' w L
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;$ {* q" F! Z* H4 s
} else {
5 |7 t& ~1 X/ x) |8 U $result['boolen'] = 0;: v0 t6 I0 W) c! M6 W+ h* A
$result['message'] = '上传失败';
% p0 [* D. d! P% ?; l6 i. Y }
: `; m E8 D! E3 E7 d5 H& @ }else{: @& I& L! W' C! K0 h
$result['boolen'] = 0;
# t* B6 ^7 @% x8 X" l0 D' Z $result['message'] = '上传失败';$ G- e/ @9 ~; s( w
}
6 _. P3 x9 o; vreturn $result;, g& k3 c* s: `4 ^+ l3 @8 C
}# n1 f& W* \) p ^
unloadpic()方法没有对文件类型进行验证
: ~, ~4 }9 w$ G% S n ; y& V: A: a7 c8 T/ L) f V& h7 s
可以构建表单, 选择任意文件, 提交到
' i" g! f5 S7 b% M+ i. V/ t! w9 Q Y/index.php?app=w3g&mod=Index&act=doPost% e' ~0 E: e+ w; c; H* ?
: v) v3 z4 i3 v在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
' w. I) |1 f5 W- W- t# p9 [
1 q5 X& y1 [3 l" n2 ?7 Y
7 d: Y, W( g8 k1 Y B在登录thinksns官方微博后,
& e) B( g5 G7 `: r! i! H8 [9 m构建以下表单:: P# J# Z$ z. @/ O4 U# K" b: O
# z ^2 j. H; l" ^2 B
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
) G* J$ T& ]: ?7 c9 i$ f<textarea name="content">test</textarea>9 i) ~) Q8 N( x7 A1 \& q( s
file: <input id="file" type="file" name="pic" />
1 ?. P$ O4 U: [; k<input type="submit" value="Post" />3 m3 |2 _' [' e
</form>
5 ~# O' [3 R3 u5 c. Y去掉缩略图的前缀(small_ )
% l7 ]) O$ y, [0 t5 |修复方案: R) a; t! w- j7 P; L3 i8 ^* W
* N7 C! r2 P+ X0 z3 g
& u0 }* X0 u- K\api\StatusesApi.class.php6 }- `9 d; m) B% |
- Y. ]1 y4 F3 k* B
function uploadpic(){
9 F O, f. E* ?6 I3 L; f, c ]! _ /**. L" r M: \# S, T7 i) b- a
* 20121018 @yelo( c% e: z, J. E9 j U$ m; s7 z
* 增加上传类型验证
; N: T' S8 Y9 z */
& ?5 P; q4 f! a $pathinfo = pathinfo($_FILES['pic']['name']); d5 ^; Q' b( T0 ?/ h$ W8 g' E
$ext = $pathinfo['extension']; y% V- C! R) [! y
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
7 e6 v$ I! n6 Q' O1 S
1 W/ Z& X( }" S+ ^ $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
+ L- U6 O* w6 I% C3 a5 B
: @* W u6 R- n8 o/ p if( $uploadCondition ){. p/ n- l* d; R
//执行上传操作
$ o T& I- O# m0 O c, n $savePath = $this->_getSaveTempPath();
: w4 E) m$ H1 \# O $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
% \8 j' q7 P% u' d if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))* [" A* Q& ]9 a! e9 P
{7 }2 L9 c& w) K
$result['boolen'] = 1;
7 Q; m0 V" c+ d. z8 W) p& r, _ $result['type_data'] = 'temp/'.$filename;
/ \4 {( U2 z4 K $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
. e# y& ?. F0 w, e! k1 h } else {
' }! X1 _& g) P4 \! v: X2 o+ q $result['boolen'] = 0;
& M5 b7 W- A* f( |* w, D $result['message'] = '上传失败';2 B( W/ a+ o. p! A0 r" ?6 n) }% ~
}0 I7 _* |; }, c. [, W
}else{# T4 ?: N: q* t* G! _$ d) V; r
$result['boolen'] = 0;
9 }' W3 u) r7 F# A+ P $result['message'] = '上传失败';
4 R3 T# s( b4 m+ r1 J) F }4 Z: [4 t2 ^9 t* ]/ a# y# @; c4 _
return $result;6 _2 L5 f* h. z( `
}
4 _; P0 Z$ X) t) {
) W3 e( o3 O+ z* V, Q, r. X; [8 d1 k- z+ M7 ?
|