大家知道,在不支持以Ajax方式发送二进制数据流的浏览器中,要实现带进度的文件上传功能,一般需要借助Flash了(通过type=file表单上传,加上JS定 期向服务器轮询也可以得到进度,不过不在本文讨论范围。同样,ActiveX等方案也不在这里讨论)。除了显示进度,Flash还能批量添加文件,限制文件大小、类型 。到现在,Flash实现的文件上传在国内仍然算得上主流方案。
但是,几个月前,几个常用的第三方Flash上传组件纷纷被爆出XSS和CSRF漏洞(不知道什么是XSS/CSRF,以及它们危害的同学请自行搜索)。问题产生的原 因主要有两类:
一类是Flash里通过ExternalInterface.call执行JS时,使用了HTML中通过queryString传递过来的变量,并且没对参数进行检查 或过滤,由此引发XSS。我知道有此问题的组件包括:SwfUpload V2.2/V2.5,Uploadify V2.1.4。
另外一类是Flash代码里通过Security.allowDomain('*'),破坏了Flash原本的沙箱安全。使得第三方借助这个swf文件获取token 等敏感信息成为可能,从而引发CSRF攻击。我知道有此问题的组件有:Plupload V1.5.3。
如果你在项目中使用上述版本的Flash上传组件,建议尽快采取措施排除风险。对于Uploadify和Plupload来说,官方一直都有更新,推荐直接去官方更新 到最新版。对于SwfUpload,官方源已经有2年没动静,应该是已经处于无人维护的状态。如果坚持要用它,建议下载源码进行修改。简单说下修改方法(以V2.2为 例,V2.5类似):安装FlashDevelop,打开源码中SWFUpload v2.2.0.1 Core/Flash路径下的SWFUpload v2.as3proj项目文件,修改SWFUpload.as并重新编译:
this.movieName = root.loaderInfo.parameters.movieName; //修改为:
this.movieName = root.loaderInfo.parameters.movieName.replace(/[^\w\.-]/g, '');
修改完后,可以用如下格式的参数验证漏洞是否堵上:
www.example.com/swfupload.swf?movieName=%22])}catch(e){if(!window.x){alert(1);
window.x=1}}try{([%22
另外,由于上面提到的Flash上传组件被广泛使用,所以大家日常使用的开源web项目也需要排查下,并及时升级。例如,著名的wordpress前不久发布的新版就 解决了这类问题;国内开源Web编辑器KindEditor新版使用的SWFUpload则依旧存在问题。
(本图不惜泄露我的隐私,留作纪念:))
参考:https://nealpoole.com/blog/2012/05/xss-and-csrf-via-swf-applets-swfupload- plupload/
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8