微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
6 c+ e# \$ O7 f- E# v# y0 z) Z6 v, ^/ ^( ?. W0 B8 _5 p7 a
, `2 \, [2 m0 m% W6 v\api\StatusesApi.class.php
; D; w& I: W- b+ g
; P; D/ n; l0 L* ?: yfunction uploadpic(){6 ]3 d! A* O) B2 a9 @, Y8 W
if( $_FILES['pic'] ){
2 V; \, u( O9 t. \: p; l, ] //执行上传操作 \6 G& N! o: {# D
$savePath = $this->_getSaveTempPath();
; R; ?. ]' K, @1 I6 c, v0 c% p9 a $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);# v) S3 M! [1 r2 i$ Z
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))" @8 x1 U2 L1 z: v' Z6 A
{
& I. M$ b. Q: X $result['boolen'] = 1;
: Z% l6 ^- w8 `6 j' r! e' ` $result['type_data'] = 'temp/'.$filename;6 D7 i) {1 f4 I; `) K
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
3 {: s! _/ I+ u } else {
. m/ O+ `2 l! e, t+ k $result['boolen'] = 0;: `# F2 {$ ?4 s5 y
$result['message'] = '上传失败';- e8 H/ k9 Q; I7 T6 N, {" l4 f
}
) f0 |7 @+ H, j) x }else{ [/ C. S0 t$ U8 h* ?+ Z, n
$result['boolen'] = 0;6 R) N) G" C/ h; O
$result['message'] = '上传失败';4 Y/ W% |* M: t" o
}
/ Y v( ~0 n* H8 Creturn $result;3 N: a( {/ @8 D! g$ Y6 F
}1 S" h4 q/ J" U4 X
unloadpic()方法没有对文件类型进行验证
/ i5 `5 ^, N& a 3 L) q- m, m g* y5 e( j8 w3 h, B
可以构建表单, 选择任意文件, 提交到6 Z& Y+ L: \6 v. b
/index.php?app=w3g&mod=Index&act=doPost
: U8 M0 V0 B, s: ~2 Z
/ \- M) S& N1 f9 w! z在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)7 m- r, b, P' {3 n9 X/ Y) v( v
2 e3 s/ k* O" b/ O$ n( L" d
/ m4 P7 C) e% U2 }4 f/ a在登录thinksns官方微博后,
2 C. Y6 z8 \: ~2 b |; m% a1 m) i/ D3 t构建以下表单:* k. q |6 G8 V7 j
9 S) ?3 o( Z" Y; w: r5 b<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
3 }% j2 ?% v9 R: r<textarea name="content">test</textarea>
1 L2 {0 E) j- z5 Y4 @. Lfile: <input id="file" type="file" name="pic" />
. N- N2 U1 e' I. w<input type="submit" value="Post" />( a- `: Q+ @$ ?( T! P9 ^
</form>
/ n9 p% Q4 }- J! ]1 M去掉缩略图的前缀(small_ )' H' y* A5 G) l8 f) {0 G6 W
修复方案:
( Y! e; L9 A' F
z9 B% h" \# u; s' ]" D, g+ G" u2 D/ C7 ?9 Q, B! s1 N1 s
\api\StatusesApi.class.php
t/ w% ?5 N3 R4 Q5 H; u1 O" o ' n2 b7 ^' Q: J
function uploadpic(){' H$ q6 \: a( r7 h. _
/**
& |0 R* f8 X6 s% O * 20121018 @yelo
( X P% o6 F. G$ `8 G2 c6 _& P * 增加上传类型验证
' |& ]- E+ C1 O, j/ w */
% a- K$ l2 x( I% Z9 J $pathinfo = pathinfo($_FILES['pic']['name']);
4 u- j3 T2 {/ J. A0 k L $ext = $pathinfo['extension'];
, K$ \1 X- s) O' K' s C $allowExts = array('jpg', 'png', 'gif', 'jpeg');8 m( ^ p H& C, _/ k7 |( W
+ J) |6 N1 K p) E* q
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);" h, D( q+ G I
/ x/ _. J8 O) a$ N# ~8 u3 ] \
if( $uploadCondition ){
1 v& G3 ?( a [ //执行上传操作
! Y" K# A3 U8 F& P4 |% U $savePath = $this->_getSaveTempPath();9 y6 z2 j! ^# G ~8 w8 U
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);' x( L* Q. B, q
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))# u% v4 ]' \! x) n# I8 r5 B7 ]
{% h9 ?! w9 F7 D. }$ W. N! g
$result['boolen'] = 1;
_. X3 [6 V; k( g H $result['type_data'] = 'temp/'.$filename;
% c; g, Y) H# Q $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
% Q% K9 l, d/ Z6 ], p8 y) o$ k } else {- G) o/ X' |! {; E, C" {! n
$result['boolen'] = 0;- ~6 e# @! t$ Z
$result['message'] = '上传失败';# z& n' R: ^7 A L$ H8 R
}
- \& ^* B' \# @+ l: ?; \ }else{
3 @/ b- L1 D2 S* t: q- N8 k $result['boolen'] = 0;/ W& F" E: ?6 N$ A; @* q
$result['message'] = '上传失败';
, t! e b# y* F" n8 k }
2 }4 E% ?6 H8 l$ N* ^& j3 wreturn $result;; B5 V% t" e! U; ? ^# b0 e9 ?
}5 C* I5 V# e$ j2 ~& C3 P$ w
3 b; t2 P- F/ I" a
; V0 c5 m- v& S9 d6 K; F |