中国网络渗透测试联盟

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

作者: admin    时间: 2012-12-4 11:12
标题: ThinkSNS 2.8任意文件上传漏洞及修复
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
  v, O8 x5 V- d9 J( o; ?9 b
" q4 }9 Q* h" q/ y, s9 l 0 Y8 U' E8 w8 \7 N: }& i& w
\api\StatusesApi.class.php
! K% y8 {$ t- m6 p
( ~2 m5 W% p6 sfunction uploadpic(){
9 S! O8 Z6 F" G2 w      if( $_FILES['pic'] ){
) g4 |% {3 [) i2 d$ A  B: @     //执行上传操作
/ b7 c$ y/ ]  I" ~& u4 _     $savePath =  $this->_getSaveTempPath();+ v) s) A4 R6 J5 D# c" S( K
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
( F' |. x0 }7 M4 t. g    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
( _* d5 W+ ~0 f+ G       {4 x6 ~! s* Z! O
        $result['boolen']    = 1;! z5 \% F# v, @( {- x& Z4 B7 r1 Z/ u
        $result['type_data'] = 'temp/'.$filename;
8 u9 y! @0 i! l- I' b        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
1 M8 _0 q* |; y& [6 }1 w       } else {
/ e* L6 a# Y+ @6 k        $result['boolen']    = 0;* t& t* ?" c" P
        $result['message']   = '上传失败';
, _. \: h6 H% ~, N+ X3 R4 n. Q) D       }5 a4 R; i0 f. A2 w+ w5 w0 R  B
     }else{5 r$ i; t# G% R  y' n: Q
         $result['boolen']    = 0;
8 J0 ?. _, f- O* M3 E" S         $result['message']   = '上传失败';4 K6 y; y0 B4 s' F% ]8 i$ I
     }, Y8 B3 a% g% q$ J' u
return $result;- I' q3 _4 `# ^, {/ t6 f1 X# E% ~
    }
- G, S8 w0 Y* R  i- t$ zunloadpic()方法没有对文件类型进行验证
& a! o* {- S% ~ & Q: p- X# K4 y* r- b
可以构建表单, 选择任意文件, 提交到
& _7 }9 k7 n$ ^9 l/index.php?app=w3g&mod=Index&act=doPost
- A" k5 t4 F7 Y/ V  e5 H ' h' m7 q' e  j; e
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
) W" h. `+ Y. n- U3 ]9 I7 M
, K* }  B& {! r$ W. ~0 b. I2 j* t
+ A% x# l. G. o$ f. P4 d在登录thinksns官方微博后,# a4 j$ u# q' X; Y& z* I; v
构建以下表单:* Q( s9 n+ i" X' X% Y8 y1 a

2 m  S- V- B+ F<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />6 H3 `4 }/ g; x' F: v
<textarea name="content">test</textarea>
8 i' g" J6 o4 A/ R' o: Q& ~# q+ xfile: <input id="file" type="file" name="pic" />
7 ^8 i2 L& S) \. {<input type="submit" value="Post" />
8 p9 D: T/ q" J: O: S# u4 ?</form>
: `9 G7 F1 ?7 _0 Q去掉缩略图的前缀(small_ )
6 i  _8 U4 k9 P/ [, D# q+ M​修复方案:
: B  K* W, z7 k" x' Y
* U, T  E" G3 y' H! C4 ^$ h* g3 G0 t( O
# S. D+ H0 c# n' _\api\StatusesApi.class.php
, v5 J& B( c0 U' n& M/ ]' x : Z2 H7 X: a; a0 B8 ?5 E: j
function uploadpic(){
( ]  N! [- Y, \! M" M3 i% J9 m     /**; ?: j" Y5 l4 U9 Q
      * 20121018 @yelo# s  s1 {0 p6 ~0 Y( ^' \. h
      * 增加上传类型验证
" ]6 E6 V  u5 x- F# ?; P      */$ ]8 ~2 u: W7 b3 n6 N
     $pathinfo = pathinfo($_FILES['pic']['name']);" g" d6 ~& V. f- H8 s4 B9 Z
     $ext = $pathinfo['extension'];8 [6 I- b' b% L; n
$allowExts = array('jpg', 'png', 'gif', 'jpeg');4 [" D+ T9 P9 W8 h/ o+ N0 p" }+ t, n

( k) n8 N4 m6 }9 F8 A" b2 I     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
& N- g6 n% C: L: ?
; M4 x/ o" W' Z# K+ N0 E% c2 K     if( $uploadCondition ){8 b) }& f8 _6 u
     //执行上传操作
% I: q  [1 m2 ?4 u, Q     $savePath =  $this->_getSaveTempPath();# G; v8 O' E- }: I8 R, w0 B
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);' q% z/ Y; b/ Z3 S% Z
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
, I, ]0 c7 x0 t& {) p* U       {3 l/ ?1 q  i: @7 y" |& C. T
        $result['boolen']    = 1;, K0 U4 Q+ U9 q. _' l9 |  |0 S
        $result['type_data'] = 'temp/'.$filename;1 {) H. \! g3 K* q8 l4 V
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
7 e/ K0 K$ d& J, L$ K+ ]+ S       } else {$ p/ u. ?+ A4 T1 ^7 f  ^3 c; @! A
        $result['boolen']    = 0;) `( L: j3 ?# F9 X- M
        $result['message']   = '上传失败';4 Z4 }( F" V4 q4 b* c# y
       }8 Y/ g# |3 ]8 d3 K! U' {& g" N2 h
     }else{2 Q" I1 N$ _6 Y+ W7 M) W  O6 L
         $result['boolen']    = 0;
- C0 a1 k4 M) {0 V) m         $result['message']   = '上传失败';
" s' x' g" ]( \1 ]     }
0 q# p0 {3 A6 A! G* Nreturn $result;
1 v4 {( S. d& J# {. D8 O6 @: k    }  H% g7 A" K: P& w/ C
7 j% W& x$ q5 P1 G) P" p

# h$ d+ L) t9 z! o# X" T. c




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