文件上传功能验证
文件上传功能要从类型校验、存储位置、访问方式三方面评估。常见问题是校验只做在客户端(JavaScript 限制扩展名),或者服务端只看扩展名不看内容;更严重的是上传目录可被解析执行,或上传文件可被外网直接访问。验证思路是逐项确认校验发生在哪一层:先改扩展名上传,再修改 Content-Type 重放,再尝试双扩展名与大小写混合,最后检查上传后的访问路径与权限。所有样本一律使用无害文本文件,验证后立即删除,绝不使用真实可执行文件。
基本信息
| 校验点 | 扩展名、MIME、文件头、内容解析 |
|---|---|
| 存储 | 上传目录是否可执行、是否可被外网直接访问 |
| 访问 | 下载接口鉴权与文件名处理 |
| 验证原则 | 全程使用无害文本文件,验证后立即清理 |
| 修复方向 | 服务端白名单校验 + 内容检测 + 目录禁止执行 |
典型使用场景
- 头像与图片上传:最基础的上传点,多数只做前端校验
- 附件与文档:企业系统常见,需关注存储与下载鉴权
- 导入功能:Excel、CSV、XML 导入,常含解析与路径处理
- 富文本编辑器:内嵌上传组件,校验常不统一
- 压缩包上传:解压功能需关注路径穿越与覆盖
验证清单
验证清单
1. 改扩展名上传(内容不变)观察接纳情况
2. 修改 Content-Type 重放上传请求
3. 上传双扩展名与大小写混合名,观察存储与回显
4. 检查上传后的访问路径与权限(是否可直接下载)
5. 检查上传目录是否可被解析执行
# 所有样本使用无害文本文件,验证后立即删除校验层级与有效性
| 校验层级 | 常见做法 | 有效性 |
|---|---|---|
| 前端 JS 校验 | 限制扩展名 | 无效,可绕过,仅提升体验 |
| 服务端扩展名黑名单 | 禁止 php、jsp 等 | 较弱,扩展名变体易绕过 |
| 服务端扩展名白名单 | 仅允许 jpg、png 等 | 较有效,需注意解析差异 |
| MIME 类型校验 | 检查 Content-Type | 中等,可被伪造 |
| 文件头与内容检测 | 校验魔数、重编码图片 | 较强,配合白名单更佳 |
| 存储与执行隔离 | 独立域名、目录禁执行 | 关键防线,缺失时后果最严重 |
修复视角:服务端做扩展名白名单校验并结合内容检测;上传目录禁止解析执行、随机化文件名、使用独立域名或对象存储。
用真实可执行文件测试会构成武器化风险;只测前端 JS 校验被绕过也不足以证明服务端存在缺陷,需确认服务端实际行为。