中国网络渗透测试联盟

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

作者: admin    时间: 2012-12-4 11:12
标题: ThinkSNS 2.8任意文件上传漏洞及修复
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
5 E1 z. w7 a1 j% Y& b9 d. [5 f9 m1 n

) Z# x) i( o6 E5 b5 F# @$ E\api\StatusesApi.class.php
5 U; K4 B+ v) Z: m- t- l! p
5 j& R1 @" d; D" W- xfunction uploadpic(){
! ]% }' B$ a( d# O4 p      if( $_FILES['pic'] ){
6 Q/ ?" M. R' C, F+ u, d     //执行上传操作6 ?1 }* z/ j. E0 L
     $savePath =  $this->_getSaveTempPath();
& N4 b/ E. r2 Y- O     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
" q& N+ m# A. ]  V  I- z    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename)). j, j/ f+ f6 V( B  S8 u4 i( V. C
       {! G3 a  e, d2 Q4 ?) M
        $result['boolen']    = 1;9 m5 R, u  i7 t1 f  Z
        $result['type_data'] = 'temp/'.$filename;
" r/ D9 D+ y. R+ g# A; i% m        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;% a+ _1 V# E; q: m7 u
       } else {
6 r1 H# z: `; g" u! c/ _        $result['boolen']    = 0;
# b) t) i% A7 ?+ c) }( T; [% c        $result['message']   = '上传失败';1 j, J; C- I" K# F
       }
8 c0 Z- A9 D2 i& f     }else{
! Y5 j5 b9 y9 E0 M/ G         $result['boolen']    = 0;
, I2 a0 b' g% k  H& \         $result['message']   = '上传失败';
) \  U: z0 I7 {( n. P     }
/ L) V: N- h& m9 Dreturn $result;
6 p  i: ?/ Q% s7 s* Y+ H    }
1 \# r0 A" o, z+ a" R" Dunloadpic()方法没有对文件类型进行验证/ ]( v7 V1 s9 E) X1 J. Y9 j
9 C# C6 e3 z! s. r- U
可以构建表单, 选择任意文件, 提交到
; V9 p; D) _& I" b* J/index.php?app=w3g&mod=Index&act=doPost& I) W2 v* F3 Q1 j
6 r' S4 k- \; Q( C0 I+ r0 A
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)2 T8 t& [* P, @# M% J

& v" o& B5 `) a( s! L
0 s1 t; T4 U8 R- a在登录thinksns官方微博后,
# \. u& N' l6 a& F  D构建以下表单:
% M- g& j: R8 ], R7 X6 A ) m( v2 G! o$ G- B' c  m
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />+ [. {" J" S8 m. M1 H2 X& f
<textarea name="content">test</textarea>+ R6 c# G& D% m/ r; ~; z
file: <input id="file" type="file" name="pic" />: `" v/ P, _  `" Q. v2 v! ?
<input type="submit" value="Post" />
& c3 [8 d4 v9 M0 z8 L9 K</form>
- N( P3 _8 C9 a去掉缩略图的前缀(small_ )" d6 o" h, B2 r6 E# s# w
​修复方案:
7 J0 V0 Z' r7 b  R( v. u0 g
  L$ B8 j" g, m8 u1 I4 `) Z2 ^+ Y
# ?0 X+ c( z7 _9 T% O, {5 D6 N\api\StatusesApi.class.php8 \* f* R  @5 Z" A- c1 u, R
& I8 `+ X3 |  ~
function uploadpic(){
, m' L/ f* w, Q' X9 n$ q     /**6 c# h9 l' b0 R* I' w5 v" r* _
      * 20121018 @yelo
$ Z  u# R7 |, C  L3 e      * 增加上传类型验证- j: r- c) {  y+ a2 I$ w
      */) L! z# g  E) W0 V9 {% i
     $pathinfo = pathinfo($_FILES['pic']['name']);
" G/ m( m* T* V) G8 Q     $ext = $pathinfo['extension'];/ E0 `. ?2 |4 v$ @: N' i( P: g" c
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
4 i6 S8 j( @/ q" g
. f* O. P0 f1 A3 b  b1 X     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
0 u# y; ~+ D3 }* D
# i8 }  t$ k/ b# o% C     if( $uploadCondition ){
" ~7 R+ _: B3 t9 J+ l" i     //执行上传操作
( Z3 a& m* W1 i' h3 `# H     $savePath =  $this->_getSaveTempPath();
! O/ m* B4 M3 t4 e- r     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
* X- {# r9 F' T. R7 l    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
' i' q# L- t5 o& y% z       {
: j+ x+ T2 _; M. M8 t" N) S# X* U        $result['boolen']    = 1;# j: |' i, m: r; ]
        $result['type_data'] = 'temp/'.$filename;! t% ~- @! ?1 a8 H
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
; b9 w) f/ J: A' P       } else {% [( g2 F, Q% L
        $result['boolen']    = 0;
/ N. j9 y% e( [: @6 E# H        $result['message']   = '上传失败';
3 l; O" h( v* T: V8 ]       }* S+ q* e: \* `9 a# l7 y$ u/ Z
     }else{
8 b8 x2 [& Q9 I1 B0 F1 L: w* I         $result['boolen']    = 0;5 b: n: r& k' @: p
         $result['message']   = '上传失败';
) i% F$ [# C6 |     }" M% X6 y8 ?) C! c" W5 |" h: b
return $result;6 a3 ]" I( G' k6 {) L6 T2 R
    }
2 z2 r8 @( Q+ e
- g5 _% F* e" r- L( o/ j$ Y, a( }3 F( j/ `





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