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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。" f# g# X3 j' ^, ^
" U- C. S( a! m- G7 l
) A) o" J3 m( M( `$ V+ ~1 L
\api\StatusesApi.class.php
1 x; p& |; H" B$ Q4 A7 \8 S ; Z% @9 W/ [! `& c
function uploadpic(){& a, |/ v# I: b8 l8 b4 y3 `8 d
      if( $_FILES['pic'] ){9 I" s( r' T+ g' m8 y
     //执行上传操作
( `" j7 `' z- J     $savePath =  $this->_getSaveTempPath();. Q2 T8 a/ e# {
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);: {2 @9 d6 t2 W9 ^
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
/ @2 D3 V* _% I2 N% f       {$ o* ]1 n7 {: \3 c+ x
        $result['boolen']    = 1;
: J+ A0 D6 ?' P8 K) Z. F        $result['type_data'] = 'temp/'.$filename;
% c; l) A0 b* ^9 }        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
7 s& ~4 Y1 A% V       } else {
. W- b; ~/ X- P1 Y        $result['boolen']    = 0;
6 [- b( t& `* f# ^0 e5 j% W3 T$ R        $result['message']   = '上传失败';6 l, Z2 s# o. ^8 O& S# Q! ]$ o
       }
% f1 s# M" G. Q" Y* n- T, o     }else{' ]& S6 h  Z" }& L1 \* s7 Y% X( m$ Y
         $result['boolen']    = 0;/ K% n$ {0 H* Z' D: J! \
         $result['message']   = '上传失败';
1 y+ p' G+ @, l" ~/ J2 `  W8 z     }
6 o. c6 C( B4 Vreturn $result;! Q& d) R3 B4 C2 x" l8 W
    }# I" o) M- e) D' @; ]' @
unloadpic()方法没有对文件类型进行验证/ E8 F. V# V- Y3 @' u

+ Y7 d3 m/ D  N5 h! H可以构建表单, 选择任意文件, 提交到
; o* r  q! y! e2 p/index.php?app=w3g&mod=Index&act=doPost. Z( K) q1 r% D' h) @( r
$ f( E; x8 g# ~( l
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)% ]2 E' ?! E# e6 [# G  Z+ B

0 L+ M) i! y) h/ P$ E/ @) [% }
, v  t. S! w) f7 K( }1 T! c在登录thinksns官方微博后,
! T' U! n$ z/ [0 B2 T6 m/ [构建以下表单:3 S/ B% e9 G# B! c
& l3 }0 }; d& ~: E" m+ N
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />1 r0 N" k2 [7 ]) ]; K
<textarea name="content">test</textarea>
5 B# P0 k9 V1 H, U* pfile: <input id="file" type="file" name="pic" />4 O' Y& c+ c5 t) M+ L; m
<input type="submit" value="Post" />
% z: g2 E& L4 z/ v4 p" Q7 t7 U</form>% P8 H5 L& N8 C# P4 _+ H7 ^
去掉缩略图的前缀(small_ )" i* U8 t( H" G8 ~/ S
​修复方案:
! h. P  P% ]) f8 z1 M
. P4 R  `9 o: b! ]; R: \: |; R. Z. V4 F6 U% W
\api\StatusesApi.class.php8 ?! l" o! S; q

! H% P% Y6 L* n! Afunction uploadpic(){
/ a3 L& \2 t, C' b8 a( y2 }  a     /**
% Q* E% u* X2 z. `. q      * 20121018 @yelo
3 ^& `# [5 w$ y. K! `. a' \1 A      * 增加上传类型验证( J7 \6 S3 J/ i8 i( |
      */
. D1 j( W  H) Y0 r     $pathinfo = pathinfo($_FILES['pic']['name']);$ J% T8 A4 z6 G/ b
     $ext = $pathinfo['extension'];" w4 C( A! z2 T: ~! x
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
5 G2 ]8 }4 E" L. ]& o& @+ Z/ R 1 ~; C7 z+ m9 P: O+ R, ?% o
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);/ k5 i& _* l% D" `

; A& |% H! ^  e. T& f     if( $uploadCondition ){
6 d% ^2 H2 n9 }0 s- H$ E  H     //执行上传操作, X' ?+ S5 O9 [% k, V# L5 X- X6 v5 g$ w! k
     $savePath =  $this->_getSaveTempPath();$ A& Z9 N$ h9 R% b. K, M) y
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);; `; U, u7 A9 F" v
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
" V! ^9 K- Z( W  k+ C8 @" A       {
2 d: ]% O' y/ V) L4 o        $result['boolen']    = 1;( s- a1 H8 I* d. f* J! X) z3 c
        $result['type_data'] = 'temp/'.$filename;
* y$ E& {1 W5 k3 l; E        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;4 B$ l) N9 \4 w- R0 ^4 _3 a( N6 m/ h4 ]
       } else {
( s- X. N, Q1 w% A2 U% o- ]        $result['boolen']    = 0;
# q7 L: [- p! f0 p" ]        $result['message']   = '上传失败';
9 h3 B8 _$ @) j# u/ p7 p       }
7 Y: X8 Z# @5 Q' c1 a/ `4 N7 b1 Z     }else{1 b! |! O9 o1 [) U5 d
         $result['boolen']    = 0;6 o) |7 A; F. g7 x- z2 n! |
         $result['message']   = '上传失败';
" I) A& C3 R. X4 |     }
2 S, N: t1 [7 _( ~% n7 Greturn $result;0 F, O0 a7 x! a3 y/ `3 E
    }
8 v; ~6 w# @. b  u* d  G5 c! Z& n7 N/ k# F, ^# G' I

2 N: s& @' X" v
回复

使用道具 举报

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

本版积分规则

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