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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
" t, c( g  [4 q2 _6 G5 T
; {$ F7 _$ ]7 T; J, _ : [& \* l1 [. R- ^- j6 M/ O6 ^
\api\StatusesApi.class.php4 y( U9 X# z. x, H
" X* F+ F+ Z  Y6 P! r) U
function uploadpic(){8 K  c# r6 `4 \0 a2 g
      if( $_FILES['pic'] ){
' s& f0 f* D0 j: V     //执行上传操作. T4 R/ Y/ }/ C, l  {7 V
     $savePath =  $this->_getSaveTempPath();
5 D6 g2 R# B2 U. N, D4 l     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);- }, ]' y/ h( X
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))2 H/ {0 o+ ]$ c6 K/ z. w' h7 g- R! Q
       {
! f4 A! s1 ?3 ~; E2 O        $result['boolen']    = 1;
+ x0 H4 |- o$ K+ t! Z        $result['type_data'] = 'temp/'.$filename;
/ B. \6 M3 i4 r0 @: j8 x        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
  u8 c0 z' X: M       } else {) F$ \, b% R& g
        $result['boolen']    = 0;
. Z6 P/ a, c) U  r& d        $result['message']   = '上传失败';+ g7 W% M& v* ?& e2 ~% ~
       }
2 ?1 u( ?( Y! |4 j. g- a     }else{
- K0 C$ r8 t- f* h         $result['boolen']    = 0;
% ~$ c% M5 k. ?4 r/ P         $result['message']   = '上传失败';
, {8 |) @) J7 ^% W' x# N     }
/ I! J$ k5 ]6 l* l- P: Creturn $result;% f2 v  ~- m' {6 v' Z- s5 R0 q$ L
    }# w5 K# F0 j  m5 P* ]  B4 e, y
unloadpic()方法没有对文件类型进行验证% y* t5 I7 P/ S8 m; G- r
7 o2 v$ e. x4 L& A, L* [
可以构建表单, 选择任意文件, 提交到( B$ Y9 i- h* U% ^, ^8 r" r
/index.php?app=w3g&mod=Index&act=doPost/ R. {9 I$ J7 [3 e" [3 ?
9 U3 d( V. @% a1 d
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)3 s) S9 o9 W+ d" a2 A' O: |% E0 f
+ R; i3 P. L% f4 D0 l6 b1 j# f0 I9 \. m
: Q9 A- K. }/ J/ g9 a7 i- t0 g
在登录thinksns官方微博后,4 ]  o# \2 O1 U) Y$ l7 W/ P
构建以下表单:
8 Y) ^+ V1 C3 { 0 T7 [, e% v/ k3 B
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
* U! y. h! d+ U) }3 H& ~<textarea name="content">test</textarea>
3 U0 z9 v% l" w" U1 [: @/ M3 Zfile: <input id="file" type="file" name="pic" />( G& Y1 x. x5 n$ @
<input type="submit" value="Post" />& ~1 s) l% O( E
</form>
6 X& @' R% J4 N4 b去掉缩略图的前缀(small_ )
0 I/ _$ E$ z( M- y# m4 ?; F, N8 n​修复方案:2 d2 d/ z/ k4 v4 C0 [0 H

# I0 p5 o1 K! {* L0 r) R+ p
1 t, [+ L% f# s) t\api\StatusesApi.class.php' ^" I, ?, c$ k% P

. D( D- [9 s  I; u& Xfunction uploadpic(){
# b9 U/ a2 Q7 ?& N- N: x     /**
  z( c: o0 L4 j# ]5 x, g      * 20121018 @yelo, E2 J' C1 o9 p. W1 A( \2 N
      * 增加上传类型验证3 K7 W! f) `  ^- |$ @9 @3 |
      */; b. x  J9 W) W$ [0 R
     $pathinfo = pathinfo($_FILES['pic']['name']);
: n  J# ~3 a9 f. G1 C7 y     $ext = $pathinfo['extension'];" m! Q2 G* j4 I( D3 D) ^
$allowExts = array('jpg', 'png', 'gif', 'jpeg');3 H* J% o2 o  _* X. \7 k7 g- P$ U
) I, F- b. G8 U" W+ i* J
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);: e9 P6 o- d- P: j$ F6 ~  O

- n; g8 k6 j  B5 I" U9 `9 ]     if( $uploadCondition ){
. v  I# d6 E& w+ }! E; U) y     //执行上传操作' N* J1 V: P. w0 F( }; X
     $savePath =  $this->_getSaveTempPath();
3 B: J0 k0 x& E& u4 W4 a6 z     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
* r2 s  k$ I9 ]+ ?/ X5 ]5 B7 [8 u" h    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
+ Q2 S' t/ ?/ b8 @1 q2 u1 x       {
# l  k2 G  m4 q& B- b+ N        $result['boolen']    = 1;
- W2 X5 x, o' {, P1 P        $result['type_data'] = 'temp/'.$filename;
) N- y$ G6 T" P; |7 S1 l        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;* K( M+ M5 I6 [# {, \3 X" @* A
       } else {1 K- E1 ?, u: Y( |5 j& G$ n
        $result['boolen']    = 0;* M9 ~+ \4 W, u6 S0 A! G
        $result['message']   = '上传失败';. `& b6 a+ E0 ^9 o6 q
       }$ n( D* w7 i4 j- [( w8 V  x7 D
     }else{  F, s- U6 C  K9 c% w
         $result['boolen']    = 0;
9 ^/ G3 ~' @& \5 ~8 \9 n  r3 [* p& n         $result['message']   = '上传失败';
9 `$ H* V3 b5 l9 h% X5 R: V7 D5 \, p     }* _( j( i% ?, `
return $result;8 I5 S7 ]0 l0 l4 M4 G
    }7 ^7 N1 m! Y% s

- M/ A" Q- \! n5 ]) ~- `9 u4 r4 @. x! x
回复

使用道具 举报

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

本版积分规则

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