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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。1 Z% B, s( p* M- f; ^" Q2 @

: r! L/ }' O, ~6 V& I! a 0 P/ O! O$ `* p* ?' @- D' }
\api\StatusesApi.class.php/ `% V& O9 V6 y7 }! Y5 W! H& J' V) _

9 `, X+ d1 C0 H2 X* \function uploadpic(){2 G6 ?% j! N/ h6 U
      if( $_FILES['pic'] ){
3 w( ^# G  J. k9 S9 ~7 m" k) h     //执行上传操作
  L/ w5 k( O) j. q     $savePath =  $this->_getSaveTempPath();7 r2 f5 y; A' y1 i4 h1 ~# U
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
% S% n# f4 p/ E2 F( t+ Z    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
- ~, U( b% T1 D7 ~& a: j! \5 V' T       {$ Z2 M3 f- x! Z8 V" H" m! d5 G
        $result['boolen']    = 1;
2 n8 q: K2 s/ ~8 I        $result['type_data'] = 'temp/'.$filename;  l- Z" O( t- u& p6 {4 t
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;$ v$ ^1 Y! N, u- R2 ]  P
       } else {/ r0 m. }; ?, D9 C, V* B
        $result['boolen']    = 0;) r7 n1 M+ t0 G( A/ |- N
        $result['message']   = '上传失败';
6 f& P& [5 }% {5 Q       }
' O% j* i" q0 N8 G! O     }else{
( u1 K1 C2 i1 e  Z6 |         $result['boolen']    = 0;
; ^5 n* g/ j7 z         $result['message']   = '上传失败';  I6 k6 U9 }7 l/ t
     }9 _2 s9 P* \  d' I) R
return $result;
4 I2 t% U0 B' i' f- ^' H    }
6 H( X7 F/ V1 [- z9 Dunloadpic()方法没有对文件类型进行验证
* A8 @4 ^$ R$ r" Z4 s8 T$ C$ |3 [3 i- f % i# H9 w. k) d
可以构建表单, 选择任意文件, 提交到( Z8 N' U) N5 ]# _2 T3 n8 o& M7 Z
/index.php?app=w3g&mod=Index&act=doPost
* \- Z# V& }4 ]+ f
7 s4 b$ f7 s2 t( H在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
1 ^7 z! }  H9 V- M; m& ]
& |' Z9 {% f+ C7 }( d+ h) c0 R: X) \0 o% S" @! o
在登录thinksns官方微博后,
. G3 ~' E' N5 j& I7 Y2 N构建以下表单:% |3 U& r  c' i2 f! z4 _

1 O; ]8 h7 P" ~" n% F& l" P/ i<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
0 F) M9 o! Q8 D# x, `* ~( n: n6 J/ c" ^9 C<textarea name="content">test</textarea>
% v( ~4 d% l1 |  {- _! ?file: <input id="file" type="file" name="pic" />
9 B( u4 ?% O1 g, A$ m" X9 |. o0 R<input type="submit" value="Post" />( P) d6 [, d6 n/ I/ f8 m. Z% @( B2 t
</form>  A/ e2 A5 n) a9 F  ^2 L6 C# c
去掉缩略图的前缀(small_ )
4 Q' l3 Q* J" `$ B2 r9 C7 R​修复方案:' Q# @+ B- |! y  j* w0 L

& ]6 V$ p) K" \4 e: i7 A6 O8 m/ Y' g, N
\api\StatusesApi.class.php0 c! r7 X# _; H) w* `) ^3 R

9 a% C0 v2 S) o' M7 w7 A' W8 L( gfunction uploadpic(){! z* o7 b3 q, }9 X7 ]3 K
     /**
  L6 {- y1 S! |* }/ }, S( e3 G      * 20121018 @yelo- U4 C" S* W6 ~: n
      * 增加上传类型验证
3 [+ }1 g  z4 P% ^! O$ R5 Z+ ?6 k5 Z      */! v, m$ Q4 P$ l  M$ f
     $pathinfo = pathinfo($_FILES['pic']['name']);, F& i2 _& Q) P( Y/ F
     $ext = $pathinfo['extension'];
. N, C1 P' G) S7 @3 G8 P) K7 ~ $allowExts = array('jpg', 'png', 'gif', 'jpeg');
% y+ a8 W  H' O5 m. h0 x$ ~ % V2 a' M2 [, _5 o) f
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
% a$ ]" ~# V1 E0 c
1 K7 k. Q2 E4 c! u     if( $uploadCondition ){
/ }" M1 S* w9 }4 f     //执行上传操作
! H% N1 X. _+ X. T4 L7 J/ K5 x5 ?     $savePath =  $this->_getSaveTempPath();- ], }5 U- A0 c% \  v. R' [
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
$ H! s" X* s  @    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
1 ?; S2 E9 O6 n; l- e       {" [' K; Z+ B4 H
        $result['boolen']    = 1;* y) ^  O5 L+ i! x6 `4 Z1 @. r8 g
        $result['type_data'] = 'temp/'.$filename;) O% |* E; F; q1 @
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;, ^3 l+ W2 B$ f) E+ {. ?/ n* A
       } else {
$ j) s) z1 I- U* k        $result['boolen']    = 0;! z2 t$ b- R1 M# Y1 S0 F2 v- \" e
        $result['message']   = '上传失败';! ^6 Z( y. A" y* I# Y6 P
       }
) K/ y. p* e7 s' w6 Q. P, N* ~8 X     }else{
' v: _/ g# C; v$ R* O* J         $result['boolen']    = 0;7 u, E) F# f0 k1 H# G+ R% g! k  K/ \
         $result['message']   = '上传失败';% c8 g3 Q0 ?% m
     }
- D- N2 }; V* E3 d6 u0 p- d' ^return $result;
& d. O2 \- @/ o, M& E    }$ F) T. r" k$ Z

4 z5 Q8 W* B7 b% t) e6 l( }: P# W. s- ?
回复

使用道具 举报

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

本版积分规则

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