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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
3 r; f8 t& e& y7 _' T. [: S
- _/ V0 V3 ^* m) w' `+ M
9 f  o1 ~& K1 \5 M4 T$ f9 a$ O! Z\api\StatusesApi.class.php' d) |4 ^$ T; U4 B- D8 `
+ N- J  T1 V$ n- t3 Y
function uploadpic(){( ?3 m$ B3 {1 z) ^
      if( $_FILES['pic'] ){
. A2 I0 M3 X  Z% L' }     //执行上传操作/ U: T/ L& S7 A2 i
     $savePath =  $this->_getSaveTempPath();
- y" W1 f, i( R# e5 A2 {6 A! n     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);% S6 E" [4 h3 e8 I7 u) ?
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
+ P2 h. w* i( A& |' @       {4 W; @* d; P8 {2 }5 o" f; k
        $result['boolen']    = 1;& z. q5 m( J9 C6 R- ~! C
        $result['type_data'] = 'temp/'.$filename;
$ a9 e0 s0 Z9 g        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;3 g5 `* a# ^. j* l7 H, Y1 {# I
       } else {
7 i7 ?7 f, `1 v6 y0 }* ^        $result['boolen']    = 0;
. j, \& @3 ]: e" ~8 f3 Y        $result['message']   = '上传失败';
1 Z' u0 ]: G. Z. ]3 F. _       }) f7 s/ M$ p5 f
     }else{5 u& T) @, e* d
         $result['boolen']    = 0;
  G0 G) K9 \8 \/ r0 l         $result['message']   = '上传失败';% n, y' d* E1 P% J. [' V& v, t
     }; _# K) i( q6 |: r/ e5 g6 [
return $result;
, b% }! t7 j$ n    }" u5 h5 k1 @- s% m
unloadpic()方法没有对文件类型进行验证
: D4 V" J9 e6 y; }
2 Y- l$ G& y$ }/ u% {5 ]4 z可以构建表单, 选择任意文件, 提交到& C9 z7 p( P& P0 \! O" @( N/ G
/index.php?app=w3g&mod=Index&act=doPost# B3 V! N2 d  Y% c+ Y; a
2 y' K) r2 r5 G9 d0 R0 D
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)+ [3 U" X9 L! |: X( i* Q" D
# m' t7 E4 N" [  q2 A% {
: b7 W4 p6 l+ h( B
在登录thinksns官方微博后,1 O3 O# m: R5 N: S9 q2 ~% {$ l
构建以下表单:" b- J; M, R; h, s7 h6 s. C

3 f# x% }  w+ f2 k<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />' V$ B5 z* S% B5 y
<textarea name="content">test</textarea>* W1 t8 \9 w* ?! A5 j
file: <input id="file" type="file" name="pic" />
2 s2 [- b& h9 _8 x; H0 `<input type="submit" value="Post" />) B1 }6 E3 M# K1 h& l
</form>% ~. Z& v0 s. s( ?, L
去掉缩略图的前缀(small_ ). I2 ^8 {  |) w: r% Q3 {7 _2 p
​修复方案:7 b5 Z) W' o; h5 x9 H. e) c* w. h
3 c; M8 D) D% k! r9 D$ K7 ?

) e2 ^3 n  X& J) R" r# {7 H\api\StatusesApi.class.php
0 ]2 S2 u# T2 i! _1 }$ ^ # t" J6 G/ M1 L8 A
function uploadpic(){
2 X" G- P7 e/ L" [9 _     /**
0 @: X5 V* S( v" V4 j& _: b      * 20121018 @yelo
5 r! d' @. ^9 G      * 增加上传类型验证
5 J3 K+ i6 Y  F+ z/ p      */" X# w/ {# `5 D: b
     $pathinfo = pathinfo($_FILES['pic']['name']);( @8 W5 n  m3 M& i; H3 {
     $ext = $pathinfo['extension'];7 R% X. Z& `# S4 W
$allowExts = array('jpg', 'png', 'gif', 'jpeg');' n3 N$ V$ e& W! e+ m+ v! L& k+ L

7 K% ^! P; H2 b! D$ J8 H7 X     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);1 Z- t! \$ q  b: I% B
1 i6 A$ d' ~  B9 P- @
     if( $uploadCondition ){3 L$ n9 b4 q9 I5 X0 }& R: R) r
     //执行上传操作9 l1 \# c3 `% I1 `, M% n
     $savePath =  $this->_getSaveTempPath();
/ h; u+ U; g" o# O3 {! a; \     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
( K* i4 _' k& V/ x& i- Y- d    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))& S3 o8 S- K- X# ~+ c: ]
       {
3 ~6 n* C# Z9 j" _8 Y7 R        $result['boolen']    = 1;" e* J5 h% w% ?
        $result['type_data'] = 'temp/'.$filename;, M  V' v# R" a" F2 T
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
/ Z. N1 P4 W8 `1 e& r: F/ i. r       } else {1 \- Z  s. e6 L  a, O* G: {) F
        $result['boolen']    = 0;
1 E+ `3 s2 Y8 ?; {7 g0 a$ G        $result['message']   = '上传失败';
( F' d7 T/ x8 w0 _3 B/ M' I( ^( `       }/ L; T( Q3 @* ?2 B$ _! e
     }else{
  P$ P7 D/ V6 `' N  r. p1 V/ b         $result['boolen']    = 0;
$ z# s! ?4 }! X8 O# R% {0 g) v+ E         $result['message']   = '上传失败';0 U, G3 r# \8 `( w
     }
6 Q9 f  y5 c# [5 Preturn $result;
( D5 C. m+ y% \, E    }% \( {1 r; k' ?  K* z

/ q% N; I3 Q8 r; i
) |" q2 H8 E' K% \; d* l- f, y
回复

使用道具 举报

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

本版积分规则

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