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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
1 ]# t; }1 J" T% _2 B+ t4 G
6 w0 _9 h3 e1 G, b6 w8 ^% R # p# h; H0 F5 M  y
\api\StatusesApi.class.php+ s% f1 G$ [3 g* k& C7 Z

; A7 Y7 o$ S% G. ?. Ffunction uploadpic(){) O* m- g; d0 y! r  b
      if( $_FILES['pic'] ){9 B9 w# L, K0 V8 J6 G& Z6 W
     //执行上传操作
: _8 O2 q1 r" ^- t( V6 g- O     $savePath =  $this->_getSaveTempPath();! q( u- P; e% @% b$ M! o( _2 Z
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);/ u) t$ n6 {- R  h- d' N' h( r; m
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))) A. h, s1 V8 F0 R. W
       {
$ y. G3 T7 a* I) n, E0 e# z        $result['boolen']    = 1;
# i* U6 H( H* j# H, D4 U  |        $result['type_data'] = 'temp/'.$filename;
& s$ i- @; V3 Z6 y  I) n        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;/ N  U, y& U" b
       } else {
9 a" I9 n1 f& u5 t, E6 O        $result['boolen']    = 0;
" \/ Q1 {! T  f* _+ c" q) o        $result['message']   = '上传失败';
/ _: t4 \3 v2 ]$ a% l8 P! K       }
! K) Y0 _7 |( v$ X+ i% m2 j6 v     }else{0 w$ K7 d6 t9 I  p+ M
         $result['boolen']    = 0;1 a$ Q+ D. W! ?/ W3 [
         $result['message']   = '上传失败';/ \2 b+ b7 Y2 e
     }
6 }# `& X9 t: k- p" c9 O5 freturn $result;- a1 {7 M- S4 I# U) y% X' e9 w/ C* r
    }
5 |" W5 Q  Y4 a) N" i: i6 Eunloadpic()方法没有对文件类型进行验证) E! R' L4 a, f3 Y* W* e: p7 ]7 U0 r

4 L/ O4 ~) l7 X- \! H可以构建表单, 选择任意文件, 提交到
  y# Y. O/ `4 G/index.php?app=w3g&mod=Index&act=doPost
+ M9 h% R- j' @6 _# M
) q0 K' g% e' q& i) x& d3 C0 e在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
1 B: L2 D/ L! Z- k7 R* \1 W6 m. @0 C. Y' e

, l. j6 s( q! @+ _在登录thinksns官方微博后,% g" J" M3 C1 b2 N+ p+ t* f: F2 v1 L
构建以下表单:! o! O- Z) i7 D7 h# S$ ?
# H8 J7 t! ^9 K4 ~
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />- u& X* s: p! J  O# a+ _
<textarea name="content">test</textarea>* [, ^& e- b4 @1 ?3 J
file: <input id="file" type="file" name="pic" />  p0 `  `3 ?2 Q3 z; W, M( K
<input type="submit" value="Post" />4 t0 F8 S% s0 S- }6 C1 Z
</form>
6 q$ a7 n- D  `) m' {, `( f; A  C8 s( k去掉缩略图的前缀(small_ )3 m, ?; X3 y# S" M
​修复方案:
/ q7 X$ k. r5 J1 j
( `8 k- ^1 g/ F2 I5 `  X) i9 M7 g" z* [6 [2 i* z
\api\StatusesApi.class.php6 }' G- w+ f1 y& {/ ~
( G! \4 E$ e( ], S( b, B
function uploadpic(){
, {0 G! _# P7 [) E3 s     /**4 K& G4 p2 D" \3 f4 U, u
      * 20121018 @yelo
* Q$ c; c7 j5 h      * 增加上传类型验证
' |- \7 v" C: f( P* e- \  C      */+ F: ?7 v% q* F7 l# n
     $pathinfo = pathinfo($_FILES['pic']['name']);
0 O) j' b  X" {3 o% c- m9 ]     $ext = $pathinfo['extension'];
- v: M% a& \# Y9 h5 ]" K $allowExts = array('jpg', 'png', 'gif', 'jpeg');2 Y% S  [& n9 W* x  e

0 E( F3 E6 @$ R; n0 h: o5 c3 r" ]$ s& k     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);3 D/ O3 S  p% N& Y% o7 B
: s' w% W" z5 Z- A& _
     if( $uploadCondition ){; D# F: b/ v3 P! w6 C/ ?' d: H
     //执行上传操作$ n" l# s( |  _1 |4 G' ?. \
     $savePath =  $this->_getSaveTempPath();
. p9 q4 b5 s4 h4 n- u' `% d     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);. X4 w0 W+ ]; J* j9 Q  E
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
) v8 {1 z( _9 G       {! i) [4 A5 e! o$ Q, p+ ^# B
        $result['boolen']    = 1;* o3 @8 D' [& j; q* ^
        $result['type_data'] = 'temp/'.$filename;
) g2 j2 g' s- D/ z& M- Q; b        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;- t+ ^* J2 b/ f
       } else {
  K. b, A2 o9 @) D# E; W        $result['boolen']    = 0;9 v2 P6 ?) N3 G. z1 n6 F
        $result['message']   = '上传失败';( k, S" z3 @% k; }
       }
- u! S4 y6 R+ P! l8 f9 m0 E- x: w     }else{
2 Q2 N6 v5 V3 e         $result['boolen']    = 0;
' ^6 d  l9 J0 H5 ?5 W, R7 f& F         $result['message']   = '上传失败';
" C! b9 ?0 R. T7 p. q     }0 _8 P6 o: ~0 F, W- H, k
return $result;
- Q% F" [, ~2 Q$ L    }
3 C6 b0 V" F# R/ a​( e) L8 `1 N( r& |
0 @% Y! g+ w& E2 [0 s) q
回复

使用道具 举报

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

本版积分规则

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