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

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

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

/ `* t& c8 T8 V" m- X: i + m9 E0 r$ S2 o4 Y
\api\StatusesApi.class.php
9 v: ^5 ]" }. _; j3 Z% I  M+ X & o% o4 b  v/ J( X
function uploadpic(){& F3 `# F1 F/ {- c7 B1 r6 w
      if( $_FILES['pic'] ){& q- D9 K9 t4 _( U9 Q
     //执行上传操作8 s* t- F, ?* h
     $savePath =  $this->_getSaveTempPath();, B. q, Q! @: ?
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);5 ^: S( n+ G& X$ F+ o: U6 v8 q
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
1 m; {' N: k, b6 i# }. A9 A/ I4 ^       {
0 L. d! X& }" G        $result['boolen']    = 1;
4 }  c- v: M( I7 _/ a        $result['type_data'] = 'temp/'.$filename;
, H( z* V# q' S8 c- C        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
6 k$ Y1 O5 |& [2 [       } else {
1 ?' z, v( f" J5 N" _! V) H        $result['boolen']    = 0;6 N) @9 X3 Q% Z
        $result['message']   = '上传失败';
% t8 A" D; z% I( P& {. s, t( F  I       }% @; \* ~7 ?* h
     }else{
( T- y0 t& W5 [2 m; }1 i- R         $result['boolen']    = 0;. L' x- X& F0 U; j" N: B
         $result['message']   = '上传失败';" C( d3 U. I6 g3 [
     }% s3 n9 a; N% p- c: ~- h9 c) u
return $result;
8 t% n; d6 d2 ?# t0 S    }  X1 e. |  J( {) i$ n8 X7 M
unloadpic()方法没有对文件类型进行验证
: _! j, o  a  \8 a, L' f( O, u. A 7 o4 ^8 P1 B9 w! j4 {% b
可以构建表单, 选择任意文件, 提交到
' \# G) \! o% R/index.php?app=w3g&mod=Index&act=doPost6 }# {  _3 ~; c+ t1 M/ A* I) q  F8 y

, h( \+ U( C, \! g( T! v! X在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
$ m+ M2 R$ W& ~# M1 A' y3 w8 j( m1 d; K; L* a7 R" y( o. w
& }1 W9 t  a, o7 |% X
在登录thinksns官方微博后,7 E7 ?. I% V5 L
构建以下表单:
0 j. k. M0 S9 {2 M # W9 B* I  |- i5 ?5 P% @! o
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
/ u& j7 z& {. ]9 {* K' m<textarea name="content">test</textarea>& {' f* U' ?1 ^( v
file: <input id="file" type="file" name="pic" />
& M' e+ Y( o. @  r1 i1 a. P  @% |: G<input type="submit" value="Post" />
' C# p6 o0 o# B, N</form>
8 `3 |4 g3 \+ N去掉缩略图的前缀(small_ )
5 x- y! Q! ]) b, _- P. P​修复方案:
  D; x. x1 ]) z2 G+ |, L7 w( E
. {1 ]/ M+ z; j% `0 _, ^# O; {! \) z& X
\api\StatusesApi.class.php3 [5 }3 V4 [) ?  X( b2 f7 [' w

  h+ j4 j( {/ u+ L2 W$ |* Z) @function uploadpic(){$ _* X  e6 R, R+ l4 ]
     /**
+ C& o6 o5 A1 F+ S/ D      * 20121018 @yelo
3 m) N# p; n( u9 d( E5 E, s      * 增加上传类型验证) S6 c6 ^- r, y2 Y
      */
& h- u9 H2 E2 O8 m9 K     $pathinfo = pathinfo($_FILES['pic']['name']);
. W  o) @+ n9 Z* B6 K     $ext = $pathinfo['extension'];
: f! o% e) r, N6 o $allowExts = array('jpg', 'png', 'gif', 'jpeg');
1 V( ]6 p( b. V: Q% ^2 Q
& r, o  L- T. p, R     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);8 [9 B' _( I# Q. E- `! ^

2 l5 J2 b" a# i  V. I( L' ]: K2 v     if( $uploadCondition ){2 e. e. a# x! J5 m1 v/ `
     //执行上传操作, N( n$ K- r$ s1 a$ B6 O1 b
     $savePath =  $this->_getSaveTempPath();
7 g  X$ O# u/ c1 U. l1 o3 M8 S/ n     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
) @& A4 x* W" {7 v1 [    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
5 i& T) N, S  Y" ?9 z7 H       {
2 l5 V8 F0 M8 F' L& A        $result['boolen']    = 1;4 u  M8 |7 K* z  D
        $result['type_data'] = 'temp/'.$filename;
& n$ i8 G+ M7 l+ f        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
1 U( I1 u2 Y; W       } else {7 `2 o4 [8 S, _% L- w
        $result['boolen']    = 0;
+ X% S0 O1 X& z2 v- S0 A        $result['message']   = '上传失败';
& T' H' P/ U7 E  Q       }
- M7 p( L! d7 z) \) G" q8 A     }else{
2 f+ Z( G1 U% i+ p% G         $result['boolen']    = 0;
, c% M5 |% Q/ n3 A4 P' O/ M2 w% ^         $result['message']   = '上传失败';
$ `3 @6 K9 K, B) m0 [/ c; F( A% C     }% D' h  H6 b7 I- S  z
return $result;7 O& x. d( j( J+ b2 t# n7 B
    }
' O- g  W# P( d1 O1 W
, x* @% ^' C* x7 H& c
& P" x8 M7 ]" y! }: r
回复

使用道具 举报

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

本版积分规则

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