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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
' X) ]8 S. _) P& R( m9 f
; G' {. `. ^. W# y' a% ? 8 B$ m  ~, _9 E, x
\api\StatusesApi.class.php. d7 m4 u* s: K& i% a
3 x$ }3 M4 E" l# A
function uploadpic(){7 S0 F3 H) s* ^8 q# C: L# S
      if( $_FILES['pic'] ){
& ~3 r8 y: m9 K0 b: ?     //执行上传操作
6 P" j1 l. r2 ]+ J9 P     $savePath =  $this->_getSaveTempPath();: h+ p1 Z3 M: H7 j
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);9 M/ C" U& W5 ]
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))4 Q$ K/ k! Q3 a  {
       {3 V+ q0 t/ Q4 @; G
        $result['boolen']    = 1;7 A2 W' T) F5 ]4 x1 \' w+ ]* k- P
        $result['type_data'] = 'temp/'.$filename;) Z4 g' a& P7 q
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
& ?7 k: j: ^) {7 b       } else {
$ w& w/ U8 v7 {        $result['boolen']    = 0;
; i2 I, n# W, O' z4 s: p7 ]. s* [        $result['message']   = '上传失败';) K' y9 j5 m5 D
       }
. {; r* b/ X3 O" M2 Y     }else{
. X* _, h. f; p0 M         $result['boolen']    = 0;" d1 D7 O3 c. @: f+ L7 s% y
         $result['message']   = '上传失败';0 v% C6 w- Z5 E
     }
3 t, ?$ x# k# ]) ]0 P5 L' D  {7 ireturn $result;
; h/ U8 S8 m& U# x  v; X3 S    }5 e( d. F) b; M/ }: @$ H+ H5 Y/ X) s# _
unloadpic()方法没有对文件类型进行验证
# _/ Q6 T0 \5 M$ p" ] 2 F" ^; H$ m* f( r  O; J' j
可以构建表单, 选择任意文件, 提交到
# p" I0 |# L/ Z' E8 D6 x/index.php?app=w3g&mod=Index&act=doPost
1 m% R, W! `: A
; N5 U* S: @9 f# h% K在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
4 v8 d3 i/ P% ^* \/ z9 C% E/ x4 f
0 x! H8 o4 D2 z5 l3 `, U9 P) M5 s
在登录thinksns官方微博后,, M- o1 P5 I: O  @2 F6 \  |
构建以下表单:
* _: }7 |) n, ~+ S! V " O4 Z4 l" a6 Q6 f8 @7 m3 Q
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />$ z7 J$ V6 e* j+ C  W: G
<textarea name="content">test</textarea>
0 A6 Y  l1 F' N) Pfile: <input id="file" type="file" name="pic" />
: [0 {& s, Z' X" X  i' Z" f<input type="submit" value="Post" />
+ l7 J7 W/ [3 B6 ]) U</form>7 P: ?+ j3 Y6 g9 j8 v0 C# _
去掉缩略图的前缀(small_ )/ C4 x8 [# F% \* ?, C9 }- B
​修复方案:2 P+ y' e6 r6 v# X3 i2 `* I4 q8 b# q

+ y8 d, j$ J0 X
! f- P4 h! g. x& c% B" x\api\StatusesApi.class.php# {; w) J3 @, N4 N: o2 H
& H: R; l  F1 d( Z
function uploadpic(){: J  X% |6 P0 Z5 _- K" L
     /**
0 o. l( u; M- F% f6 m      * 20121018 @yelo: j. F2 e, ]( |; i
      * 增加上传类型验证
) I0 F# c3 ~4 ^7 u) j4 y: z4 V$ i      */: @" L# ], ?5 G- y! G& ?
     $pathinfo = pathinfo($_FILES['pic']['name']);+ B6 s" x) T5 A
     $ext = $pathinfo['extension'];
! ~* I0 t( i+ `: X $allowExts = array('jpg', 'png', 'gif', 'jpeg');+ {; G9 d6 @6 Z" @; Z" l' _  {

$ m* p7 u5 b; u3 ^3 h7 H  C     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
' E# B5 w7 P, f 6 c+ Q3 J2 l, H6 w
     if( $uploadCondition ){
+ w/ h+ Q& ^6 l! m9 m& s2 U     //执行上传操作* g+ Z6 T6 w' y8 b3 u6 x
     $savePath =  $this->_getSaveTempPath();
* t% E* s( A' p" V' K     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
0 X6 f6 X" h7 ^; }! W3 B    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
, U- V# F9 k, s3 B( e. W6 ^  \       {
( z- x% u( y; u! N4 ?        $result['boolen']    = 1;& ?( q3 B3 J- H4 e
        $result['type_data'] = 'temp/'.$filename;
/ ?& R/ t& E, z! `        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
' u- {( R3 A$ D       } else {
# i: {( p. d) N& l, I        $result['boolen']    = 0;' [; y/ k) n' u( h$ l8 |
        $result['message']   = '上传失败';
$ o) C# I- \- f       }
+ y5 ^. d* {1 h3 y! Z8 \/ Z     }else{; h, G! l, b& C. ~4 R
         $result['boolen']    = 0;
) r. [  |; T& V3 B" T         $result['message']   = '上传失败';
; s  h# O" \, L, j9 B, Q+ v# u9 q     }% R; D) I/ \" h, s. V7 e
return $result;1 O% }; g( t6 v# y
    }  I4 K) a6 f/ [6 ]

; A9 ~& p: x+ p
1 L8 t( R8 p4 Q5 J; V3 `/ K7 R
回复

使用道具 举报

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

本版积分规则

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