找回密码
 立即注册
查看: 2558|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2012-12-4 11:12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
8 l, c: E0 S1 N7 Y+ F: n# W6 S
* m+ A0 D! c- N, o0 k . d" y. f) N" `5 D) j
\api\StatusesApi.class.php$ R& H6 o9 @* M8 m7 D/ b

/ }4 t" `/ z% @: _* E1 S2 h6 Mfunction uploadpic(){4 f' f6 f& @8 Y, R% J' C, |
      if( $_FILES['pic'] ){4 I  U/ E. f2 N) A
     //执行上传操作
% Y5 G/ t- x: q/ [& U     $savePath =  $this->_getSaveTempPath();
! J! r  q  ^9 o: ^     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);! [8 Q0 Y! `5 k1 n) T' S
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))2 l# d  C- l8 X- e8 E
       {
, ?8 J; d0 z0 S. X" T0 O        $result['boolen']    = 1;4 j6 K' U# L# M4 T
        $result['type_data'] = 'temp/'.$filename;
$ b9 I9 n- x4 x        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
0 }* U* u# G) L: ]  a+ }       } else {
; J- I8 D: h  B  D8 w# `: W8 w2 B        $result['boolen']    = 0;
" c  J0 W9 p0 m        $result['message']   = '上传失败';$ \1 F3 H. W; l
       }
4 A5 \4 p4 p# P. @; G+ c     }else{
: S' m0 O5 i/ s' R         $result['boolen']    = 0;
+ ]1 f0 `. l( _3 v         $result['message']   = '上传失败';
, n9 k6 l8 g, ^4 m     }
' T, V# y& H  w6 lreturn $result;  x* ^/ f% W2 I  G4 M# Q
    }# s* f: ^! K5 s7 K
unloadpic()方法没有对文件类型进行验证" ~" d, y1 A4 O. D8 R* w& Q: |

* g; V" U" z% W! j可以构建表单, 选择任意文件, 提交到; e: J4 D, N4 z- Z- J  |, J( i
/index.php?app=w3g&mod=Index&act=doPost
! ?' x: A, k4 F9 H" | 7 y& t$ R  @; o. |% G" A- K
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀); K8 p8 j) N9 d$ k- y* a$ z! S
  d7 A; Y3 L/ F# S- B! ~

9 r# \; x. Y. r4 g6 @6 W% H( P在登录thinksns官方微博后,
+ w( K3 W* |# |8 i( h1 |构建以下表单:- i% R% r" P( g9 }8 {+ n% o* P3 q

( i! Z0 a. D3 u0 d2 f  c) L<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
$ T% E/ E, J7 }9 R- G9 }<textarea name="content">test</textarea>
# r/ Z( X1 k0 Q! `file: <input id="file" type="file" name="pic" />/ ~% M" B- a; v$ ~
<input type="submit" value="Post" />, S; p7 D% n3 ^7 @2 B% I; i
</form>1 ^3 R# r& B9 A3 l1 Y# F3 u; r
去掉缩略图的前缀(small_ )1 Y: V5 {% B4 {4 _; s6 C
​修复方案:% Y/ @  Q  G5 A4 {

1 Z7 v4 `- h+ M
' N7 k% b7 V! ]3 ]\api\StatusesApi.class.php
  _+ [: y4 R3 T) `+ \ # T# ^" b. ?9 Z1 }; h1 E4 o, W. d
function uploadpic(){
; l0 J3 E- P; ]" v0 ^1 P9 \     /**4 Q5 k6 n6 u; _# J; J
      * 20121018 @yelo
4 Y' Z) d) Y" V0 e1 Y- Y" a      * 增加上传类型验证
1 a8 S6 t: ]  e# ?4 D% X* F      */4 G* n7 x& q" R4 w5 M# J
     $pathinfo = pathinfo($_FILES['pic']['name']);
( J, r8 m! C7 j: k+ ?: o     $ext = $pathinfo['extension'];
3 F5 T8 d: s3 q/ m$ y( `4 ^3 K. u $allowExts = array('jpg', 'png', 'gif', 'jpeg');
6 e! J0 {& ?% W. ?9 E1 N
1 ]  I8 ?% H2 o; ?# m     $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);+ ^. S4 q' i" r6 l  k9 `/ B! k+ v
/ C) s, v3 y9 s  q  `
     if( $uploadCondition ){
. m' _  q3 Q3 x3 O0 U     //执行上传操作
1 b# a  C( Z& M) F5 H3 C- T7 o" ?& ]     $savePath =  $this->_getSaveTempPath();" s4 s: H# x+ {* j+ i) ]# ^
     $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);# h8 G1 K& N: T
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))7 u- u9 ?# q& k5 K0 Y
       {
# L- A) U% a) i1 e" s; x        $result['boolen']    = 1;
1 r+ x0 B+ n* `; E# p1 p* {  K        $result['type_data'] = 'temp/'.$filename;$ {) F, C3 O; r: \) F
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
8 t; X! R3 Y, f  {       } else {
$ R* S$ R% G; J        $result['boolen']    = 0;
/ H' b) ^0 u% B$ V9 N" [, Q        $result['message']   = '上传失败';
9 q8 z* x7 w  D       }
4 S) h, ~0 }& k* H" W- `8 {9 q     }else{
5 v! s1 q5 y" c' d! `$ v  [' k- j7 O         $result['boolen']    = 0;" Y0 f9 V$ w4 d2 v3 Z# Z/ H9 ?* b0 S
         $result['message']   = '上传失败';* d& M) N0 F" s- L
     }
* o7 n+ L6 |: Q1 T5 r  ~! Zreturn $result;
/ Q, ^2 e9 N2 F' o2 _    }
; A; G+ N5 o1 J/ _, v. {/ K$ z& @- x2 S9 {9 P# x; I& M- ^" c+ f6 B
3 o# P8 \; a- g2 ~! `9 n$ I% o
回复

使用道具 举报

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

本版积分规则

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