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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。8 C9 {4 @8 \9 W; H7 @. Y9 z! b

4 x6 V0 ^2 G8 H4 `, N% H" @
" I( L) R; \4 L0 k& j% ~\api\StatusesApi.class.php4 t3 c& @4 S; E, f, H& r( B6 _! l% ?

2 I1 y2 N1 X+ I% v: [6 t& c2 Cfunction uploadpic(){! }0 W; ?4 X# H) J! h
      if( $_FILES['pic'] ){
& ]! e4 t& P# Q/ t     //执行上传操作$ [+ E" S3 d4 T5 N+ R* @% b& |
     $savePath =  $this->_getSaveTempPath();
/ L$ ~3 l/ r" v) s+ Y% x     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
5 \2 G- a7 W2 I! |    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
6 a* k: F" j+ H+ [/ W       {+ z( F8 ~: ^5 C) `2 C
        $result['boolen']    = 1;! M5 k3 [8 x% z6 e
        $result['type_data'] = 'temp/'.$filename;" t6 q" y5 K' N9 P# q; r( O3 v4 A
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;  {# k" \7 }1 ?3 u! m! r8 d
       } else {
  Q7 c+ b0 U* D- r0 A! F        $result['boolen']    = 0;
% g" o8 s0 t* N, o$ @8 U9 ?1 T' H. W        $result['message']   = '上传失败';9 [7 d% ~' \' w7 K1 C0 \
       }$ \7 ?  B9 I  a4 X
     }else{
) J% k! i8 O' X, n  W# |         $result['boolen']    = 0;( g5 P$ P' M% X" [& Y. Z
         $result['message']   = '上传失败';
/ s) n9 L. [) D- g     }
8 U- ~6 i: R- p" b4 U$ \" Hreturn $result;
& n4 V' k) s$ m8 M. i$ {    }
0 j. l0 k: B) N5 |' D& q' |5 xunloadpic()方法没有对文件类型进行验证
2 Z, f8 t' U6 W. [' u3 q+ }$ ` ! P4 }# {9 O5 V
可以构建表单, 选择任意文件, 提交到6 [* `, w' b# d& W  J
/index.php?app=w3g&mod=Index&act=doPost
, l+ O* z5 K3 X
4 Y# m% d, |+ H在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)5 z; E3 ^8 b& e$ a, x
2 g$ |0 z5 M9 p+ U! \
2 I) r& P& ~2 m( ]0 w6 U
在登录thinksns官方微博后,
% t8 n) E  M2 Z& ?! ^构建以下表单:
! K# X+ x; \3 T  u) d ; \, @/ k# V' z  D7 r- E+ b$ i# B
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />0 \! [' Y3 \( p5 h3 f* h
<textarea name="content">test</textarea>
  e3 o' D$ G" q& O8 Cfile: <input id="file" type="file" name="pic" />
( W! Y5 C7 s+ y: i<input type="submit" value="Post" /># ]1 k& ~. D5 U& s- `% d
</form>
( T4 L, z+ k6 V+ q! v6 \( G去掉缩略图的前缀(small_ )
8 u% r9 A* O8 S​修复方案:) N: P- J" b! r% F/ H: ^( P: k

7 g; w# g' _' ]7 k* z! ]) Z9 U9 e1 K2 U
\api\StatusesApi.class.php
2 p, ~1 n. J. ]8 ^! f# Z
4 Z8 P) b# |; ?+ bfunction uploadpic(){( r1 C  B( R, H2 C- Y
     /**4 t$ W( S1 a; B
      * 20121018 @yelo# e% N0 D: H; L
      * 增加上传类型验证
9 [* G; v+ p% {/ x  O) q      */3 n$ S4 O% x  j8 j: f
     $pathinfo = pathinfo($_FILES['pic']['name']);
# T' f/ N7 T0 ^     $ext = $pathinfo['extension'];
, _( O$ h) J5 i" I) a* `; p/ A% C  L $allowExts = array('jpg', 'png', 'gif', 'jpeg');5 y, z, w4 e' C5 W0 u$ g

4 g) U, `) v* T) a8 o5 ?5 V4 l     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);* e: k" F7 {+ K- {, _" ^

+ d% ]9 t- E2 C" }$ H     if( $uploadCondition ){
9 o, H: P% n! ?, k     //执行上传操作  P4 y& s5 C, h- a8 t$ K0 ^; X
     $savePath =  $this->_getSaveTempPath();
- f+ W, \: O. [: L' i     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);" m2 e9 Q2 m; [$ l
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
! |6 a6 `. R5 F! A& s/ @       {  g5 c' t- C* X- o5 C; w2 R6 [
        $result['boolen']    = 1;4 j) I$ m2 v! f) p3 j
        $result['type_data'] = 'temp/'.$filename;
4 G$ b3 e% H9 I* z3 a8 Q. J        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;9 \3 W+ n9 V; Y' d8 r7 T  k: a+ e  |
       } else {" Y$ a0 a4 I* `7 F- ^
        $result['boolen']    = 0;# x5 j0 l% F- X9 m$ f9 k
        $result['message']   = '上传失败';" \$ ^8 F7 F8 O& \  s
       }0 i  h# m2 v  G/ o
     }else{
: z& F; Q/ v# Q, a         $result['boolen']    = 0;+ g2 h* x3 {. A! n* ~/ M
         $result['message']   = '上传失败';5 X4 D  U' y* {( N$ F
     }/ I8 b3 q4 c% k8 H; J7 W, U
return $result;
" C, N/ W& x- a2 ]# T    }  @& o7 L7 x; Q& o) e8 y# q
2 ?* K, b7 F  j3 R/ H

3 l* S& M, G7 z& s. f5 h1 [
回复

使用道具 举报

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

本版积分规则

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