# 文件上传漏洞检查清单(CWE-434|OWASP Top10)
适用:渗透测试、代码审计、安全验收、等保测评;分为**功能发现→前端校验→后缀校验→内容校验→路径存储→容器解析→高级绕过→权限管控→代码审计→加固项**10大模块。
## 一、第一步:梳理全部上传入口(先找点位)
- [ ] 头像、图片、附件、工单、资料导入、批量Excel/CSV导入
- [ ] 富文本编辑器图片上传、视频、压缩包、模板文件
- [ ] 远程URL上传(URL导入文件,极易触发SSRF+文件写入)
- [ ] 后台批量导入、证书上传、备份文件上传
- [ ] 移动端小程序/H5上传接口(往往校验更宽松)
## 二、前端JS校验(最容易绕过,必测)
- [ ] 禁用JS、抓包修改请求,直接上传脚本文件(php/jsp/asp/aspx)
- [ ] 前端只校验后缀,后端无任何校验 → 高危
- [ ] 前端限制文件大小,后端未限制 → 可上传超大文件DoS
> 结论:**前端验证全部不可信,仅做体验优化,不能作为安全防护**
## 三、文件名&后缀校验测试(核心项)
### 3.1 后缀绕过测试项(白名单优先,黑名单几乎全部可绕过)
1. 大小写绕过:`shell.Php`、`shell.AspX`、`shell.Jsp`
2. 双后缀:`shell.jpg.php`、`shell.png;.php`
3. 特殊后缀(黑名单漏拦截):
PHP:`.phtml .php3 .php4 .php5 .phar .inc .shtml`
Windows:`.asa .cer .cdx`
4. 末尾点+空格:`shell.php.`、`shell.php `(Windows自动去掉末尾点和空格)
5. Windows ADS流:`shell.php::$DATA`,上传后文件名保留php后缀
6. 双写绕过(过滤替换机制):`pphphp`(过滤php→替换为空,最终变成php)
7. 空字节截断(PHP<5.3.4):`shell.jpg%00.php`、hex写入`0x00`截断文件名
### 3.2 校验机制检查
- [ ] 是否使用**黑名单**(禁止后缀)→ 极易被绕过,风险极高
- [ ] 是否使用**白名单**(仅允许jpg/png/pdf/docx)→ 安全做法
- [ ] 校验逻辑是否只取最后一个后缀(右到左解析)
- [ ] 文件名是否过滤特殊字符:`\ / : * ? " < > | % 0x00`
## 四、MIME类型校验(只校验Content-Type=高危)
- [ ] 仅校验请求头`Content-Type: image/jpeg`,不校验文件真实内容 → 直接修改请求头即可绕过
- [ ] 测试:上传php文件,把Content-Type改为`image/png`,看是否放行
- 结论:**MIME头部完全由客户端可控,绝对不能单独作为校验依据**
## 五、文件内容校验(图片马、多态文件)
1. 文件头(魔术字Magic Bytes)校验
- [ ] 仅校验文件头,不校验整个文件内容 → GIF图片马可绕过
- 测试:文件开头写入`GIF89a`,后面拼接一句话木马
2. EXIF元数据注入:把PHP代码写入图片EXIF信息,配合文件包含执行
3. 多态文件(GIFAR、图片+脚本混合文件)
4. 图片二次处理漏洞:ImageMagick ImageTragick(CVE-2016-3714),上传恶意图片触发命令执行
5. 压缩包上传:Zip Slip漏洞(压缩包内文件名包含`../`路径穿越,解压写入任意目录);压缩包内嵌套脚本文件
## 六、文件名&存储路径(路径穿越高危)
- [ ] 直接使用客户端传入的原始文件名保存(`$_FILES['name']`)→ 存在路径穿越风险
- [ ] 测试Payload:
`../../shell.php`、`..%2Fshell.php`、`..%252Fshell.php`(双重URL编码)
- [ ] 上传路径是否可控:路径参数可被篡改,配合00截断写入Web根目录
- [ ] 文件名未做随机重命名:文件名可控、可预测,直接访问即可执行脚本
## 七、Web容器解析漏洞(上传图片也能执行代码)
### 7.1 Apache
- 文件名从右向左解析:`shell.jpg.php` → 当成php执行
- 上传`.htaccess`,将jpg文件强制解析为PHP脚本(高风险)
### 7.2 Nginx
- CVE-2013-4547:文件名带空格,访问`xxx.jpg/.php`即可解析执行
- 路径缺失后缀:`/upload/shell.jpg` 后面追加 `/php` 触发解析
### 7.3 IIS6.0
- 目录解析:`upload/shell.jpg/xxx.php`,整个目录按php解析
- 分号解析:`shell.jpg;.php`,分号后内容被截断,按php执行
### 7.4 IIS7/7.5
- 配置FastCGI时,图片路径后加`/.php`触发PHP解析
## 八、高级漏洞场景(容易遗漏)
1. **条件竞争(竞争上传)**
流程:临时文件先写入→再校验→校验失败再删除;多线程并发上传+访问临时文件,在删除前执行webshell
2. **文件包含+上传组合漏洞**
上传图片马,再通过LFI漏洞包含该图片,执行脚本代码
3. **远程文件上传(URL上传)**
传入外网URL下载文件到服务器,极易导致写入恶意文件+SSRF
4. **文件名注入**
文件名带入SQL命令、XSS、命令注入;文件名含换行符写入日志触发日志注入
5. **软链接漏洞(Linux)**
压缩包内包含符号链接,解压覆盖系统配置文件
## 九、文件存储与访问控制(上传成功后依然可被利用)
- [ ] 上传目录是否在Web根目录内(必须放到webroot之外)
- [ ] 上传目录是否开启脚本执行权限(禁止php/jsp/asp执行权限)
- [ ] 文件访问是否做鉴权:A用户上传的文件,B用户能否直接URL遍历读取(未授权访问+水平越权)
- [ ] 是否可以遍历上传目录所有文件(目录浏览开启)
- [ ] 文件大小无上限,无数量限制,造成磁盘耗尽DoS
- [ ] 未做病毒查杀,允许上传恶意exe、木马文件
## 十、代码审计检查项(SAST重点检索关键词)
### 10.1 危险代码特征
- PHP:直接使用`$_FILES['xxx']['name']`拼接路径;`move_uploaded_file`未过滤文件名;无白名单仅做后缀替换
- Java:`request.getOriginalFilename()`直接拼接路径;未做文件名过滤
- Python:`request.files.filename`直接保存;未随机重命名
- 直接信任客户端MIME、只做前端校验、黑名单过滤
### 10.2 审计检查点
1. 校验顺序:先校验文件名→再校验MIME→最后校验文件内容(魔术字)
2. 文件名是否做随机UUID重命名,完全丢弃原始文件名
3. 存储路径是否硬编码,禁止使用用户可控参数拼接路径
4. 上传目录是否配置:禁止执行脚本、禁止解析PHP
## 十一、加固修复清单(逐条落地)
### ✅ 1. 校验策略(纵深防御)
1. 只使用**后缀白名单**,坚决舍弃黑名单;只允许jpg、png、gif、pdf、docx等业务必需格式
2. 三重校验:
① 后端校验文件后缀(白名单)
② 校验文件真实魔术字(读取文件二进制头部,不依赖后缀)
③ 校验文件内容,防止图片马(二次图片渲染校验)
3. 完全丢弃客户端传入的原始文件名,使用UUID+随机字符串重命名文件,杜绝路径穿越与文件名可控问题
### ✅ 2. 路径与权限加固
1. 上传目录部署在**Web根目录之外**,无法通过HTTP直接访问
2. 若必须放在Web目录:给上传目录配置权限,**禁止执行脚本**(nginx/apache配置禁止php执行)
3. 严格过滤文件名:过滤`../ \ / % 0x00 换行符`等危险字符
4. 限制单文件大小、单日上传总量,防止磁盘耗尽
### ✅ 3. 容器与配置加固
1. 关闭Apache/Nginx/IIS解析漏洞配置
2. 禁止上传`.htaccess`、`.user.ini`这类配置文件
3. 开启WAF拦截脚本后缀、路径穿越字符
### ✅ 4. 访问控制
1. 文件下载/预览必须校验当前用户是否拥有该文件权限,防止未授权遍历
2. 关闭目录浏览功能
## 十二、漏洞复现测试用例(直接复制使用)
1. 前端JS绕过:禁用JS,直接上传shell.php
2. 后缀绕过:shell.php. 、shell.jpg.php、shell.PHP
3. MIME绕过:修改Content-Type为image/jpeg,上传php文件
4. 图片马:GIF89a+一句话木马,绕过文件头校验
5. 路径穿越:文件名写../../shell.php,测试能否写入上级目录
6. 解析漏洞:上传图片马,拼接路径触发容器解析执行
## 十三、漏洞报告模板(适配你现有格式)
漏洞名称:不安全的文件上传(CWE-434)
风险等级:高危
前置条件:具备文件上传权限
漏洞原理:上传功能仅做前端/后缀/MIME浅层校验,未校验文件真实内容;文件名未随机重命名,可上传脚本文件,配合容器解析漏洞实现代码执行。
复现步骤:
1. 进入上传页面,抓包拦截上传请求
2. 修改文件名为脚本后缀(或构造图片马),绕过服务端校验
3. 文件上传成功,直接访问上传地址执行恶意代码
缓解措施:临时拦截脚本后缀,关闭上传目录执行权限
永久修复:启用白名单+魔术字校验;文件随机重命名;上传目录移出Web根目录;禁止脚本执行权限;开启图片二次内容校验
## 十四、WAF/设备检测规则
1. 拦截文件名中包含`../`、`%00`、双后缀`.php.jpg`
2. 拦截上传内容中出现`
版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载或以其他方式使用本站原创内容。