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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。( [# Y1 q. Q# t. w; R. r& q

1 f' ^9 X4 ^3 m6 g( K
2 k. ]/ [. y- M- M1 ~, i\api\StatusesApi.class.php! g7 \( }+ F& I7 J* ~) m
4 p  n6 j: z6 d3 |: O# q
function uploadpic(){  o9 Y' R& f: {/ R; W+ t5 P
      if( $_FILES['pic'] ){
! O% U$ L+ o$ p1 x. Q  Q* Y     //执行上传操作+ E0 F! N9 E) `
     $savePath =  $this->_getSaveTempPath();
0 R/ F8 q8 l. Q5 x' D3 I     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
* {7 T( a# u2 j4 X    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
8 P# x  }* |2 M+ b3 P1 I       {
$ N/ H4 a* S9 X5 y        $result['boolen']    = 1;; G0 e6 @2 W( s
        $result['type_data'] = 'temp/'.$filename;
- P! A4 P8 m. i  s5 j' L' ^$ h: x# Y( h% B        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;6 n. P0 n. d" g/ ^& q# C
       } else {1 h; l: n% k1 g
        $result['boolen']    = 0;, W  h- m$ u" g; }  I
        $result['message']   = '上传失败';
$ w/ V+ _2 Z9 x: Q3 B5 G       }
5 Z1 j2 W0 ]8 m7 h     }else{
  d1 p# `/ k2 q         $result['boolen']    = 0;
5 y9 N7 v4 l( `' Q+ i" I         $result['message']   = '上传失败';$ N0 r3 N" X  N5 E+ S" [+ h
     }
" ^+ g+ P% R. m* ]return $result;* ?( u3 }0 N  G; x" [) y* X7 Z
    }' _- y  h) g6 m8 l7 a
unloadpic()方法没有对文件类型进行验证' Z; I1 c- x  G

2 x+ U6 l8 h, ?& U% D, E# [0 d可以构建表单, 选择任意文件, 提交到
& F. T3 E  r, l' ]" W/index.php?app=w3g&mod=Index&act=doPost
1 f7 ?0 x/ r3 ~# |( }) l2 U+ ?! [ $ }: A& U/ G  {5 }
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)# F" `: Y+ E. X
4 O# i+ a# D9 _
4 \! h) ~  T% a
在登录thinksns官方微博后,: g/ W7 k3 [4 T) f2 [' Z
构建以下表单:8 R: B  I1 X. [7 g3 I0 o

6 G' ]$ u6 ^2 i' F<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />6 N; k6 v; c7 I. c3 C- p% E( V
<textarea name="content">test</textarea>: |. A7 h5 W1 ]( J+ ?
file: <input id="file" type="file" name="pic" />
% w! j' D8 |* f( o" P% Z<input type="submit" value="Post" />* A) Q. |4 S' E! c. F
</form>
4 F7 b4 `; z& P3 `, T- S去掉缩略图的前缀(small_ )+ n' ^* F( h+ c2 t7 ^; ~/ z
​修复方案:: }2 _# d' T8 R6 A% R' R/ C1 m5 o: E

% }/ d" x' G: A7 z% \& A' Y3 a% j. y/ R4 d7 R$ R5 J9 |9 H
\api\StatusesApi.class.php" }6 c# W$ M  e+ b) V! |

& E# m3 a" {' H. s3 E0 ifunction uploadpic(){
/ y9 m% g; v( @2 F, h     /**; S$ T# F; z! i4 R( ?; i
      * 20121018 @yelo
4 C" H$ n; {" d' b/ o5 g5 \* ]% v      * 增加上传类型验证
, I9 N) g: R; Z      */
0 ]$ C' i* F7 [! |6 }1 L     $pathinfo = pathinfo($_FILES['pic']['name']);; T! X1 i" }, l& y5 I0 F
     $ext = $pathinfo['extension'];
7 c) ^6 b  M* E/ I# H- @7 o $allowExts = array('jpg', 'png', 'gif', 'jpeg');
  d* L2 h% m- Q4 ?% } 8 p( y, M, b9 ?, _# ?
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);; a9 \' \. D5 t% W; t! g6 h
" U0 Y, n+ l3 D/ ]4 n1 N7 t. D8 y8 {
     if( $uploadCondition ){
2 a# g4 n0 E6 ^$ k+ t- K6 u  J     //执行上传操作# O+ t; _' E, \6 s7 k) N
     $savePath =  $this->_getSaveTempPath();
( ^: [7 O1 n+ }$ A# j     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
. e* q3 y5 b" l3 c3 F: X    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))5 d( b+ k6 e' z
       {
- D& T0 O3 a: b& O7 F$ W/ l* T        $result['boolen']    = 1;9 ]0 o1 G' S+ |' m8 W
        $result['type_data'] = 'temp/'.$filename;
' e, }) ^/ Y4 m        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;% e% l6 R* [; w
       } else {# J5 K3 b: m( P+ j/ R( o2 J
        $result['boolen']    = 0;
: A5 j/ u9 |+ q; G        $result['message']   = '上传失败';
/ d: N3 y7 O" f0 o       }* l( u! }! f# Y( N1 Z0 l
     }else{
1 |. v. x, p$ R2 j         $result['boolen']    = 0;. ]/ b- o) z) q% y$ R/ C2 w1 E
         $result['message']   = '上传失败';
/ B0 a+ _# q3 K: v8 X     }
9 q4 F) W1 x6 L) a3 [: a; @* L+ O. ?return $result;- g3 h& U) B: L) |: t6 p% ?! T2 z
    }
& N( z& v$ h/ G1 i
' N9 m0 I+ G( [
) o: a& A1 V8 V5 }, I4 W' V9 l
回复

使用道具 举报

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

本版积分规则

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