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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。9 Z$ o) |1 g# W8 @% X0 O3 }

# M# C" P( E* H- ]' Y 6 o7 K9 z$ |& o4 f
\api\StatusesApi.class.php
* x5 I! X/ a% d1 N3 U0 Q/ \* ~% F+ m
# I. V! ^! b2 o  g: Y1 S- Z; C/ Wfunction uploadpic(){
5 M& ?$ [4 ?, c: j      if( $_FILES['pic'] ){
4 b" P8 V) I/ r/ r- F6 o/ P     //执行上传操作& Q) r+ u5 o; J) F% W% [% |; R
     $savePath =  $this->_getSaveTempPath();: L' }0 R# ~' {6 D! Q, I( d- {
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);3 n' b: {' p5 j9 N# Q5 O2 U: W5 A
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
0 E, w9 W, `6 R% p( ]' b0 L       {' L" s4 b( f8 ^9 q( j4 j
        $result['boolen']    = 1;
& v* n. `: ?7 g, r" Y) K/ q' n        $result['type_data'] = 'temp/'.$filename;3 H6 C* ^7 L) v% i8 Q9 R
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
% e# f, a' `2 }5 ]9 r" s1 [       } else {
( I6 Y) I" \, w- k; ]) ~        $result['boolen']    = 0;# L/ z1 t3 n; V8 F7 _5 R8 Q
        $result['message']   = '上传失败';0 ~* @1 U, d5 Y/ C% h- |! E( Z' B
       }
7 b* E) a8 v7 M  O     }else{
/ \1 f2 o5 x  u0 J/ w/ z4 j         $result['boolen']    = 0;
8 `; |( z: i7 u: e5 B         $result['message']   = '上传失败';4 s: G  s# _% x
     }
2 [) v  G1 [7 v4 ]8 lreturn $result;0 Y. K% R3 |0 v* {8 [
    }0 l) t: ?( E- T' }" S3 I7 S
unloadpic()方法没有对文件类型进行验证! z5 @6 Y- N# ^, ?0 }
8 A0 }  `# O% |1 N% b+ _
可以构建表单, 选择任意文件, 提交到5 ~1 ?& _+ n7 D2 ~
/index.php?app=w3g&mod=Index&act=doPost
$ C5 d7 Q5 A1 H7 {- G1 Y) ^( C
( W6 d( V& e; R+ y在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀), {; d( Q1 I" k% f9 @3 t
, y3 `; Q2 p0 _0 y( c: [( L
: L$ D* N" V" b  G* O+ [
在登录thinksns官方微博后,, M+ M& G+ D0 G* o( c; r
构建以下表单:! J! N9 D: ^; s( t; ^
& D: `3 |2 n1 u( `4 N$ u
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
" z! Q! I; L5 r& q<textarea name="content">test</textarea>
) Q: e% E; D& ?0 a' g! Vfile: <input id="file" type="file" name="pic" />7 J$ s2 g. V( k
<input type="submit" value="Post" />
1 d+ M% Y. D3 W0 n: r* w</form>
7 G( ~, }) e% z$ T0 R' e$ Z去掉缩略图的前缀(small_ )
+ R) W0 @1 }! }2 _- O3 I​修复方案:- O. Q/ q# _: ~2 b2 e
: C# n! V; d! n; I

0 C7 q/ M0 k; x9 S0 t. j+ k\api\StatusesApi.class.php
, u9 L4 T7 P7 Q4 q4 F
- ~/ T' S( d$ d" B' k, P8 l, a4 e9 ffunction uploadpic(){& w7 Y' L* A" B9 \
     /**# Y( P5 d8 C8 u" p) |
      * 20121018 @yelo4 W5 f- b  o# G+ d3 z  N' i" ]
      * 增加上传类型验证
- Z. ^  E3 S" K+ t1 H/ t( _+ I1 ]      */
1 g( N7 |/ D3 W% D     $pathinfo = pathinfo($_FILES['pic']['name']);& E; u3 g4 [5 R& q
     $ext = $pathinfo['extension'];
2 r: A- u' q$ L. k $allowExts = array('jpg', 'png', 'gif', 'jpeg');
* l" w! H  `2 ^( f* {
+ H1 k& |! C+ O4 ?1 ?3 B4 p( s     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
4 q2 }- q% c1 z- s: l% |2 o * r, {4 F/ G6 I" \" `5 w
     if( $uploadCondition ){# l+ s! I; k' H! z
     //执行上传操作
7 J, u+ ^; n0 e/ ^* E+ q     $savePath =  $this->_getSaveTempPath();
7 ^5 ^9 |& ^" g     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
8 @0 J: Q# `( `- t" s    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))/ H7 m0 q( Y# B5 e
       {
3 F- T+ _- U( k4 ]9 I4 N/ o3 H        $result['boolen']    = 1;
; {9 c9 c5 h4 A+ s' z- [        $result['type_data'] = 'temp/'.$filename;
# S6 T  `& I% V& X8 t; s1 X! V( k        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
& x+ u3 h8 x4 U! Q, d8 ^! F3 o       } else {( m- r4 u" a0 r
        $result['boolen']    = 0;
+ K  O9 N. b; o) Y/ }        $result['message']   = '上传失败';
4 {# R# M, E- M0 o, |+ b3 l       }
+ R/ O; F- @. M! ?: ~     }else{
+ V$ E$ q3 E1 d) `2 P- d" C+ O         $result['boolen']    = 0;& f9 u7 O( M5 {5 ^4 U
         $result['message']   = '上传失败';) F- u3 E- b. I. u2 ^) @
     }. s; V5 u7 l7 D  g/ f- V( N
return $result;* o+ Z8 s( a( S0 p& w1 B
    }! S+ M4 m" i) B! k
; L' J. Z& n- r4 P; r. J6 ?" x# l

7 s6 A+ o; u) W2 D% @( h7 \1 @
回复

使用道具 举报

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

本版积分规则

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