中国网络渗透测试联盟

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

作者: admin    时间: 2012-12-4 11:12
标题: ThinkSNS 2.8任意文件上传漏洞及修复
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
, G8 [/ U% e2 v2 |6 }8 F9 r! f6 G- ]7 C. E! U2 B% D* f6 p6 n& I
6 q- c6 r) }  S4 ^( n; i/ T5 _
\api\StatusesApi.class.php
/ j& y7 s3 t: d% G   F0 a' y, K0 l# @7 [4 j. O
function uploadpic(){
- W$ q! b/ a9 u; i      if( $_FILES['pic'] ){: [+ Q* r9 e8 M7 A# U9 _: s9 |3 E
     //执行上传操作
: D" ^  S0 F+ p9 ~: K% P& M     $savePath =  $this->_getSaveTempPath();3 _8 T( Z3 I7 V: i
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);/ W- P% s7 a4 g3 [
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))5 b5 H$ c4 b3 N* Z' r) T3 U
       {
& K( Z. K( C+ e: [0 M  j6 `        $result['boolen']    = 1;
# Q3 k( Q4 P+ {) Q        $result['type_data'] = 'temp/'.$filename;% G. e" t/ ~6 S  s, ^- E
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
& C' ]& v2 I& k# h$ m6 w) d       } else {2 [3 l5 w2 K( W6 @
        $result['boolen']    = 0;3 t, |  ?9 P. |: ]
        $result['message']   = '上传失败';% ]  i# o/ i3 [8 H! c! L- q
       }
/ q, `+ w) W- q" p( J" @0 k7 v     }else{
6 r7 e- A) D% K; V7 M5 f) _, q, p         $result['boolen']    = 0;
2 u: D5 i* S( x( H$ s- B         $result['message']   = '上传失败';1 v: N' @. v$ O) F# S8 g$ ]
     }
0 a  t" B2 Y6 B; Wreturn $result;3 g# z; c( M' M. x. B
    }
: w7 J$ W- s$ b" A4 I5 ~. j$ }5 Junloadpic()方法没有对文件类型进行验证
4 I$ G* x( `' S1 i2 P2 I
8 e, J8 x' }2 u! o' y; z: p可以构建表单, 选择任意文件, 提交到
5 _+ T# m4 Y6 ^- f1 J0 d/index.php?app=w3g&mod=Index&act=doPost
+ Y. n" \, j/ w! k) X. S* H9 b$ z
- f' ?3 F" ~* h5 l! H7 X) P3 r1 n在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
* c2 e( i* f. y3 l# J& m' D; ~" I
( R7 b% Q: D. N: x
在登录thinksns官方微博后,, U" B( h) U/ r4 H2 o1 k1 D8 @
构建以下表单:
) g; t3 G9 d2 z* j
. t& I5 S5 x& v* T5 B& I<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
7 I! K9 Y: z* k<textarea name="content">test</textarea>, V( i) n- K: E1 k7 m1 q
file: <input id="file" type="file" name="pic" />$ {- G7 g9 j4 P) s) E' Z/ ?+ Y1 n
<input type="submit" value="Post" />
0 F; X% D" x' y2 h0 \, }</form>3 k  P8 V4 h( A) g6 w& |
去掉缩略图的前缀(small_ )
8 T4 B3 j" W, v3 d% |2 }6 N% {3 d​修复方案:
  i' B0 v" n& b1 C5 B$ H
$ T5 b8 l  `' j2 w( N) Y! S7 Q8 s6 \# L4 b( y
\api\StatusesApi.class.php, b* [/ w! V: i* M9 J# _- T' {
' `" ^5 V6 c  |: H
function uploadpic(){
  f" X, D) m. C( k8 q     /**
9 V, G! a! r! W+ a7 }2 p. G3 K      * 20121018 @yelo  H; ~: {. i+ n9 g' f; a4 |5 D: V
      * 增加上传类型验证: s6 Y3 |5 T/ R5 a- ?
      */
& m9 w: R0 e: I8 \  ?+ p     $pathinfo = pathinfo($_FILES['pic']['name']);
* H3 Y$ d8 i5 b3 ?) r8 ?     $ext = $pathinfo['extension'];4 M. D- T& U! S4 r( `! M5 c$ W0 M
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
. b+ J7 k9 f* c: L& p8 Y0 t
: p+ v7 a+ H% _' ?6 w/ H     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);( |4 n9 q2 O7 h! ?! w" |7 Q
9 X# N! i% J0 @- n% w
     if( $uploadCondition ){
) ?. q9 C) a0 `6 V4 X) N% l     //执行上传操作2 X. V# L. A2 S& F
     $savePath =  $this->_getSaveTempPath();$ W4 J6 h' m1 U" U8 s* d
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);; m. }; m6 Y' S% a! b4 d5 |/ q
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
# P6 W0 \: x- c8 q' K       {4 C' S* j: r* Y1 P( k; p
        $result['boolen']    = 1;
9 d6 @& W* C$ d* ~" }        $result['type_data'] = 'temp/'.$filename;
  R1 L( o' F. p" Q% b, t4 z. }% }        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
5 S" L# }% \+ t; E/ t" H# B       } else {% a1 R; x" P7 S! n
        $result['boolen']    = 0;2 V1 y! N3 N: L5 u: B
        $result['message']   = '上传失败';/ {+ s, q  `' X" d- N$ p
       }2 s3 f0 ~" t, a# ?; z* L$ F
     }else{# R. g+ ]5 I0 H  N9 w
         $result['boolen']    = 0;
7 p, a1 ?$ w5 d+ t) I         $result['message']   = '上传失败';' ?! ~% v  M3 H% m
     }6 J0 O, {! u0 Z1 e: R% h
return $result;
5 c, h! k+ k/ d( }) y    }
# N6 S% t, W9 w. Y
( Q% E  M% p/ c# E. N- P8 |6 [! q4 K# n- s! Y





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