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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
4 c; C- u, j8 C9 Y1 ~% K" ?: E& m% Y/ ]+ j6 g5 \
( ^4 _- c" r# W5 t9 T. P
\api\StatusesApi.class.php/ R3 s8 d1 k" Z# Y; A$ q, j1 u
* m: A2 r$ l$ K6 t0 S7 Q( w0 {
function uploadpic(){
. P0 _6 U7 `" y$ T% U8 @* v( N' c      if( $_FILES['pic'] ){
+ I! P5 e7 q" j. m; D% L     //执行上传操作
1 M/ _4 m" j. G  R9 f     $savePath =  $this->_getSaveTempPath();
0 o  n! Z+ r. t; t+ K0 ^     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);: P$ K6 y! |( [
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename)): G% ^* z$ W# ?" T2 ~! C
       {1 ~3 u8 w) R: ]' o2 b$ s
        $result['boolen']    = 1;& Z( U6 J, Y: K
        $result['type_data'] = 'temp/'.$filename;
- l6 ^( h. h4 Z: I! l+ X        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
% B* H) H1 H9 t2 |7 ~       } else {
) m" ^( `- `% R* u" d. \" m7 d7 E        $result['boolen']    = 0;
/ L1 C" v8 l, Y% P        $result['message']   = '上传失败';0 m( j( `  m. y! [; A8 W9 v
       }
6 X1 P5 c6 L# a* M( \1 ~; [     }else{" Q) f6 R! L0 J- v: t/ p, e
         $result['boolen']    = 0;
* `0 v3 }5 l; T7 d" Q         $result['message']   = '上传失败';) d7 z. ]9 x  q
     }5 z5 z/ i9 ?; Q( u5 j) a7 Z: p
return $result;
% P% i# }! Z* L$ x! a    }
) f! V+ V& F% Munloadpic()方法没有对文件类型进行验证( O+ A! F) X/ D+ z3 x

) i5 B" N$ D3 p7 k/ E可以构建表单, 选择任意文件, 提交到' _% Q* [+ K. a& z8 q: M/ }- I
/index.php?app=w3g&mod=Index&act=doPost
6 n+ `. a8 }% C 7 @5 _, _& w! Z( _! Y9 k
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)/ `" R! c' ^1 X0 X  Q9 t

/ n4 [* ?4 n  U. @9 G
1 ]" u3 g+ u! W3 A2 P' R在登录thinksns官方微博后,) L3 f+ N8 E/ E; E5 c7 S
构建以下表单:% J1 c0 n6 A% ~* s8 F/ `8 B; B; Y

8 A4 E6 U' i! Z, P! T0 H<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />- Y+ A( [/ d! u) h) d) A
<textarea name="content">test</textarea>1 i8 G" t# L8 `' t
file: <input id="file" type="file" name="pic" />, d* q. I4 n3 P' t
<input type="submit" value="Post" />
+ ]: Q* j. U0 j* Z3 X/ c0 a/ L</form>
  {  O  J1 b' x' @" c9 b% x/ n去掉缩略图的前缀(small_ )2 e8 D/ {( [' g$ ^
​修复方案:
% [$ c) R0 }5 r1 N% I# S. ~
' L8 G: m# J/ t) r$ V3 _6 o3 j, d( R1 d, j. k" L4 G2 g. U. Q" U
\api\StatusesApi.class.php
; ?" T; K/ F$ H# d& W4 w( d 1 T! K4 \6 ]" a4 P0 U& j5 ^
function uploadpic(){2 K( ~& H1 k) J( p; \0 ~
     /**
" x( k2 \7 E4 }/ z4 G& f      * 20121018 @yelo# p, l% C7 I0 ]
      * 增加上传类型验证; c* Q5 V9 U. v
      */
& P/ C% m2 J2 }# |8 E" Q. x     $pathinfo = pathinfo($_FILES['pic']['name']);! h/ h! u4 M7 i- A- }4 B
     $ext = $pathinfo['extension'];( F: h! H. A( r( U1 P  `% k
$allowExts = array('jpg', 'png', 'gif', 'jpeg');5 q/ t: e& c  j' S

( M' Z. \1 n$ _9 w+ U     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);# @2 |1 {8 V1 w/ }- M

6 n: I% b) w& {- B     if( $uploadCondition ){
) {) E" y1 c# m8 Y% `9 @7 R; f     //执行上传操作4 Z7 Z8 i8 o4 ^/ B+ A
     $savePath =  $this->_getSaveTempPath();
  r% h; `9 G- O9 A     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);2 P3 c, B7 W0 U9 O+ J3 K  d
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
" `  ^* P" Q  B6 @8 g       {" n( v! E9 x6 U9 L5 K- _
        $result['boolen']    = 1;6 ~/ a. ^$ p" N. \& U  H; R  ]. o
        $result['type_data'] = 'temp/'.$filename;( X* a; X! o; j  b
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;& v2 W8 E5 a* J* Q, N* X4 }
       } else {2 Q2 v/ Z4 A' N( x
        $result['boolen']    = 0;. T6 }7 j* J8 E
        $result['message']   = '上传失败';
& e, `; {% q% V: x% O       }0 q/ b" s+ {9 Q; I
     }else{
% g$ {3 [! }. c2 b. N3 |         $result['boolen']    = 0;; h9 q- j  v- @+ B7 A6 [9 v
         $result['message']   = '上传失败';) c6 x2 P$ B! k
     }6 e- V$ W* ~0 h$ S
return $result;0 s& Z& F  a* P8 r
    }, E5 v: y" |9 O- i7 o

: b7 a1 ^. g+ i- I+ G4 P3 P" F
; ^  C. Y9 U' g- [
回复

使用道具 举报

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

本版积分规则

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