SSRF 与文件上传
两个“后端特有”的高危漏洞:SSRF 打内网,文件上传打服务器。
SSRF:服务端请求伪造
原理:服务器替用户发起请求(拉取 URL、导入功能),攻击者利用它访问内网资源:
功能: 传入图片 URL, 服务器抓取
攻击: url = http://169.254.169.254/latest/meta-data/ ← 云元数据(凭据!)
url = http://内网IP:6379/ ← 打 Redis危害:读取云元数据(AK/SK)、扫描内网、攻击内网服务(Redis/数据库)。
防护:
| 层 | 措施 |
|---|---|
| 输入 | URL 白名单(域名/协议)、禁止内网网段、禁止重定向跟随 |
| 网络 | 服务器出网隔离(防火墙/安全组),元数据服务加认证 |
| 响应 | 返回内容过滤(不返回原始响应给用户) |
| 实现 | 用库解析 URL(防绕过:@、编码、DNS rebinding) |
DNS rebinding(考点):攻击者域名先解析公网 IP 通过校验,再解析到内网 IP。防护:校验后再次解析或用 IP 直连白名单。
文件上传漏洞
| 风险 | 攻击 |
|---|---|
| 恶意文件执行 | 上传 webshell(PHP/JSP),服务器沦陷 |
| 存储耗尽 | 上传超大文件/海量文件 |
| 解析绕过 | 双重扩展名(.jpg.php)、大小写 |
| 内容攻击 | 含恶意脚本的文件被下载执行(XSS) |
防护清单:
- 校验扩展名 + MIME + 内容魔数(文件头),白名单优先
- 重命名存储:不保留用户文件名(随机名 + 服务端扩展名)
- 存储与执行分离:上传目录禁脚本执行(Nginx 配置)
- 大小限制 + 频率限制
- 独立域名/对象存储:隔离执行环境(见 CDN 与静态化篇)
面试追问
- SSRF 是什么? 服务端替用户发请求,被利用访问内网/云元数据。拉 URL 类功能都有风险
- SSRF 防护? URL 白名单 + 禁内网网段 + 出网隔离 + 防重定向和 DNS rebinding
- DNS rebinding? 域名解析两次不一致绕过校验。解析后校验 IP 或 IP 白名单
- 文件上传怎么防? 白名单扩展名 + 内容魔数 + 重命名存储 + 目录禁执行 + 大小限制
- 上传的 webshell 怎么防执行? 存储与执行分离:上传目录禁脚本、独立域名或对象存储