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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
6 c+ e# \$ O7 f- E# v# y0 z) Z6 v, ^/ ^( ?. W0 B8 _5 p7 a

, `2 \, [2 m0 m% W6 v\api\StatusesApi.class.php
; D; w& I: W- b+ g
; P; D/ n; l0 L* ?: yfunction uploadpic(){6 ]3 d! A* O) B2 a9 @, Y8 W
      if( $_FILES['pic'] ){
2 V; \, u( O9 t. \: p; l, ]     //执行上传操作  \6 G& N! o: {# D
     $savePath =  $this->_getSaveTempPath();
; R; ?. ]' K, @1 I6 c, v0 c% p9 a     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);# v) S3 M! [1 r2 i$ Z
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))" @8 x1 U2 L1 z: v' Z6 A
       {
& I. M$ b. Q: X        $result['boolen']    = 1;
: Z% l6 ^- w8 `6 j' r! e' `        $result['type_data'] = 'temp/'.$filename;6 D7 i) {1 f4 I; `) K
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
3 {: s! _/ I+ u       } else {
. m/ O+ `2 l! e, t+ k        $result['boolen']    = 0;: `# F2 {$ ?4 s5 y
        $result['message']   = '上传失败';- e8 H/ k9 Q; I7 T6 N, {" l4 f
       }
) f0 |7 @+ H, j) x     }else{  [/ C. S0 t$ U8 h* ?+ Z, n
         $result['boolen']    = 0;6 R) N) G" C/ h; O
         $result['message']   = '上传失败';4 Y/ W% |* M: t" o
     }
/ Y  v( ~0 n* H8 Creturn $result;3 N: a( {/ @8 D! g$ Y6 F
    }1 S" h4 q/ J" U4 X
unloadpic()方法没有对文件类型进行验证
/ i5 `5 ^, N& a 3 L) q- m, m  g* y5 e( j8 w3 h, B
可以构建表单, 选择任意文件, 提交到6 Z& Y+ L: \6 v. b
/index.php?app=w3g&mod=Index&act=doPost
: U8 M0 V0 B, s: ~2 Z
/ \- M) S& N1 f9 w! z在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)7 m- r, b, P' {3 n9 X/ Y) v( v

2 e3 s/ k* O" b/ O$ n( L" d
/ m4 P7 C) e% U2 }4 f/ a在登录thinksns官方微博后,
2 C. Y6 z8 \: ~2 b  |; m% a1 m) i/ D3 t构建以下表单:* k. q  |6 G8 V7 j

9 S) ?3 o( Z" Y; w: r5 b<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
3 }% j2 ?% v9 R: r<textarea name="content">test</textarea>
1 L2 {0 E) j- z5 Y4 @. Lfile: <input id="file" type="file" name="pic" />
. N- N2 U1 e' I. w<input type="submit" value="Post" />( a- `: Q+ @$ ?( T! P9 ^
</form>
/ n9 p% Q4 }- J! ]1 M去掉缩略图的前缀(small_ )' H' y* A5 G) l8 f) {0 G6 W
​修复方案:
( Y! e; L9 A' F
  z9 B% h" \# u; s' ]" D, g+ G" u2 D/ C7 ?9 Q, B! s1 N1 s
\api\StatusesApi.class.php
  t/ w% ?5 N3 R4 Q5 H; u1 O" o ' n2 b7 ^' Q: J
function uploadpic(){' H$ q6 \: a( r7 h. _
     /**
& |0 R* f8 X6 s% O      * 20121018 @yelo
( X  P% o6 F. G$ `8 G2 c6 _& P      * 增加上传类型验证
' |& ]- E+ C1 O, j/ w      */
% a- K$ l2 x( I% Z9 J     $pathinfo = pathinfo($_FILES['pic']['name']);
4 u- j3 T2 {/ J. A0 k  L     $ext = $pathinfo['extension'];
, K$ \1 X- s) O' K' s  C $allowExts = array('jpg', 'png', 'gif', 'jpeg');8 m( ^  p  H& C, _/ k7 |( W
+ J) |6 N1 K  p) E* q
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);" h, D( q+ G  I
/ x/ _. J8 O) a$ N# ~8 u3 ]  \
     if( $uploadCondition ){
1 v& G3 ?( a  [     //执行上传操作
! Y" K# A3 U8 F& P4 |% U     $savePath =  $this->_getSaveTempPath();9 y6 z2 j! ^# G  ~8 w8 U
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);' x( L* Q. B, q
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))# u% v4 ]' \! x) n# I8 r5 B7 ]
       {% h9 ?! w9 F7 D. }$ W. N! g
        $result['boolen']    = 1;
  _. X3 [6 V; k( g  H        $result['type_data'] = 'temp/'.$filename;
% c; g, Y) H# Q        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
% Q% K9 l, d/ Z6 ], p8 y) o$ k       } else {- G) o/ X' |! {; E, C" {! n
        $result['boolen']    = 0;- ~6 e# @! t$ Z
        $result['message']   = '上传失败';# z& n' R: ^7 A  L$ H8 R
       }
- \& ^* B' \# @+ l: ?; \     }else{
3 @/ b- L1 D2 S* t: q- N8 k         $result['boolen']    = 0;/ W& F" E: ?6 N$ A; @* q
         $result['message']   = '上传失败';
, t! e  b# y* F" n8 k     }
2 }4 E% ?6 H8 l$ N* ^& j3 wreturn $result;; B5 V% t" e! U; ?  ^# b0 e9 ?
    }5 C* I5 V# e$ j2 ~& C3 P$ w
3 b; t2 P- F/ I" a

; V0 c5 m- v& S9 d6 K; F
回复

使用道具 举报

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

本版积分规则

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