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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
7 q% [# Q; k3 s8 e0 ~2 W; M' |: Y
- i; J# F" ?+ z 3 `1 K2 e9 R3 c
\api\StatusesApi.class.php: E! M* }  C+ e# |. V. j( q2 k+ V

  ]( e( k) q2 c( u( c& y! rfunction uploadpic(){* ?8 w$ y' c. N
      if( $_FILES['pic'] ){; j) \3 u* E5 L6 k! M
     //执行上传操作; \& k. G( V) x6 u0 d4 t
     $savePath =  $this->_getSaveTempPath();* `. Y$ X, B9 L, Z. }' k& r
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);' K  p3 p9 a$ O/ ]% A
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
' g7 s2 _( D1 M/ F8 \; q+ F       {+ X; \+ M# G1 I
        $result['boolen']    = 1;# E2 s5 O6 I7 ^' f2 z+ k
        $result['type_data'] = 'temp/'.$filename;
  E  w1 ^! O% o' H& y  i        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
- u% k3 `% [" t' V  ^       } else {8 K# `" ?0 F) A: F( a# k
        $result['boolen']    = 0;
9 l& a/ G% n3 n: L# k        $result['message']   = '上传失败';
$ e/ o% {3 ~6 H  }" {! q1 Z: j' I2 E       }3 T) L7 X7 N3 R/ p4 d* @: l
     }else{+ o5 X0 L3 h$ @# F& F
         $result['boolen']    = 0;+ S) o- b# v& g) Q
         $result['message']   = '上传失败';
4 F' |5 v2 u( V3 G# Z     }$ ^$ ^+ h5 P; D, C
return $result;3 A6 J4 t6 C: |7 {+ i  A
    }5 y( f1 ^, r! U
unloadpic()方法没有对文件类型进行验证% y& _9 K% i5 y- r+ p) T

0 u, m/ O3 Q# C  a" ?( C可以构建表单, 选择任意文件, 提交到
, U) y$ ]7 v8 n6 D8 j/ Y& [/index.php?app=w3g&mod=Index&act=doPost* j3 ^6 R! `; M
5 ~$ s2 H* t- H# O, l
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
+ j5 N- W1 k* o9 ~; j7 L
5 f( _1 P- m( [2 |
3 b) _+ g6 B5 W% p# n在登录thinksns官方微博后,0 A4 u9 b4 }: A; S
构建以下表单:
7 I6 s. C+ Z) m3 l7 O9 q4 u  O
. S2 \( v, w* P; X<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
* X+ H0 a* R/ l1 x( U9 e<textarea name="content">test</textarea>
1 f% x0 j1 p( d: {, Vfile: <input id="file" type="file" name="pic" />
+ R4 ~1 ~8 C; L$ U' D% {! a<input type="submit" value="Post" />
& a5 V( ?; I  F5 j8 L$ P</form>
( P# V: p1 X! R! G去掉缩略图的前缀(small_ )
  g, E. f& g1 F) m& Y# h) L- H: W​修复方案:
" b7 M2 b; @7 w! `  L
" I3 q+ N* }( a" X" M
5 M9 J& ^$ g% g\api\StatusesApi.class.php) }! T6 O1 }7 J2 e+ u- d, P

% m  T* f) u* Q5 A, U2 i  X) Ffunction uploadpic(){
5 ?+ D' x2 D( O; ?4 L     /**( W% w& A4 V6 A2 C; ~/ @
      * 20121018 @yelo: f4 C1 m# ~0 `/ C, h" t  s# N
      * 增加上传类型验证
% @" [9 x  u% L. g. C4 _      */
' g  T! q' `9 D" [9 z4 ^2 W     $pathinfo = pathinfo($_FILES['pic']['name']);
# L3 Y5 Y$ X: L$ r     $ext = $pathinfo['extension'];  B! G* b. j% N' I  W/ D
$allowExts = array('jpg', 'png', 'gif', 'jpeg');, o6 ~1 ~# Q6 X$ Z+ y$ R  b  x
4 Z8 @/ m' Q2 J7 j! C/ p/ D
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);/ v5 i( f0 b8 {! f0 `
9 J- \+ e9 h, X0 Q. g+ I) x
     if( $uploadCondition ){
$ f  R" H% A6 u" M/ `     //执行上传操作' N& C; W. ]9 n. h4 Z. J
     $savePath =  $this->_getSaveTempPath();# `! {" u1 q/ ]/ B: _0 N
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);0 Q7 q/ n$ N( A/ i
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))( ]! v9 @7 u% R& V9 j$ ?
       {+ o! M3 P* c" {5 V" G9 I: t6 o9 p
        $result['boolen']    = 1;6 F8 Y% C5 j. M4 U! B
        $result['type_data'] = 'temp/'.$filename;
4 u; p& ?3 E; ]  @" Q2 g4 P        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;; A  v3 \8 K: v1 }/ K5 D
       } else {
& W# M4 V4 ]2 S- f- L9 ^9 l        $result['boolen']    = 0;
) c+ y' N* `2 m( w9 _        $result['message']   = '上传失败';+ A0 F) A% a5 d( O& e  s- U  _
       }
' ?9 }* j$ _2 ]) ~1 c9 Z# O; a, h4 H: n7 P     }else{, M/ o( P8 ]7 N$ [) w+ o1 w9 _' c
         $result['boolen']    = 0;
$ z* V' ]9 g% ?$ |         $result['message']   = '上传失败';7 H" w5 x) V- q2 g9 Q- m
     }
. ~6 o+ b  k( T0 X( m3 o! }return $result;
/ s5 w4 Q+ o* q& @% }  f    }5 D& K) S9 x- S' M7 X* E& N3 R
​4 d# z. E. P$ A! j& k
+ n+ r  k2 W& V0 N; Q9 F8 R! t/ t6 T
回复

使用道具 举报

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

本版积分规则

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