文件上传漏洞的绕过手法与校验设计
为什么上传功能风险高
文件上传本身是正常业务需求,但它把外部数据引入了服务器文件系统。如果上传的文件能被当作代码执行,或者能被其他用户下载并打开,就形成了攻击路径。常见的后果包括直接获取服务器控制权、通过上传大量文件占满磁盘,以及上传恶意文件诱导其他用户下载。
常见绕过手法
第一,绕过前端校验。前端对文件扩展名的检查可以被轻易绕过,直接构造请求即可上传任意文件。
第二,绕过扩展名黑名单。使用不常见的可执行扩展名、大小写变形、末尾添加特殊字符或利用服务器解析特性,都可能绕过简单的黑名单。
第三,绕过内容类型校验。请求头中的内容类型由客户端提供,可以伪造。
第四,构造双扩展名。部分服务器配置会按某个扩展名解析文件,例如把图片扩展名与脚本扩展名组合,诱导校验逻辑判断错误。
第五,利用文件包含。即使上传的文件不能直接访问,如果系统中存在文件包含功能,也可能通过路径参数加载上传文件。
第六,覆盖已有文件。如果上传路径由用户可控或文件名未做处理,可能覆盖系统文件或配置文件。
校验设计
第一,白名单校验扩展名。只允许业务必需的扩展名,并统一转为小写后比对,避免黑名单思路。
第二,校验文件内容。通过读取文件头部特征判断实际类型,确认与扩展名一致。对于图片,可以尝试解析并重新编码,去除其中可能嵌入的额外数据。
第三,重命名文件。不使用用户提供的文件名,由服务端生成随机名称,并去掉原始扩展名中的特殊字符。
第四,隔离存储位置。把上传目录放在网站根目录之外,或通过应用接口读取文件而不直接暴露路径。确保上传目录没有脚本执行权限。
第五,限制文件属性。设置合理的文件大小上限,对上传频率做限制,避免被用于资源耗尽。
第六,访问控制。如果上传文件属于私有内容,下载时必须校验当前用户的访问权限,避免通过猜测文件名获取他人文件。
结语
上传安全的关键是把文件视为不可信内容,在存储位置、文件类型和访问方式三个环节都做约束,而不是只依赖一次校验。