找回密码
 立即注册
查看: 2763|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
" D% o, t  V4 F! k; |1 \5 T6 J3 D# M* Q+ E' |
3 C3 ^5 b8 K2 w$ A' [& N( F
\api\StatusesApi.class.php/ E( B5 ?' T0 l, Z% s: |( f
# M' R- _( X2 i. W8 t: I
function uploadpic(){
1 U  [( s% {9 K1 W4 v      if( $_FILES['pic'] ){& a" V$ [3 M8 Y# p' C! S# [
     //执行上传操作
3 e+ m! j# S9 k4 S, c     $savePath =  $this->_getSaveTempPath();0 |/ N3 V$ X7 [5 p5 d( ]
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
- b. J0 L3 W. |$ m' R5 ~    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))7 g& z% M# M0 g7 T8 n
       {" q, B) O- ]% w3 @/ R
        $result['boolen']    = 1;
8 q2 s+ p  k- f+ r) t        $result['type_data'] = 'temp/'.$filename;
* ~: z5 {0 l  x- m        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
- l. X" a8 q7 b8 O# ]       } else {
8 Y9 P2 B- b( l! v5 R& p" Y4 J        $result['boolen']    = 0;1 T4 k  L! ~0 p+ |# M8 H, p* f, f
        $result['message']   = '上传失败';
! C6 t7 N+ x+ G; z" A       }6 S$ O! s: O* |2 ^
     }else{
1 H% n* ?8 w8 p         $result['boolen']    = 0;
7 {2 ?8 I& v- q8 q& Q8 e. d         $result['message']   = '上传失败';* n9 K+ d4 {8 z7 _
     }2 I" J) z* b0 k2 V& _
return $result;
! q+ B& c2 D& `; M* N    }
2 i3 r4 B9 S, R+ [2 `: Sunloadpic()方法没有对文件类型进行验证
; _! {& e" ?; y. e! I8 |6 L ; \' A& m6 x1 P5 }
可以构建表单, 选择任意文件, 提交到5 n' |- j, h3 U$ e
/index.php?app=w3g&mod=Index&act=doPost* [) X) N; Q/ V

/ `' s# P; a  t/ @在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
" _9 v/ _+ x( y6 Q# \2 k8 G; \: u- i2 I" y" O

$ N8 }7 W) g2 {# @2 ~* x- Y在登录thinksns官方微博后,' V9 \- e0 W) B9 t( D/ ?  y4 I
构建以下表单:$ L4 ~/ B/ s% ]. ?0 a# _& ?: U
! U- `- ]' ], p" q# j4 T
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />; U* A1 z. L2 _, b
<textarea name="content">test</textarea>
( l/ M8 t. r7 `6 Ofile: <input id="file" type="file" name="pic" />, z- P, P% D7 V3 ~8 M+ P# s
<input type="submit" value="Post" />
. b, f* O8 ^+ k6 N1 }0 p</form>
1 b+ y- [: X3 p" g# B) u+ c去掉缩略图的前缀(small_ )
/ w2 y3 C" ?" P" ^; Z6 w​修复方案:- P4 t. q/ P6 N. h8 t
, L. @9 S/ {- f& L, k' j+ y  r. T

! g& |3 _$ J9 s- J: o( `\api\StatusesApi.class.php
' J) o: ^! T0 ?( g( ~
& l" R0 V4 I( ]- ~0 U6 ~$ W) xfunction uploadpic(){. e& n/ x5 c5 A6 S3 N8 w
     /**
; O% ~: \  Q& c6 c, ~1 d+ o      * 20121018 @yelo5 ^  w& o" Y) i* g; d; O+ ]
      * 增加上传类型验证! _/ A: n* q/ u- r
      */9 i/ m# c; A/ `9 \( \* V) W
     $pathinfo = pathinfo($_FILES['pic']['name']);. v& Y* W' l! C$ a) {" Z3 Y
     $ext = $pathinfo['extension'];" X; S, @( A0 I) k/ D* q  Y
$allowExts = array('jpg', 'png', 'gif', 'jpeg');# I; X# {+ B' y! D+ K4 o

/ l( R  j+ C+ o: a     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);& |/ y9 o! F0 D) z! L! n- |

6 z: J# Q- @+ D& W) E& K- _5 a     if( $uploadCondition ){+ T% |+ V1 Y$ K0 Y0 L9 _9 p& v
     //执行上传操作
" p& I9 @5 |, {1 m     $savePath =  $this->_getSaveTempPath();
' {; b: ^% N" ~( V# E$ m3 {# m     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);$ o2 i: d' Y( D. L' |. E
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
! E5 d! a* P, B( y: }       {) Y$ [* F! x; r3 \& A! h
        $result['boolen']    = 1;" Z7 e; V$ v8 U- L7 n) o% V7 z
        $result['type_data'] = 'temp/'.$filename;/ }) |4 g  t, S, {
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
% n) n6 a# s+ v; i3 M       } else {- g1 X9 D6 G8 q/ Z
        $result['boolen']    = 0;
1 R, E. K: _1 g4 z$ {! P        $result['message']   = '上传失败';
6 {! v6 {/ N: [( o) @       }' |$ f! k& r6 L+ c
     }else{. x5 W4 z% u- M; j- o- L
         $result['boolen']    = 0;
6 l+ I+ F& x' Z! P: Y         $result['message']   = '上传失败';) P0 o  r' A$ P
     }/ _- U+ @2 m: |5 Q; q( |
return $result;# F0 v1 m. m2 ?, j8 S
    }) w+ p9 o5 n3 @. j+ D( H! F
8 Z3 @, f: O( ~1 O$ G

- [2 ?. N4 h! j1 W0 _9 L  t
回复

使用道具 举报

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

本版积分规则

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