找回密码
 立即注册
查看: 2421|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。% b) w1 B1 h! Y4 P
  z% e. s' E. u- x
) h5 ]% z/ K9 ]1 l/ d
\api\StatusesApi.class.php% y/ m, K; `3 X* _" t9 M- C. {

; U7 l) P  }) u- P4 T( k- gfunction uploadpic(){* B  c5 I! ^7 L
      if( $_FILES['pic'] ){6 w# l7 S7 z/ |, h; z
     //执行上传操作
! ~8 K# r' W8 l) R. D1 r     $savePath =  $this->_getSaveTempPath();0 B! T. N- H1 z, k. c, T0 ~7 i
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
0 y! t( c, M  ~/ ]% v( o: O0 |    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))0 f. _+ Y/ v" g
       {# M6 C) ~. t3 l* y
        $result['boolen']    = 1;
8 T. j' o7 M" `9 i        $result['type_data'] = 'temp/'.$filename;1 t6 Y* f$ q. J+ }
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
4 {: e! S6 q/ f9 i       } else {2 G2 p. d, \1 _0 q% G" }( o; E- P
        $result['boolen']    = 0;1 {: S( T+ r7 l6 ?" L0 r
        $result['message']   = '上传失败';
, n- E: i+ K. w- r, P) ]9 u       }, _2 k) Z* x0 p$ g  I- Z
     }else{+ Q% O+ s2 Z1 A5 Y4 Z) R
         $result['boolen']    = 0;3 |, @  s; l! t- n3 D7 G$ y' y
         $result['message']   = '上传失败';
( W( T. \* H3 W( H     }4 |& D( X4 O5 W- r6 n
return $result;+ V4 ?8 L1 T% x5 k3 m
    }8 q. [- Y, y3 t% X; Q& F% [0 m
unloadpic()方法没有对文件类型进行验证6 s8 @; }; c: J1 S% v' J
4 a1 C- i- R# }) S& {1 o; _: d- M
可以构建表单, 选择任意文件, 提交到
& l1 j; n+ y8 a8 w  p( |; h5 J0 |% R/index.php?app=w3g&mod=Index&act=doPost1 J. c: W8 W- P/ `' y* z9 o1 [0 E
& h* Y, Y. C+ k* r' f
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)/ f3 d" N/ h3 w& I4 Z3 f/ q

5 b: \3 y6 `. j, O! w; O! [- w0 m3 O; j' S9 S
在登录thinksns官方微博后,- \' u0 i$ q9 O  O* D2 C% T4 U
构建以下表单:
- f! y7 ]2 i- U8 j0 Z6 [
6 ?. m/ ~" G. }( O) y( ?. t<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
+ e& D  z; z6 N. o3 ?- Z! K. H& Y<textarea name="content">test</textarea>
& ]% B" T" A4 M  Q: tfile: <input id="file" type="file" name="pic" />
8 |) v1 B, q! q7 r; ~: W<input type="submit" value="Post" />9 j6 ~% k* w9 }: T/ J$ ^
</form>
6 F9 \% i- l$ x! |- a' Y% w: U" B去掉缩略图的前缀(small_ )- d8 ~5 G7 w* O
​修复方案:
8 H! |# V; g4 `+ E) j7 I) i
! k5 g7 c  C" k1 E2 y) K& d1 ^" l) o9 U8 B  I5 A" h
\api\StatusesApi.class.php
* Y3 T5 B" W6 T& v  W
/ ~! v) q# C! T' T6 q" ]% Ifunction uploadpic(){4 r3 I) D* s9 R! P1 v4 h) z& A
     /**& u! d9 }7 @7 j! C' U
      * 20121018 @yelo1 J& k; ^& q0 q$ L; V
      * 增加上传类型验证
2 Z, J  E, R$ Z( p# F  S' ]* o      */9 ?5 W# \+ h. y) Q; H! ]
     $pathinfo = pathinfo($_FILES['pic']['name']);
" k; q; i! J' v     $ext = $pathinfo['extension'];
. x: F1 Y! O6 C! l $allowExts = array('jpg', 'png', 'gif', 'jpeg');' T3 m) }( U7 b- A
3 C( Y% e& a& z3 _
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
) t+ N& r, `* f; a $ |( r9 c$ e/ J. @# t
     if( $uploadCondition ){
% i2 U2 _" C& p7 @' M" t1 R     //执行上传操作; |" c/ }0 d, X( h
     $savePath =  $this->_getSaveTempPath();7 Q  v0 N, b7 l& J0 b7 _! q6 r
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
. k0 B" z& l# t4 c    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
6 o9 S7 M. Y8 H5 u       {3 n/ j& D& z( f4 x5 T
        $result['boolen']    = 1;6 `8 b$ E) [4 ?0 g" X+ ^
        $result['type_data'] = 'temp/'.$filename;9 E' Y& ~  B* e$ ~9 M) f8 |) \5 {
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;( X; o- O1 n3 [
       } else {  E3 p& J+ |( e( O! r
        $result['boolen']    = 0;
- M4 [0 \# {: @6 S* C7 N& L        $result['message']   = '上传失败';
* ~; ?" S1 [' d       }
3 t4 ^) s5 v5 M  T3 D     }else{  {1 M; f; J( b+ S
         $result['boolen']    = 0;
: O! k3 z, ^% y( l# ^- T         $result['message']   = '上传失败';
, b& d: |' o1 D' k! ^0 p     }' \6 N; q1 z# g# G- ]/ \" {
return $result;
0 C0 @, p" i/ ]7 |! b    }
4 Z" a  P  F9 q% D# @% f. p, K! z6 q7 H$ O0 e/ ^- p9 t

& H- _7 O9 t0 Z& A5 w
回复

使用道具 举报

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

本版积分规则

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