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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
* k, V4 m" N, ]4 {: M
' O' k7 U  D" L! Q
2 p, b7 S" o2 I$ L% X, O\api\StatusesApi.class.php0 _( l6 z' |0 ^5 x# b3 I

: Q" o1 o- M- I) |# I4 Sfunction uploadpic(){8 n  [1 @! c. U6 U) V$ V: n9 t
      if( $_FILES['pic'] ){
  I- P* l4 @1 I1 o; w: F     //执行上传操作
7 j6 d/ ^$ w7 B: }5 i     $savePath =  $this->_getSaveTempPath();
* n8 J7 v3 X$ P& g' p8 L     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
; P  N& b, Y# H0 `! m    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
) l+ J. x, [2 t7 X0 C       {& W0 y4 M5 b  b, _9 i. \
        $result['boolen']    = 1;# o% m/ q+ R3 L3 Q# t8 [
        $result['type_data'] = 'temp/'.$filename;
1 P# m7 u8 W# v! [        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;) G  M) i) ~4 x+ f9 d
       } else {
2 _/ Q( T" y$ A% G, x9 S        $result['boolen']    = 0;
$ C0 F8 g2 H0 e* @3 M; P        $result['message']   = '上传失败';
4 p$ f' y, F! S1 d6 ?, w( y       }
& Z" s% ]0 R- Q; T6 y& n6 K     }else{' F& [7 q  q- P7 E, f
         $result['boolen']    = 0;
8 D$ b$ P8 M/ g" K" s$ r# C         $result['message']   = '上传失败';
  N& L* H6 ?+ X9 \     }
7 h4 x6 M9 x$ b" mreturn $result;. O9 P# }/ a/ S9 V3 l% |" O& Q
    }- {* [& j0 U4 w" D$ P! X/ U4 H
unloadpic()方法没有对文件类型进行验证6 L$ B  z" l0 y7 ~
* U& W# Y( d5 P; g
可以构建表单, 选择任意文件, 提交到
8 u! ]- [4 \+ Z/index.php?app=w3g&mod=Index&act=doPost
; @+ Y0 H! O4 [$ B0 a. x7 H
$ r% g, b+ d$ K. q在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)" [8 y6 A5 X! q7 r
; ?7 i' T/ I0 M9 G! R& \+ @

6 W  G7 g: h5 V+ [2 y' T. t0 U在登录thinksns官方微博后,# g( t9 Y/ d' d5 v' m! c9 m" w
构建以下表单:6 `- ~! b' P  e: r
0 c! X, Y: {* Z3 w  p, }
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />$ E: ~% j( V7 Z4 m, X
<textarea name="content">test</textarea>
3 }, C3 [% G2 p& K8 ofile: <input id="file" type="file" name="pic" />
7 n: Q- T8 A2 u- m* J<input type="submit" value="Post" /># T! v: a6 x) }6 a
</form>
3 C5 |1 R9 h4 q3 o& [$ X去掉缩略图的前缀(small_ )7 E* `. t) e" _8 L: O  v
​修复方案:' U- C; r# ~& [1 }4 U4 \4 h: N$ q

; V: ~5 S0 v; ]9 b: Y* f9 l7 ^0 A! w$ Q& K2 a1 v- j
\api\StatusesApi.class.php* X  {0 i! n. p5 B3 v# [0 ]/ y
" A& }/ ^3 v! H: o
function uploadpic(){) y! ?/ X6 u, ?$ I* R( y
     /**# l3 H, _) Z2 x* M0 \
      * 20121018 @yelo
1 }, P/ `0 D( F- z5 W      * 增加上传类型验证9 e. u7 d, V2 K4 {/ N
      */; E* b0 F0 s/ t3 H' ]8 e. Y9 }
     $pathinfo = pathinfo($_FILES['pic']['name']);" w$ L1 L, u- o
     $ext = $pathinfo['extension'];4 X% ^  x9 Q, R
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
2 n* G" F1 F& z' t9 y + z# Y2 Z& q) u  P( e, Z5 g
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
# e) g: x  M5 y$ G2 }  k
6 f7 E1 I- I3 v, K     if( $uploadCondition ){' _8 P+ T0 y' A. M8 u9 l- X8 Z+ O1 D& \
     //执行上传操作
5 J# w. ?1 y3 o- W/ ^, F$ q9 k  h     $savePath =  $this->_getSaveTempPath();
: V' M3 e5 U4 H/ z7 \+ C     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);. q: G! y3 `, L5 o5 w
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))3 L5 m0 r( v7 O6 x- C7 }
       {
; w7 w1 W0 o5 B8 y( j1 X9 b1 S        $result['boolen']    = 1;
; K4 H4 [# z% r5 }' B8 F/ P# H        $result['type_data'] = 'temp/'.$filename;
9 w9 R* O! u' A5 [3 Y4 t0 R        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
* P" r5 E* e- f& r2 m       } else {( m7 P0 Y, `: x8 {
        $result['boolen']    = 0;
, U8 B$ T3 M; h        $result['message']   = '上传失败';
2 f, w, U2 t5 u3 }! i8 i% u       }4 e. O9 M( f8 T# ?( j
     }else{
- a$ B/ |/ C( g7 u3 Z         $result['boolen']    = 0;$ n5 c, T6 i! S1 J
         $result['message']   = '上传失败';
$ F7 O; w" V3 n8 R     }
: ^" f* A. q% |1 Z2 G# Ureturn $result;. N+ h- B0 Z6 I) ~( M6 G: r
    }5 P1 o9 ~5 u/ v2 l0 ~5 M& U
​, b3 i( S# V! I' X

# G0 t- ]+ I" V1 V0 O
回复

使用道具 举报

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

本版积分规则

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