中国网络渗透测试联盟

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

作者: admin    时间: 2012-12-4 11:12
标题: ThinkSNS 2.8任意文件上传漏洞及修复
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
1 O+ w) P1 U+ z9 D+ Z, v7 b/ b
6 R4 M5 i1 C* X& J7 S8 t: A ( Z3 m9 b3 p, |1 ?; j, L
\api\StatusesApi.class.php
8 e- ~4 m1 m. m- @8 n' S" F
" `: ^# P$ t; C- v( Gfunction uploadpic(){
7 U; y  v' \' D1 J' r      if( $_FILES['pic'] ){! P4 d  E2 n( M: S4 g1 ]
     //执行上传操作: R- u, \0 i7 z# F
     $savePath =  $this->_getSaveTempPath();, b& L% }! M/ n! C/ g
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);" `& r# j8 C4 u& |! L, s- R) }0 D
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
$ L! o. @5 \. l( P' K3 G       {$ N! d/ r6 l) R: K- ~
        $result['boolen']    = 1;
0 O1 H4 W$ y9 M8 o4 R! X5 ^( ]: G        $result['type_data'] = 'temp/'.$filename;
" @& Y: \# l1 `% @# y        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
& i% C, r1 t& k( |% c7 J+ H9 d       } else {+ u( {+ x' {' q  ~' V* W
        $result['boolen']    = 0;( ]7 o; P- `5 j7 i6 ~9 ?
        $result['message']   = '上传失败';
# m" T) v- A; H; }. G       }
; {0 p+ H: [7 w" N. [9 }' s4 P     }else{
# G9 i4 F4 N- E0 `  p/ y* o         $result['boolen']    = 0;
9 T8 _/ Q- h( R0 O, A. F* l4 X* e         $result['message']   = '上传失败';
, h& Z- {1 O+ y' C. q  N9 v- g/ `     }
! D5 Q  q3 [6 p6 O9 B% Ireturn $result;* ~1 g; e1 G' F: a- w; S' u/ c7 J9 K
    }
$ S1 O0 }; x* K* _8 N3 ?unloadpic()方法没有对文件类型进行验证8 r0 O* t# l9 w6 ]' k* A* E- M# b) q
! x! D/ D& f. f
可以构建表单, 选择任意文件, 提交到
" H5 C* r* C. C3 w, M6 ]( V6 y/index.php?app=w3g&mod=Index&act=doPost: X$ N8 b" j# L' i' n
' ?/ H6 z, }( [  y" y
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)) `7 E+ s( A- e& ~  m. p" D6 ]  C3 F
4 ~5 ]5 s) k( ^( V
: [& q4 o8 U6 k! f! v0 h- z/ `: g3 ~
在登录thinksns官方微博后,- \: H) t3 w7 E1 w, o
构建以下表单:6 l1 Y/ j" X6 P

! D% j1 G7 m, V. v; O( W<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
& h  y; H, s* p# L- k3 W8 S% r<textarea name="content">test</textarea>$ B- _6 Y! S# V! \
file: <input id="file" type="file" name="pic" />7 a! D. I* p1 h3 o# C
<input type="submit" value="Post" />
1 S' {0 u! E; h</form>7 Y$ a+ I, i& h8 H3 v0 G- G: \6 n
去掉缩略图的前缀(small_ )
' _' x, X0 w6 g; Y$ t$ o​修复方案:
; U: V) W# o. q* L) e2 |4 n7 A3 q1 A- U9 p/ R% e

/ V  j& M7 y1 z& a" ?\api\StatusesApi.class.php1 G* B# K' t' z! F

$ c$ t9 F' p, j& u3 |function uploadpic(){
$ S/ Y, W, h1 C0 P4 A) _+ e     /**
( q" x+ v( B3 s- l8 s4 P      * 20121018 @yelo
( H( ?5 W# f0 _; Q+ Z# Y0 L      * 增加上传类型验证
! f1 K9 y" X; L' L      */5 [/ M2 v" h! `5 D! d# R" A, B% {
     $pathinfo = pathinfo($_FILES['pic']['name']);2 q2 @# `, E4 u1 p
     $ext = $pathinfo['extension'];
; M+ T3 p5 S7 ] $allowExts = array('jpg', 'png', 'gif', 'jpeg');
" o0 `! W+ s+ S$ `, O ; v7 e9 Q  m9 k, Z# j' i4 Q; p
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
) V8 l( A3 ~. h# b
" `) f3 f" w0 B- }7 c& w/ Q     if( $uploadCondition ){$ M4 h: C, o. l2 G( m1 F
     //执行上传操作3 E* D+ Q8 o+ M3 r5 ^0 O! M2 f7 J0 z
     $savePath =  $this->_getSaveTempPath();
0 o$ o# w& A9 o- b8 v& Y     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);9 X) G& g# J- ^9 F! G- f5 ?7 k
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))% e" W& G0 [, ?( ~- U
       {1 J& ~2 `# B( t2 `2 ~0 @" S/ M
        $result['boolen']    = 1;
. j. M& D. }6 u        $result['type_data'] = 'temp/'.$filename;
1 }7 l6 I, E0 l+ _5 t* i1 j9 l, j: i/ X        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
" f9 c  v, }* K0 [/ k       } else {
$ |. _$ B1 v  e- T$ n        $result['boolen']    = 0;% m) M" s, _4 e
        $result['message']   = '上传失败';  i7 |' E+ g) K1 z$ r, m. C7 e
       }
1 {% y( v- j7 [# O7 m5 x$ ?0 a' K  a     }else{% [0 [9 w, q2 f; d( B& k2 j- j
         $result['boolen']    = 0;
8 [7 L+ a, N4 g% I         $result['message']   = '上传失败';
- D) U6 e4 ], Q1 R2 U9 v& ?     }  ~6 H8 |8 O) ^" f/ v
return $result;4 a6 O6 E5 R1 G* {
    }' e, l; Y, Z# t& a# q

) s. L# i1 \, j3 n6 B% ?! a! D! o8 Y1 `+ ^- m( w





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