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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。( E! O5 X! N0 h1 i9 {

/ t4 Q4 x, \* d8 _' v4 q4 ] % f5 _# `; M* ]2 g3 p
\api\StatusesApi.class.php
: B4 @6 H5 s) I& `8 B* E7 t
. d4 o3 z$ p& f/ c  s  @function uploadpic(){
5 G" ~5 {7 W5 S; t4 W8 A      if( $_FILES['pic'] ){
8 x& k9 x" ^7 C% {2 V! S     //执行上传操作) z5 T) m+ A  \4 `, C" y
     $savePath =  $this->_getSaveTempPath();+ d! v/ `+ @& ]) ~9 i7 {
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
- s0 O- n) K* {# N2 Q* F* ^3 Y    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
% M, o& H8 {) f( p& J# ]5 S* `       {
! u% r, F1 H- z, j8 v        $result['boolen']    = 1;8 o& T: G8 a5 W
        $result['type_data'] = 'temp/'.$filename;
# v8 W" D% K* K; ~        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
2 W; ^: q2 M' R" x' q- x+ F       } else {2 T$ L0 w% U) b$ Y, v5 u
        $result['boolen']    = 0;/ Q/ E( X; {: ], b7 H' _
        $result['message']   = '上传失败';
) y. O4 s& C- o& O" q       }# A& o0 m1 Q  p( d# T
     }else{  U- r: o  E! \1 P
         $result['boolen']    = 0;
% x% Z4 t. I; D& [( Q8 s         $result['message']   = '上传失败';
. w' n# r: j  \( r. l) [     }+ z; V$ H; K4 {& r; J2 y) v/ i
return $result;
) M  P5 ]3 `+ I3 y    }  A* u+ Z4 N0 y3 N3 x# h
unloadpic()方法没有对文件类型进行验证
/ x! i+ c9 p6 Z" S; x  J6 x
0 x& [% x# A) U; |1 `可以构建表单, 选择任意文件, 提交到
" ?2 M% t. J  l: e% ^/index.php?app=w3g&mod=Index&act=doPost
, Z) M1 z+ L+ C
8 I7 ~# ?8 J7 d3 ^$ a在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)' [4 w: _% F& M& I/ c2 C

9 }. |# G1 _' w1 \: I# ~; g5 X; r: P
在登录thinksns官方微博后,
6 i! D! p* A) t- ~+ V5 A: |构建以下表单:
1 t9 O4 M9 r8 r : y. k- w9 h4 h9 q/ l0 @
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />) z9 Q. `2 U- E& ]3 t
<textarea name="content">test</textarea>) {8 X/ q- `; v) K& u0 V9 c
file: <input id="file" type="file" name="pic" />  e! q* @  A# E9 }" k+ Z
<input type="submit" value="Post" />
& x- I- j4 s: d% o</form>
  i- f6 O) s! q" s) o+ C去掉缩略图的前缀(small_ )# u3 N4 u* }4 O2 M
​修复方案:4 c& ]8 a3 u! w8 b

4 Z4 J, g! a% i6 K6 L( L' Q! O+ p/ W1 g7 j& o
\api\StatusesApi.class.php" s6 X1 Q6 r' C' s* x4 I  N
, J1 X/ @' t( p9 Z4 H& e1 P
function uploadpic(){3 g* U# D. {8 a8 L4 Y" V: e( V) S
     /**
$ I, x3 S2 F' O2 g" I      * 20121018 @yelo
' ^; Z8 r; f5 E# ]      * 增加上传类型验证+ d! R' G1 v( P/ M0 y+ t
      */  b! a7 ?- x6 T* \) B
     $pathinfo = pathinfo($_FILES['pic']['name']);
" Q$ p& L, v( X* b     $ext = $pathinfo['extension'];
# ?( ^% H( {9 B/ k. s $allowExts = array('jpg', 'png', 'gif', 'jpeg');
' `+ \1 l4 A* E  c$ m5 n* }/ u
- ~5 m# ~( ?5 x0 K5 D! G     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);2 Q( E# Q3 V. S5 ^

4 v! N% I* T1 \' Y5 y     if( $uploadCondition ){* M: G; ]3 g7 O
     //执行上传操作
$ [! R( K) L% Q$ f: a) L- K     $savePath =  $this->_getSaveTempPath();- Y! E7 `7 P" ^  N' M
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
5 P" n. \& N& ]2 J( t/ ^' E    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))% V1 g8 g4 k$ C  j, A7 n  m9 g
       {
  Q' K, d6 n  A' q1 W. ?$ g8 j6 v( Q        $result['boolen']    = 1;- c* ^5 K8 g+ M3 V7 R
        $result['type_data'] = 'temp/'.$filename;5 C6 p/ w- H) s# q4 Q
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;0 U0 u1 P4 {# h) d; o) j
       } else {
, m( i, D0 _' E/ S+ c  ~, Y        $result['boolen']    = 0;. l. M% n' O" j2 z# ?
        $result['message']   = '上传失败';
/ R# w+ J4 O! n/ Y       }9 \! L2 J1 V: ^, A
     }else{
% S( e+ @5 R* Z" a/ F7 {( S. T         $result['boolen']    = 0;
# X8 S% B! P: Z7 ^         $result['message']   = '上传失败';0 }" Z* U+ G* _; s. `( ]
     }
7 @; e" L4 z7 W8 R3 ^return $result;+ d7 |( V* i# h7 J9 d" B! R
    }
8 M  ~5 ^8 F8 U. `+ i2 \. v% r$ i4 p: G

( d- \) e* M9 H  a6 @/ s
回复

使用道具 举报

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

本版积分规则

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