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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。+ r+ \- ^* C2 x+ s8 ~! _. v

* b: k0 B4 q  ? 7 _2 s; `! ^) f& q
\api\StatusesApi.class.php9 x$ m! o: X8 ]5 A

" I) y) H% @, [* s% V/ lfunction uploadpic(){
! n# C6 E* q4 }2 n: t% A      if( $_FILES['pic'] ){
/ o% r6 \5 P" j0 Q# h2 F     //执行上传操作* y2 E8 }1 y3 W* P1 j; ?4 C
     $savePath =  $this->_getSaveTempPath();
: }0 C# ]5 c( |+ H4 G, {  C$ N     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
/ \% o+ `* S3 S) M8 m1 o    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))9 z% y* I. N  j
       {2 |6 I) ]( u8 q& W9 [8 y
        $result['boolen']    = 1;6 z/ }! m- y8 p3 u" o) N0 U
        $result['type_data'] = 'temp/'.$filename;
6 n+ a" r# l% b2 E        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;0 n4 ~5 u# ~$ O6 O; f
       } else {
  ~+ B. i- Y9 M3 J        $result['boolen']    = 0;3 Q( `9 [4 {5 f. L; v' `$ G* l6 f
        $result['message']   = '上传失败';
$ w& n6 h' E1 G, w! b$ Q- h       }$ t# a5 c4 }3 |/ Z3 ^+ p% |
     }else{- V" |% x8 t0 h; b
         $result['boolen']    = 0;5 f8 u1 O4 }: w, v5 S1 H( F6 z
         $result['message']   = '上传失败';
* a- U& F( h5 c$ {6 R     }7 x( k* A4 b# u; M+ Z
return $result;. Q0 u* c$ j6 c4 n/ r
    }& Y7 K) C" J2 l& h; o) v
unloadpic()方法没有对文件类型进行验证
, x! J' L7 H4 I
" o3 n0 S: W& _9 s可以构建表单, 选择任意文件, 提交到! C, k# h  Q: \( T  e1 j
/index.php?app=w3g&mod=Index&act=doPost1 ^5 t% {1 J8 d" q: m6 |

1 B2 S3 S7 C. q6 H7 M在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
( X3 X- d1 n- v) m# T0 A
1 ~: r( |2 i& H& m" p
  P- I5 B+ l2 l4 M' g在登录thinksns官方微博后,
* Y+ D) A$ K# T构建以下表单:1 g/ w4 `! h7 _
+ f+ [8 l3 e) B+ z" a
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />" @! Y, V1 L" H/ u
<textarea name="content">test</textarea>' v" f( V( I7 s% s1 M* f0 v
file: <input id="file" type="file" name="pic" />
) L+ X8 \) ]! E<input type="submit" value="Post" />! L. Q9 I5 P* f, {. m* ^( w
</form>
' a" U) F- T4 @' K去掉缩略图的前缀(small_ )
" B; a  _3 H; |9 H​修复方案:
4 q7 t- H1 |/ D$ w, s
( }6 s1 S( ^& B2 V$ \) r$ D% y. Q
. D. j2 k+ J) J  E# R\api\StatusesApi.class.php
1 f4 e: L" b0 Z+ d& Y
& f- u, u4 O0 F$ A/ x: Efunction uploadpic(){
& Y6 L8 _$ _8 E' C* m" M4 Q' E     /**' J" Q( V0 s1 @$ @# Z+ o
      * 20121018 @yelo
- b) _( ]( }! R* i, [6 L      * 增加上传类型验证
; v4 |/ J' ~, }      */
1 Y  a4 G! ]" C( s2 i) A. M8 a# X( ?     $pathinfo = pathinfo($_FILES['pic']['name']);% p4 @+ \4 v& Q2 c* F
     $ext = $pathinfo['extension'];0 Z# [3 G  h7 @% r0 ^* y" I
$allowExts = array('jpg', 'png', 'gif', 'jpeg');: I, _: `$ M2 e7 d: l4 w4 i, |

2 ~7 B2 Q% V7 G9 e$ e( ]; e     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);9 `# C6 v. X2 r1 U

. ?* \' I# M8 d- W     if( $uploadCondition ){
; H+ G) ?9 K$ s. H% M" }     //执行上传操作! R+ V) E" Y# r& U3 i" E6 j
     $savePath =  $this->_getSaveTempPath();7 T+ ^7 N: Z" O! a: U
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
3 g* b+ a$ o  @) p3 D# S    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))2 D8 i0 i4 ]/ Q% Y9 X* X
       {2 Z6 e' }! J8 j' Q) B% C8 o
        $result['boolen']    = 1;' t1 Q3 j$ g7 y9 N' b
        $result['type_data'] = 'temp/'.$filename;$ p+ D  f; d) D; g3 K: m. ~
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;3 @" g7 @4 A* B5 S
       } else {3 d: W% ]$ ^9 Z1 o* K/ Q
        $result['boolen']    = 0;6 D- N4 C, |! |. I/ b
        $result['message']   = '上传失败';2 W: Q" C. n) z5 D, c
       }
- f/ v* T- E, _/ J& \; m     }else{
9 b+ v7 i2 M3 a1 m6 {6 z! _: F6 C         $result['boolen']    = 0;  j0 u# y, T. b) l7 }2 V
         $result['message']   = '上传失败';5 I; t0 l9 A+ u& Y( Q
     }: \  ]5 x+ s9 e! o. X
return $result;
$ R* Q) g/ r3 R' _. z; \    }
, k0 `- \' z" Q9 X% R$ v& ?/ L( p3 ?1 f& S

- j% V8 Q3 n: ]  \% O) v
回复

使用道具 举报

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

本版积分规则

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