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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
  v* K& O3 u  L  V
' X3 s3 J% v, r8 E1 e   Y  f$ y$ G: p7 D/ \2 _
\api\StatusesApi.class.php0 a, N8 J/ {/ D& ^( X2 h

# {2 _; X. l% E* s6 `! ifunction uploadpic(){) ~( `; E8 p2 ^; _" w
      if( $_FILES['pic'] ){. I# K, m5 a4 Q0 ]
     //执行上传操作
+ G5 Z# ~% y. k     $savePath =  $this->_getSaveTempPath();# `0 [5 l& ?# F6 l" q& C7 F
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);& X( W( Y  ~2 U' N
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
  \. }) [# J8 s( w3 q  \8 q       {
* ?- B  \6 {, K& w$ V        $result['boolen']    = 1;
9 s9 ~, W. n8 Q3 u        $result['type_data'] = 'temp/'.$filename;
% L. ]% g/ b4 i8 Q. ~; `6 m, O        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;0 X6 j/ @' \  H
       } else {
8 q9 x. ?7 D! P3 g        $result['boolen']    = 0;8 @" @6 r* a' H
        $result['message']   = '上传失败';) u: L1 {1 s- {4 W+ [+ P. F
       }/ Q+ d% |  a( q# F9 P' \- ]
     }else{
' w/ P) A1 z; M$ G         $result['boolen']    = 0;+ u5 Q4 l+ b' z4 d6 q
         $result['message']   = '上传失败';
7 [; U3 S3 P; i* j. Y     }& V% J# A- S4 Z! I
return $result;) S% B% S0 D0 Q* z$ G/ w
    }
( T7 `; ^4 W& n, C, U4 _) J2 wunloadpic()方法没有对文件类型进行验证3 h# S/ a9 K) |
! }  t; Q  z# W  ], _% _
可以构建表单, 选择任意文件, 提交到
$ F% L/ G7 q# i5 D. H/index.php?app=w3g&mod=Index&act=doPost
  e9 k% u( d1 X
! {- H6 n+ t& k1 [8 {1 a在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)7 X' K6 V# X; ?" M* O
; ]3 b% b6 [$ O# |- Q. v/ B# w$ w9 B
! o5 p; w* F- ?, Q8 o
在登录thinksns官方微博后,) K3 ~0 N7 j, L: H
构建以下表单:0 p$ \8 C5 |5 g/ |$ a# o! t
4 z2 n) [3 h- Z
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
$ q3 s7 b( ^* ]: N<textarea name="content">test</textarea>$ L, |' S. R3 z  j9 T( O
file: <input id="file" type="file" name="pic" />
2 k* }7 d. Z* @8 R3 X, M+ ^! K<input type="submit" value="Post" />  I3 m7 D; z- W  P1 {$ ?: Q
</form>8 `$ o" ]& [$ Z6 u" N
去掉缩略图的前缀(small_ )
$ E# }; Q) ]; J9 Y# m​修复方案:$ o& c  v  _  ?: r
. S; U/ k! t5 c" J8 l; o3 b, B& W8 ?
3 U, z6 f5 `! q3 ^. w# H
\api\StatusesApi.class.php
9 |  a/ u! q% M7 v! q4 i7 k6 j
( o3 p/ X! E" D; Q3 ~/ `7 l- T1 f" ~function uploadpic(){3 r% l! [$ c; E6 j1 a  H8 j9 n9 n
     /**
% x4 f1 V4 p6 d6 Y2 |+ R$ z      * 20121018 @yelo6 `7 z/ e' g3 t7 q
      * 增加上传类型验证$ }3 d1 G& C$ h% E4 v4 N
      */
& d5 X0 K+ L# _; c) C     $pathinfo = pathinfo($_FILES['pic']['name']);# s( I& j+ B( e# X7 ^- x6 x
     $ext = $pathinfo['extension'];
& b0 f" P# F; m; n. k: Z# K $allowExts = array('jpg', 'png', 'gif', 'jpeg');2 o  ?2 T- B3 p# a' f( Z6 d7 I

& P: o; V7 u! D4 t     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
0 U; u* I& U# ^ 8 ^  q2 ]6 M: ^# w
     if( $uploadCondition ){
5 c) a; u; [# b  @0 N# l7 L9 U     //执行上传操作: S9 C% v7 r; C; u
     $savePath =  $this->_getSaveTempPath();
  V0 R9 V# `0 H& R     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);. d/ a" ~  d& P
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
- v3 ?2 O6 Q. F( P0 ?3 }       {
# u, p1 G. i& A* B4 U        $result['boolen']    = 1;
- P* v! W  o8 h. n# c7 _        $result['type_data'] = 'temp/'.$filename;
5 a( q2 U1 }1 ^8 ]9 V        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;& A; R2 Z2 ]# v& z  M4 _
       } else {- r0 }* \7 H8 x  v+ S& }
        $result['boolen']    = 0;9 V$ j9 S/ i; c
        $result['message']   = '上传失败';
9 e9 a5 D2 i6 \& H  z       }$ Q: e; k" m1 ^$ ?5 x- N- M' w
     }else{
5 [/ c3 Y1 U! a. a         $result['boolen']    = 0;9 h7 V, j3 n6 F) Y/ c( @' Q
         $result['message']   = '上传失败';4 W+ t! s* f5 x
     }( @4 f% i  p9 o+ O
return $result;5 Z/ k0 N  C" q$ w# ?
    }
8 {* R: |/ |' b5 Z" v" w- F) N  ^4 F( j) o

1 U" ?# L, L  t$ E" V) F0 |9 v
回复

使用道具 举报

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

本版积分规则

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