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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
/ _. Y1 J7 ~: x) S) U; b
6 W+ [. v0 d  g0 Q( M) O, ?  }
9 @9 S! S4 ^8 ]8 j\api\StatusesApi.class.php
+ D. A# G, I% c" s, A0 q: J0 j
) d+ ?% D  T- q8 Rfunction uploadpic(){
$ A! E0 J* U- j0 t3 i% A      if( $_FILES['pic'] ){2 ^4 q3 M9 Q- g! F
     //执行上传操作1 j$ s* f1 l" C9 f$ |
     $savePath =  $this->_getSaveTempPath();. D. T* v6 D* `6 s$ E" d9 n2 ?
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);" G" f# O6 ^3 _( ^; T& D  O. y/ w( Z
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename)); V7 X; |8 q: X( [
       {
) }3 ^# S$ G4 \4 e        $result['boolen']    = 1;
# i4 s/ H7 V4 R- z- J* f4 P8 M# j7 \        $result['type_data'] = 'temp/'.$filename;9 s/ i7 q4 m; P% Q- Z' ]  k- }& Y
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
3 m, |; ~. i9 i1 G: e* }       } else {
( o* W# @, R% t        $result['boolen']    = 0;3 G4 q$ |1 r! m; c: C: F3 q9 h9 |
        $result['message']   = '上传失败';
0 t; d9 d5 ^& Z       }
0 S7 s3 \8 i5 U" ^5 M! K8 `; W' Y     }else{  d& V  L4 U- [* P! l* U; @$ C
         $result['boolen']    = 0;$ G! N% ~% [8 ?6 {1 Z
         $result['message']   = '上传失败';7 k4 ~! }* R" m! n# `
     }
, d7 K) D/ g/ k. x7 ?5 lreturn $result;
% \- X0 [7 v: v0 n8 \9 v* m    }* u) X% @! P( C, G; B. ]& J( U
unloadpic()方法没有对文件类型进行验证
) W2 D# {& C, x" t0 e( n5 m & ]  {, Z5 F: [
可以构建表单, 选择任意文件, 提交到
7 ]' ?& Y0 I/ h  R/ v2 f/index.php?app=w3g&mod=Index&act=doPost7 V, ]; z/ J" x# _2 R6 s: x5 _0 L5 {

1 `* Q6 |: Y( n) E4 z" H& J在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)  v# P2 W9 O$ I( o& M  v8 i

  U- H( D7 [1 S4 r6 z6 D) _# f+ D1 j7 U) N( |0 i
在登录thinksns官方微博后,
! ^' Y6 {: [4 m1 U- i2 v9 G4 s  M构建以下表单:$ S, n$ K" Y7 a% a; i* N

- o8 e8 r: n, x5 s; G<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />1 G& h: s' E# z" Y/ n
<textarea name="content">test</textarea>2 X4 q* m" Z. u/ }" A9 F3 ?5 k1 J
file: <input id="file" type="file" name="pic" />
; s' \5 U+ ?4 h" J  B6 |2 X; z<input type="submit" value="Post" />
$ n1 P  {' q9 e4 D; _</form>  E! ]" Q( q( _7 q- v5 p8 D3 i
去掉缩略图的前缀(small_ )
4 A1 Z6 M" w& g" ?​修复方案:7 y5 `( Y1 ]0 |" Z/ O' n

. x' @1 Y& |; c2 r8 _8 T1 c+ L/ |; N; M6 y
\api\StatusesApi.class.php
1 }9 p8 I: v+ ], B' V+ }
8 W) v6 ^/ M8 ^! A9 qfunction uploadpic(){! `+ R6 z0 B+ Y  d
     /**1 o# K" j8 Y/ ]9 U% P
      * 20121018 @yelo
) w' M* ]" k, `% I9 x: P/ K7 {7 F- f      * 增加上传类型验证
! r' c7 g6 i6 P, A- H      */4 @+ f, [7 L2 q6 O: P7 T* }
     $pathinfo = pathinfo($_FILES['pic']['name']);
8 H3 p5 w; T- _0 J. q5 a* g     $ext = $pathinfo['extension'];
: n' I0 E, P+ V3 o $allowExts = array('jpg', 'png', 'gif', 'jpeg');
( @  ^1 I+ ^- | ( B) t8 a+ o0 h$ {, ~
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);5 b$ N) g7 e' X* D+ Z; @
: Q0 U) ]2 G" }" m
     if( $uploadCondition ){
2 {- u. y& d# J3 x4 w$ N- I     //执行上传操作
( i% ~: \+ l: K- ~0 e, a     $savePath =  $this->_getSaveTempPath();. A) R2 x- T) m3 J
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);6 ~6 b4 B; I: D) _
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
8 S/ o2 F2 A3 i/ T0 u  j9 W       {
* s5 f. `1 W  N( A/ X" g; S+ `+ l        $result['boolen']    = 1;# _  n8 t% S' z. j
        $result['type_data'] = 'temp/'.$filename;
! d6 o: O7 f! m5 P5 p+ Z1 U  x& u        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
2 s/ f) f5 J# D; g  Q: e$ y       } else {
# C' a8 \9 M. U3 x- E. v" T        $result['boolen']    = 0;
& Z+ f2 a& |  v. _2 Z) f2 c( r        $result['message']   = '上传失败';. ?- b, W1 `) f  U* {5 t
       }
7 J3 i( L5 x! F! O6 I4 z" K) z2 f     }else{
; E8 P$ I1 d8 n; R7 p         $result['boolen']    = 0;
: E! j. f8 P- m         $result['message']   = '上传失败';* {0 X( I& t5 P3 N. d
     }  q$ r* M3 L& ?+ L
return $result;
3 W9 C% B. L& X+ d/ q" |8 D; m    }4 l. G1 {  G% y! x5 D* x* x
+ V- \6 E; B, A% ~( v1 I

$ S+ A$ b1 l$ B& u
回复

使用道具 举报

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

本版积分规则

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