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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
1 i$ a' s8 [3 b, I% R4 c/ v  h' U1 @' d! K- Y' ~# z  M3 a

% f3 x4 L/ b( Q/ U/ l$ a+ H\api\StatusesApi.class.php
, X3 S+ I  ]0 \$ O0 d8 c 3 E4 C! Q: E7 [" N' A& w& r
function uploadpic(){
4 B. A) `0 G% ~/ r, q& I3 f      if( $_FILES['pic'] ){
: W9 _0 {0 D% d     //执行上传操作
6 Y% h. o% X, `" ~" R" q2 R     $savePath =  $this->_getSaveTempPath();9 ]* B# w; T9 U, P( a
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
( p1 e: S  J+ ?' c4 Q  F    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename)). t) c6 S: G$ G) Z
       {
: w0 o% P8 K4 w7 F$ Z! \& h! K+ r        $result['boolen']    = 1;& u, y0 [) t+ U! N& t# F( j  z  j! }
        $result['type_data'] = 'temp/'.$filename;
! }. i& N! t* I5 u! @$ j$ K, k        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
3 h$ n/ ^: N3 i3 ^       } else {
4 D% f$ r2 O% l/ k        $result['boolen']    = 0;
9 `7 C; z; i* r; T        $result['message']   = '上传失败';  a% J! Q8 }% b7 R9 f# ?5 g* L
       }- k) \  T; w* q; {( @
     }else{3 v) W" i5 O- v) N: f  U/ r
         $result['boolen']    = 0;
( v1 k0 E4 ]  f* }# J         $result['message']   = '上传失败';
% W+ n( N9 q2 l$ H: c# D* O) b     }
3 Y  l  e5 s$ Jreturn $result;
% n+ q8 k7 c! t    }
$ a3 D2 v; w* t7 Runloadpic()方法没有对文件类型进行验证1 U) r9 T9 I7 x- z3 J6 H" d! c

# G5 z7 P2 X; J' Q8 D) R可以构建表单, 选择任意文件, 提交到
" K+ R* e% m6 m! V. w. p+ u/index.php?app=w3g&mod=Index&act=doPost
: ^! [: i! ?/ e7 C; [, F 1 @6 _& O/ x. p2 k$ k
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
7 }% g( C9 D- j: }9 Z  v* n' Q' e, i

8 C; p; t  _. V在登录thinksns官方微博后,3 ^+ Y/ G, M  P! s  Q
构建以下表单:1 K$ T5 J* ?! ^$ E
! S7 _# |) X# A
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
7 U0 r2 b; M; m) ~<textarea name="content">test</textarea>( C4 y. _! i# f" ]
file: <input id="file" type="file" name="pic" /># ^) a, u- i) J2 p, C
<input type="submit" value="Post" />3 z2 b0 u0 j" j/ ^
</form>
% m8 L" y* O+ ]* @去掉缩略图的前缀(small_ )
- E! k$ }$ j* f% ~3 N! H7 F​修复方案:
% `6 d5 G/ H* M' `' r9 q0 [) E& K: z' k' h, e  F# _" T, h

, \. b  l; ]' q4 i7 v\api\StatusesApi.class.php% O6 x8 e& ]( k2 K

. ?8 V# L6 L6 `/ u' x: P+ dfunction uploadpic(){
$ }* d, L; [- \     /**+ Y- j5 ?' x9 Q5 B4 p
      * 20121018 @yelo9 P2 N% b+ R# r3 o$ V! v
      * 增加上传类型验证, b9 m, A. p- I8 R
      */
; c( n" P7 J- ^$ {& E0 z     $pathinfo = pathinfo($_FILES['pic']['name']);
) c0 J. R5 W2 ]3 K0 `7 u     $ext = $pathinfo['extension'];
- o/ Q: i. M% i4 g3 z" U  Q $allowExts = array('jpg', 'png', 'gif', 'jpeg');
6 }- b4 j' _  j: e , j& \  M* S! `
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);6 h- L# \- M2 q5 I  `: }! c
- c0 E. J3 ?9 o; \* s/ N
     if( $uploadCondition ){
7 a7 f3 B5 n, B     //执行上传操作' v9 u5 A( u! B6 ?
     $savePath =  $this->_getSaveTempPath();
, l- t2 h; v8 I' _3 ]     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
4 d) o& B3 m$ k& k& g    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
) E( O; a: l9 z9 b       {, k8 k+ u' o0 V8 I# X# K
        $result['boolen']    = 1;
8 D9 N" }# l% h+ ?# I        $result['type_data'] = 'temp/'.$filename;5 w$ F' [' [- B. S% w
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;. M3 y6 x& u" A9 {; `
       } else {
2 f1 n" D% z  {1 o+ G4 f        $result['boolen']    = 0;
% ]7 J( G; h8 m$ K$ l) `3 U        $result['message']   = '上传失败';2 T2 S  I, o, L, F: Y) k( P
       }; {- v2 E4 V* O# L
     }else{
& t! O% w4 g& y9 F( _8 |& F* j         $result['boolen']    = 0;
5 e' Q5 [& @- {3 w' U         $result['message']   = '上传失败';
6 p7 y) m& s  e1 @" ?' z     }2 o% M3 c$ N" z
return $result;& N% M/ B  Z  L+ l# P% Z( h
    }
+ b8 O: R& n0 o9 ?+ v* u( u7 G3 }4 g7 h& K/ F

+ V) u- W( T6 l0 G/ R
回复

使用道具 举报

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

本版积分规则

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