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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
& P: b7 ^. V9 ]( Q  @
- ^0 x0 Z6 V9 j  \; B& W $ A+ _9 h- x" q5 m
\api\StatusesApi.class.php/ b5 ^/ u  y' W1 ?& g: Y. p
8 S3 d9 I7 Z; e; U0 D& K/ }
function uploadpic(){  |3 n9 O: Q, e% M
      if( $_FILES['pic'] ){6 _  \$ i2 O6 y& `7 h# L! K0 @) ^
     //执行上传操作7 }8 e: A, W8 ], R4 C9 ]
     $savePath =  $this->_getSaveTempPath();
, ^- q  g( m6 t     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
8 D% E0 X. Y9 a) R0 R4 y: z    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
/ ^; i% {0 ?7 p& U0 o" w       {% Q5 _" r" q/ h: b0 [* p, }
        $result['boolen']    = 1;  R1 b8 l4 |) V, x/ k
        $result['type_data'] = 'temp/'.$filename;5 S4 o2 C) I/ u' w  L
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;$ {* q" F! Z* H4 s
       } else {
5 |7 t& ~1 X/ x) |8 U        $result['boolen']    = 0;: v0 t6 I0 W) c! M6 W+ h* A
        $result['message']   = '上传失败';
% p0 [* D. d! P% ?; l6 i. Y       }
: `; m  E8 D! E3 E7 d5 H& @     }else{: @& I& L! W' C! K0 h
         $result['boolen']    = 0;
# t* B6 ^7 @% x8 X" l0 D' Z         $result['message']   = '上传失败';$ G- e/ @9 ~; s( w
     }
6 _. P3 x9 o; vreturn $result;, g& k3 c* s: `4 ^+ l3 @8 C
    }# n1 f& W* \) p  ^
unloadpic()方法没有对文件类型进行验证
: ~, ~4 }9 w$ G% S  n ; y& V: A: a7 c8 T/ L) f  V& h7 s
可以构建表单, 选择任意文件, 提交到
' i" g! f5 S7 b% M+ i. V/ t! w9 Q  Y/index.php?app=w3g&mod=Index&act=doPost% e' ~0 E: e+ w; c; H* ?

: v) v3 z4 i3 v在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
' w. I) |1 f5 W- W- t# p9 [
1 q5 X& y1 [3 l" n2 ?7 Y
7 d: Y, W( g8 k1 Y  B在登录thinksns官方微博后,
& e) B( g5 G7 `: r! i! H8 [9 m构建以下表单:: P# J# Z$ z. @/ O4 U# K" b: O
# z  ^2 j. H; l" ^2 B
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
) G* J$ T& ]: ?7 c9 i$ f<textarea name="content">test</textarea>9 i) ~) Q8 N( x7 A1 \& q( s
file: <input id="file" type="file" name="pic" />
1 ?. P$ O4 U: [; k<input type="submit" value="Post" />3 m3 |2 _' [' e
</form>
5 ~# O' [3 R3 u5 c. Y去掉缩略图的前缀(small_ )
% l7 ]) O$ y, [0 t5 |​修复方案:  R) a; t! w- j7 P; L3 i8 ^* W

* N7 C! r2 P+ X0 z3 g
& u0 }* X0 u- K\api\StatusesApi.class.php6 }- `9 d; m) B% |
- Y. ]1 y4 F3 k* B
function uploadpic(){
9 F  O, f. E* ?6 I3 L; f, c  ]! _     /**. L" r  M: \# S, T7 i) b- a
      * 20121018 @yelo( c% e: z, J. E9 j  U$ m; s7 z
      * 增加上传类型验证
; N: T' S8 Y9 z      */
& ?5 P; q4 f! a     $pathinfo = pathinfo($_FILES['pic']['name']);  d5 ^; Q' b( T0 ?/ h$ W8 g' E
     $ext = $pathinfo['extension'];  y% V- C! R) [! y
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
7 e6 v$ I! n6 Q' O1 S
1 W/ Z& X( }" S+ ^     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
+ L- U6 O* w6 I% C3 a5 B
: @* W  u6 R- n8 o/ p     if( $uploadCondition ){. p/ n- l* d; R
     //执行上传操作
$ o  T& I- O# m0 O  c, n     $savePath =  $this->_getSaveTempPath();
: w4 E) m$ H1 \# O     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
% \8 j' q7 P% u' d    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))* [" A* Q& ]9 a! e9 P
       {7 }2 L9 c& w) K
        $result['boolen']    = 1;
7 Q; m0 V" c+ d. z8 W) p& r, _        $result['type_data'] = 'temp/'.$filename;
/ \4 {( U2 z4 K        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
. e# y& ?. F0 w, e! k1 h       } else {
' }! X1 _& g) P4 \! v: X2 o+ q        $result['boolen']    = 0;
& M5 b7 W- A* f( |* w, D        $result['message']   = '上传失败';2 B( W/ a+ o. p! A0 r" ?6 n) }% ~
       }0 I7 _* |; }, c. [, W
     }else{# T4 ?: N: q* t* G! _$ d) V; r
         $result['boolen']    = 0;
9 }' W3 u) r7 F# A+ P         $result['message']   = '上传失败';
4 R3 T# s( b4 m+ r1 J) F     }4 Z: [4 t2 ^9 t* ]/ a# y# @; c4 _
return $result;6 _2 L5 f* h. z( `
    }
4 _; P0 Z$ X) t) {
) W3 e( o3 O+ z* V, Q, r. X; [8 d1 k- z+ M7 ?
回复

使用道具 举报

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

本版积分规则

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