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

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

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

, e  ^* w% F" E, _. g 3 u8 ^% C& d8 G0 b9 Z3 o& Y
\api\StatusesApi.class.php
% R6 x3 e$ o; g8 a% s + Q( U, n0 M- ]' c/ G
function uploadpic(){
7 Z9 X" p  T, M7 A% |      if( $_FILES['pic'] ){( a0 t" S5 ^- W7 |, s
     //执行上传操作1 O* Q8 p# i" D2 e6 Y5 D0 v2 L) m0 s
     $savePath =  $this->_getSaveTempPath();( y+ E6 \9 p+ _& P
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);. H& l2 }  x3 n% z
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
' W8 B; `8 a; m" X4 D. D       {# H0 |' G1 q* W. v
        $result['boolen']    = 1;/ I+ q( T, i0 q6 S( ^
        $result['type_data'] = 'temp/'.$filename;: M" e1 I+ W' ^' J0 [  h
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
% z9 d7 X% }2 ^: E       } else {
- K  R# e# [6 N0 a# h( ^; {        $result['boolen']    = 0;
/ D0 y$ E3 V+ X( \* B        $result['message']   = '上传失败';2 V& l/ W$ S: ^6 l/ W
       }
2 L7 K  h, y: Y  j6 R6 o" S) E' G     }else{2 `2 l9 P4 _7 M3 a9 Q2 S, M
         $result['boolen']    = 0;5 ^# Y+ Y- y  z+ K$ E; L
         $result['message']   = '上传失败';
2 N- s6 G. [  L; H* g/ z- r9 R     }" D$ X; J6 q. }' V/ q( R1 E. G
return $result;0 m' l4 ]# a( l- P5 V
    }
: f) Q5 c- u, h0 A1 yunloadpic()方法没有对文件类型进行验证8 D8 o6 B3 S% s1 M) H$ [

+ ]) u# t3 L9 m3 }可以构建表单, 选择任意文件, 提交到% u  H6 g: f* x' X0 G& A* y5 Y
/index.php?app=w3g&mod=Index&act=doPost1 N, q% I, e# }$ I( ~

$ j" [1 \& X) C! L7 D& Y在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
" K  K0 n5 B% Y8 K6 x/ Y/ O# m' @9 V; S# `6 k; \2 |9 R

' W+ }/ w! V: C在登录thinksns官方微博后,% F1 B  V! [8 V- j  u& o
构建以下表单:* Z% @, u( {- d  H" z; s
& E1 ?' Q2 d$ |
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />1 l. z, b: _8 r0 M
<textarea name="content">test</textarea>
+ g! Y+ O6 q) a2 y+ T+ M- wfile: <input id="file" type="file" name="pic" />
; {! p/ o$ ^0 ?. H<input type="submit" value="Post" />
! _8 B* ]* K# q9 k! c2 K4 U</form>+ I7 }) B% W" V% h- {
去掉缩略图的前缀(small_ )6 }$ t) [2 k+ C- e7 _3 n1 ~. f
​修复方案:
9 }2 [! a6 z, h3 O* O* k3 w+ u# r

, M% n2 x1 g$ R8 o* y/ Q1 E\api\StatusesApi.class.php- Q+ M' ?( y2 N9 `* ]6 V9 X

5 p  k# }/ H& z4 Dfunction uploadpic(){
* S' h0 e7 i& d' y- }+ V0 w" C     /**
# [( i8 ?7 S9 ?; N      * 20121018 @yelo
/ n+ j$ @0 d7 \" |8 n      * 增加上传类型验证/ S) ~  j/ b- s
      */" ^# \" u3 s/ i7 _
     $pathinfo = pathinfo($_FILES['pic']['name']);
$ {, \3 q# @# C" N: s7 c* z" D     $ext = $pathinfo['extension'];  U, f4 {3 h% M3 y% z; ^
$allowExts = array('jpg', 'png', 'gif', 'jpeg');& c8 }6 G& v, ]% }2 S. P6 D4 X1 w
  X+ ~# v9 n1 Q% e/ G" O  X
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);4 V# G% Q: C# \3 x% J

+ X3 w9 h5 v3 q9 c; a" w% K     if( $uploadCondition ){) k  K+ S' S, D1 v
     //执行上传操作& Q, {+ ]4 |7 r. i
     $savePath =  $this->_getSaveTempPath();
; g6 H4 B& n2 Q9 O     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);# ]- f! ~5 v# `$ e" k6 H
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))# y6 w( F6 `3 Z; t; e% |) K
       {
2 d& y% Y4 ~5 I: }+ u6 E) [        $result['boolen']    = 1;
2 Y/ A( r, G- f3 k$ N9 l) I        $result['type_data'] = 'temp/'.$filename;  `% F) A' m/ f
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
( @* t0 b3 Y1 O+ t0 a( N! y1 X       } else {
$ ^* K# @) `. h3 T7 |7 f! j4 ^5 d        $result['boolen']    = 0;% b8 @' O1 ?, V; T% |
        $result['message']   = '上传失败';8 b" R$ z: R1 C0 X- p& Q, p
       }
& |! C4 _2 `4 E/ [; d7 Q     }else{; k+ W( w% }) Q5 Q5 j& d$ o, ^) {
         $result['boolen']    = 0;
/ D8 O: r" r# k0 F: t         $result['message']   = '上传失败';' @1 S5 k% A; j0 W( _4 I3 z3 A; ]
     }4 I, ]: W. J1 W; a4 O. a( v9 H
return $result;
6 M; [( l3 F) }" ]" o- ?    }
4 s0 {/ f( M9 V9 X/ C4 f6 {  ]​! U) s* X6 U3 |# M
  L. m% M1 O0 [8 e2 M
回复

使用道具 举报

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

本版积分规则

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