纵深防御——文件上传漏洞
1.核心思想
前端检测:主要用于提升用户体验,快速给出反馈,减少无效请求对服务器的压力。绝对不可作为安全依赖,因为可以轻易被绕过。
后端检测:这是真正的安全防线。所有文件上传的合法性、安全性校验都必须在服务器端进行。
2.前端检测方案
2.1 文件扩展名检测
原理:检查用户选择文件的扩展名(如
.jpg
,.png
,.php
)。绕过方式:使用Burp Suite、Postman等工具截断HTTP请求,修改
filename后缀后发送
(比如修改图片文件的后缀为php)。
2.2 MIME类型检测
原理:检查浏览器提供的文件MIME类型(如
image/jpeg
,text/php
)。绕过方式:使用代理工具直接修改请求头中的
Content-Type
字段。
2.3 文件大小检测
原理:防止用户上传过大的文件,影响服务器性能和存储。此检查在后端也必须进行,因为前端可绕过。
总之,前端检测非常脆弱,攻击者只需拦截HTTP请求并修改其内容即可轻松绕过。
3.后端检测方案
3.1 白名单文件扩展名检测
原理:这是最有效的检测方式,只允许明确安全的扩展名,拒绝其他所有类型。绝对不要使用黑名单(如禁止
php, asp, jsp
),因为总有漏网之鱼(如.phtml
,.phps
,.php5
等)。
3.2 MIME类型检测
原理:检查HTTP请求头中的
Content-Type
。但此值也可被伪造,需与其他检测结合。
3.3 文件内容检测
原理:检查文件的魔数(Magic Number),即文件头的特定字节,这是文件类型的真实标识,不受文件名和MIME类型欺骗的影响。但是也会被伪装,需与其他检测结合。
3.4 文件重命名
原理:切断用户控制的文件名与服务器最终存储的文件名之间的关联,使攻击者无法预测或直接访问他上传的恶意文件。
3.5 存储路径安全
原理:将上传文件的最终存储目录硬编码在程序中,不与用户输入拼接;或者确保该目录不在Web根目录下;或者没有执行脚本的权限。
3.6 文件大小限制
原理:限制上传文件的体积,防止DoS攻击,避免磁盘被填满。
3.7 图像文件二次渲染/压缩
原理:针对图片上传,使用GD库或ImageMagick等对图片进行重新采样、压缩或缩放。这个过程会剥离嵌入在图片中的恶意代码,生成一个“干净”的新图片。