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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。$ \+ B5 g4 T1 l6 T5 Z

  O' G9 ]% O/ ]! R1 g
- R6 m( h' E* M\api\StatusesApi.class.php' z4 ^5 K* d" P' s9 g( x. M! v

1 O0 n% N; e* T3 ]function uploadpic(){
" {8 V" K8 U/ M% i      if( $_FILES['pic'] ){! L0 T0 w+ y0 c& P: Y0 Y+ l( P
     //执行上传操作" |2 w! k  v: c, Q
     $savePath =  $this->_getSaveTempPath();
$ m; A4 c+ D1 X/ }+ w8 X     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);4 M2 k( `0 f7 n, A
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
  X* I+ R+ [' K! Y- v% d       {
5 c2 f3 b; L+ _. W8 q: {( |        $result['boolen']    = 1;! V& }3 e( ?: q( v, r; Z% W
        $result['type_data'] = 'temp/'.$filename;# Y) R% _) U8 Q* k+ z+ S6 i* a
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;2 ~2 W/ }" ^: u& t2 z
       } else {5 [6 d) r! x' M) C
        $result['boolen']    = 0;$ ?* P# ~, |+ N
        $result['message']   = '上传失败';
2 p8 d5 s" a) j* D. [  u       }6 h5 S% w: i6 B/ r, H' y
     }else{
: E! E( E) u- y         $result['boolen']    = 0;
7 b* h; R( U+ X# W8 F& T6 T         $result['message']   = '上传失败';" f# A  G7 `8 ^- S
     }
/ e/ M7 ^% t) L# E+ {3 ^return $result;* V$ v% S: n- \* x
    }) j4 `8 c! K; P1 M
unloadpic()方法没有对文件类型进行验证
+ a+ W& T4 p8 e2 _ ( A, R4 P& l$ t/ j
可以构建表单, 选择任意文件, 提交到( H2 C: k' U1 F
/index.php?app=w3g&mod=Index&act=doPost
- b2 E2 S: ^, y; G) i
8 l3 M$ |; G4 d! p. l在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)3 K0 |8 F) ^3 M3 m- N: _
" l! n$ b- _/ l$ D+ N
. ]" W4 T! D3 @  b* M0 \
在登录thinksns官方微博后,5 W. h/ p5 ], K+ L: a. Y7 S
构建以下表单:
8 G0 l' J) a' d/ v& t$ h" R7 _ ) m7 Z; M, |/ Y8 z2 v6 D' [" s
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />4 {5 D3 [5 ?1 ^! ?9 Q, {+ X
<textarea name="content">test</textarea>/ d! c- ]. O! E4 t3 R" m. A
file: <input id="file" type="file" name="pic" />
& R" ]: |+ y! C- r<input type="submit" value="Post" />
; S" U$ j- l7 r( J</form>
/ g. w7 W! _# b% X4 D, [( ]% B# c7 H去掉缩略图的前缀(small_ )
& }; b& m9 \+ t​修复方案:3 u7 [/ n2 d8 j7 w9 O
8 \' _: @6 T! `, B4 ^

. N. o& |1 Q' @  ]\api\StatusesApi.class.php
# m- G+ r  W0 q ' C# b/ `' ~: q# W: ?0 I
function uploadpic(){
- m, y5 D; P6 [2 S. ^1 i     /**
1 T& u3 v# Y7 o5 W) F9 f# J: r8 ^      * 20121018 @yelo- m/ J. c$ H3 J$ S8 z
      * 增加上传类型验证5 |) g" H! a; ~! F) B- U
      */, s6 H  `3 A9 g/ P+ Q% X# I
     $pathinfo = pathinfo($_FILES['pic']['name']);% y; s: c9 f2 b4 }% N1 w# m
     $ext = $pathinfo['extension'];
5 {; x: y$ p% {7 B) ?+ f( M $allowExts = array('jpg', 'png', 'gif', 'jpeg');
  Q. N$ _- w/ e. d: o0 H0 ` % _& ^1 O, {) y8 [4 R: g
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
. S0 K9 y6 T; Q2 k2 {
5 e% e0 M7 l! \4 K8 c; \9 A     if( $uploadCondition ){' b) Q9 S- M) a5 q1 E
     //执行上传操作/ D5 U- w8 I4 u
     $savePath =  $this->_getSaveTempPath();
) k. B" I" F5 z- _* y+ S1 c     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
* W9 u( F6 r: ~    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
$ ~7 g+ `$ j+ I5 ^* s+ a; `       {3 h. Q6 m/ E' |- w- }; n
        $result['boolen']    = 1;/ l8 h4 }4 B+ K* S: i" x% Y: D
        $result['type_data'] = 'temp/'.$filename;
. B2 |1 H, Y+ F- {        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;6 y4 V8 K, @8 Z/ R: D
       } else {
# Q) \5 {2 w- E7 l% X$ `        $result['boolen']    = 0;) ]! w1 x( j% n0 A
        $result['message']   = '上传失败';
- p4 _+ ?  }7 r       }
! `! u$ O* w: y2 w& |     }else{' B0 J) i  a8 k; e2 {! l9 q
         $result['boolen']    = 0;% T9 o; L' I5 E1 `5 R
         $result['message']   = '上传失败';
- Y* z4 V1 i$ [; d# A# |     }2 V2 o, y, C) c  f8 |. x
return $result;
7 n6 o* i6 @+ p" ~! ^# |    }/ G* T. d6 S7 X9 }
6 N0 p$ J9 X. A$ p2 `, D

) V& _8 ~; P6 a% ]) o% ?
回复

使用道具 举报

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

本版积分规则

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