🌐 SSRF检测

SSRF漏洞检测指南,检查项/修复建议/测试方法

📖 什么是SSRF
服务器端请求伪造(Server-Side Request Forgery, SSRF)是一种安全漏洞,攻击者可以利用服务器发起请求访问内部资源或外部服务。

危害:读取内部服务、获取云元数据密钥、扫描内网端口、访问本地文件等。
CWE:CWE-918 | OWASP:A10:2021
🔍 检查项
🧪 测试Payload
http://127.0.0.1
访问本地服务 高风险
http://localhost
访问本地服务(别名)
http://169.254.169.254/latest/meta-data/
AWS/GCP/Azure云元数据 高风险
http://10.0.0.1
内网IP访问
http://192.168.1.1
内网IP访问
http://0x7f000001
十六进制IP绕过(127.0.0.1)
http://2130706433
十进制IP绕过(127.0.0.1)
http://0177.0.0.1
八进制IP绕过(127.0.0.1)
http://127.1
短IP绕过
file:///etc/passwd
本地文件读取 高风险
dict://127.0.0.1:6379/INFO
Redis信息泄露
gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall
Gopher协议攻击Redis 高风险
🛡️ 修复建议
1. 网络层防护
# 防火墙规则:禁止应用服务器访问内网 iptables -A OUTPUT -d 10.0.0.0/8 -j DROP iptables -A OUTPUT -d 172.16.0.0/12 -j DROP iptables -A OUTPUT -d 192.168.0.0/16 -j DROP iptables -A OUTPUT -d 169.254.169.254/32 -j DROP
2. 应用层防护
// URL白名单验证 const allowedHosts = ['api.example.com', 'cdn.example.com']; function isUrlAllowed(url) { const parsed = new URL(url); if (!['http:', 'https:'].includes(parsed.protocol)) return false; return allowedHosts.includes(parsed.hostname); } // DNS解析后验证IP const dns = require('dns'); dns.lookup(hostname, (err, addr) => { if (isPrivateIP(addr)) return reject('Private IP not allowed'); });
3. 架构建议
  • 使用独立的出站代理服务器
  • 将内网服务与应用服务器网络隔离
  • 使用IMDSv2(云元数据服务v2)需要Token
  • 不要将原始响应直接返回给用户