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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。- g2 i( w4 y' A3 E& Q9 }

% G8 c4 L& v% R) h  U4 J9 h# C
9 `! q4 C* J/ Y( H8 A\api\StatusesApi.class.php) |0 k( |' E' u- ]7 }

5 p( y; n: [# i$ Mfunction uploadpic(){
+ j7 Y# g+ h& j5 f- m$ X      if( $_FILES['pic'] ){$ X, ~6 L; J3 ]7 W7 p/ B
     //执行上传操作
0 D% ^" P3 q5 s* h/ }     $savePath =  $this->_getSaveTempPath();4 |5 o3 g& q  f! s  r- _7 L/ W6 a
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);5 q, J5 ^8 N# X' Q2 N. j
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))$ O- i0 y3 q1 B0 h
       {& G: Z3 Y9 c( ~
        $result['boolen']    = 1;
2 u/ E# X$ d9 T. G! l        $result['type_data'] = 'temp/'.$filename;( w# O8 g) ?( a  c2 i' n
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;4 j* I- ^- A+ Z9 d( T
       } else {  Q+ E) ^: K$ n1 ^: @
        $result['boolen']    = 0;
& ]" r# W/ M7 s: a$ {        $result['message']   = '上传失败';8 D9 R1 J+ ^: @% h) K; m
       }) l+ K- M4 b6 x+ c1 l' V+ g" a( x; c
     }else{
' }; E* z! [2 X- j5 Z         $result['boolen']    = 0;
. b. H" D4 B: c         $result['message']   = '上传失败';# J- h3 I1 |& H' K$ Z# k2 \
     }/ i0 V% N2 `/ e6 p+ x' c/ a
return $result;
! t. U% [1 y" h/ Q& `    }& Y8 P1 p" w+ r4 s4 N
unloadpic()方法没有对文件类型进行验证; {+ e8 u: @+ i& a; P0 @0 X
- I) }2 h6 e3 }6 ^3 x- {
可以构建表单, 选择任意文件, 提交到
7 a  t# p+ q& r! q/index.php?app=w3g&mod=Index&act=doPost
) z6 k3 Y; L4 q, R2 y$ d% V' S: u
- ?  U. C- g$ I( o, K& x. F在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
3 A' Z  Z( y! r7 E! n
) b( B" ~& _; S$ x7 c' h* O3 w' \  J" o' `  R/ K
在登录thinksns官方微博后,$ `- I. U4 F+ X9 v/ t5 q+ P
构建以下表单:; B# u7 H. e1 V+ V* M; |9 D

9 j4 a: ^0 P2 e$ S5 I<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
- S' y. W& ~" Y' B4 S" d<textarea name="content">test</textarea>5 \' E; d/ @  _; ~0 U
file: <input id="file" type="file" name="pic" />
: B& y" r' Q; w; \8 q<input type="submit" value="Post" />
* s% l9 [# U: i" V+ T% r% C& a</form>
* m$ G, c( ~) k3 a+ m去掉缩略图的前缀(small_ )
) Y) q$ K1 c! D+ r& I5 n) X+ p​修复方案:  ^/ _+ g) j- Y5 q) L4 l

* n7 n4 {6 j& n$ F. L+ S( ^; d( T7 B% c$ A, w; p! }5 m
\api\StatusesApi.class.php! [3 r  Q* k2 G9 K
+ X5 |& q' I9 e# Z) p, u
function uploadpic(){: W9 s: Y7 k. R$ z8 l
     /**
7 I  R# T. W7 g      * 20121018 @yelo' g: k6 A0 ^! f6 Q* s$ \  q
      * 增加上传类型验证
9 k- w! _( b* @9 E, z, L! j. V      */
2 L4 Q1 `& k3 n# |     $pathinfo = pathinfo($_FILES['pic']['name']);
" Y6 h, x; [" b( R/ Q/ Q6 Z     $ext = $pathinfo['extension'];
& f& u& r) L4 S6 o9 b $allowExts = array('jpg', 'png', 'gif', 'jpeg');$ l3 U5 b' Y% L% g) z
! ~8 h3 L" |% m2 M" c8 P
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);2 M$ q% ~1 U1 f

; K; I0 Z( u, L4 }/ A3 |% F( ]" d: n     if( $uploadCondition ){- C- _$ E. @  S; y; p3 Z
     //执行上传操作
3 ^; \+ z, \* e' D. L5 w/ c     $savePath =  $this->_getSaveTempPath();7 d% e3 \* m5 d2 n9 ^, U  N) q( M
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
- P( {5 L3 ^8 h$ v& c9 r) L7 g    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
1 }4 h4 V& U3 C: j/ ^; Y       {
& z+ v( L- O  ^0 `        $result['boolen']    = 1;
/ p0 v. s4 L! Q2 ^1 E        $result['type_data'] = 'temp/'.$filename;0 N; O6 p: `# M, @2 i; P/ n/ Q# r
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;) y1 ~1 j) t  ~3 M6 W1 C
       } else {9 \# w0 ~. d" \2 x6 D- C# S. Q0 k
        $result['boolen']    = 0;
/ C5 g1 k, G; W        $result['message']   = '上传失败';
5 J* k( A/ t% r       }
. q$ [8 c- j* u     }else{
5 \8 f: P: X8 M5 q' x' n. l         $result['boolen']    = 0;% |$ W* E! U0 p9 G, w
         $result['message']   = '上传失败';
% s0 w- X7 g+ g2 |0 B: _. B- c     }
$ I! d. [) c6 f0 O3 _! qreturn $result;
8 X/ u# p. j: L5 F" |7 M. @6 c    }
1 p/ \, I7 A' b3 a* Y! j- U' Z9 A9 T/ |# V, c; i

* w: j4 a' C4 p0 A1 F
回复

使用道具 举报

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

本版积分规则

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