🌐 SSRF检测
SSRF漏洞检测指南,检查项/修复建议/测试方法
📖 什么是SSRF
服务器端请求伪造(Server-Side Request Forgery, SSRF)是一种安全漏洞,攻击者可以利用服务器发起请求访问内部资源或外部服务。
危害:读取内部服务、获取云元数据密钥、扫描内网端口、访问本地文件等。
CWE:CWE-918 | OWASP:A10:2021
危害:读取内部服务、获取云元数据密钥、扫描内网端口、访问本地文件等。
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
- 不要将原始响应直接返回给用户