案例分析
部门业务:客户通过web上传资源文件(图片、视频),客户端通过下载资源文件到本地进行展示;
安全隐患:攻击者上传一些攻击的脚本文件,文件在客户的机器上被执行,带来很大的安全隐患。
1、JavaScript对文件后缀名检查。
检验方案:
前端可以通过校验文件流的type类型;比如下面只允许部分图片类型的上传
const isUploded = file.type === 'image/jpeg' || file.type === 'image/png'
if (!isUploded) {
this.$message.error('You can only upload JPG file!')
}
可行的攻击手段
攻击者定义一个脚本,直接是不能通过验证的。
但是通过修改文件后缀后
上传文件直接通过了验证
解决方案:前端魔数检测
所有文件在计算机中都是以二进制模式进行存储的,不同类型的文件的二进制前缀一定有区分的,因此上传文件需要通过二进制更加准确的检测文件类型。 魔数检测原理方法
常见的文件前缀:
- jpg:FFD8FF
- png:89504E47
- gif:47494638
- HFML:68746D6
2、服务器对content-type进行校验。
Content-type是客户端标识到浏览器中的,请求时携带在http报文中;后端可以通过判断该类型进行验证。
可行的攻击者手段
攻击者通过一些第三方的工具比如(Fiddler),攻击拦截http请求,伪造Content-type的内容,绕过后端的检测(如下图)。
Fiddler拦截请求
Fiddler修改参数类型-发送
方案:魔术检测+Content-type校验
服务器的content-type可能被伪造,只能作为验证的辅助手段;服务端也需要准确的问题类型校验。
其他的攻击手段(后端校验可能多一点)
- dos攻击,没有限制文件上传的大小、上传评率。
- 攻击者生成一张有恶意代码又是合法图片的文件。
- 上传文件后,文件名称没有随机生成,可能暴露服务器的文件路径等等。