【Web安全】如何在 CDN 干扰下精准检测 SSRF?Nuclei + Interactsh 实战

发布于:2025-04-14 ⋅ 阅读:(77) ⋅ 点赞:(0)

❤️博客主页 iknow181
🔥系列专栏 网络安全、 PythonJavaSEJavaWebCCNP
🎉欢迎大家点赞👍收藏⭐评论✍


在这里插入图片描述

背景

在日常漏洞复核中,我们常用 DNSLog 平台判断目标是否存在 SSRF 漏洞:只要请求体里带一个可控域名,就能收到一次 DNS 查询。然而,当目标使用了 CDN(如 Cloudflare、Akamai、阿里云 CDN 等)时,你会发现:

  • 无论路径是否命中业务逻辑,只要请求体里出现域名,DNSLog 都会收到解析。
  • 查询源 IP 全部是 CDN 出口段,导致你无法区分到底是“真·SSRF”还是“CDN 在扫域名”。

CDN 的“扫域名”行为

CDN 厂商为了安全和性能,往往在流量经过时会:

  1. 安全扫描(WAF/Threat Intel)
    对请求体/请求头中的域名做一次 DNS 查询,判断是否在恶意域名库里。
  2. 资源预取/链接优化
    对响应体里的外部资源链接做预取或缓存可用性检查,也会触发 DNS 解析。

结论纯粹的 DNS 查询(protocol=dns)很可能是 CDN 在做“探测”,而不是真正的后端 HTTP 请求。

精准检测 SSRF:Interactsh OOB 回调

要区分“CDN 探测”与“真实 SSRF”,就要看目标服务器有没有真正发起 HTTP/TCP/Gopher 请求
ProjectDiscovery 提供的 Interactsh 平台,能捕获多协议回调,正好满足需求。

  • 支持协议:DNS、HTTP、TCP、Gopher、SMTP……
  • 公共平台interact.sh(零运维,上手快)
  • 自建服务interactsh-server(高并发、私密可控)

Nuclei 中的 OOB 回调机制

  1. 在模板中声明 callbacks
     

callbacks: - "interactsh://{{.RAND}}.{{interactsh-url}}"

这一步告诉 Nuclei:

    • 使用 Interactsh 协议
    • 回调域名模板是 {{.RAND}}.{{.interactsh-url}}
    • 扫描前自动向 OOB 平台注册,扫描后自动轮询回调日志
  1. 使用占位符 {{interactsh-url}}
    • 默认会被替换为 interact.sh(公共平台)
    • 或者被替换为自建服务域名(需配合 -iserver/-itoken
  1. matchers 精准筛选协议
matchers:
  - type: word
    part: interactsh_protocol
    words:
      - http
      - gopher
      - tcp

仅当后端真正发起 HTTP、Gopher 或 TCP 连接时才算“命中”。
CDN 的纯 DNS 探测(protocol=dns)会被自动过滤掉。


公共平台 vs 自建服务

特性

公共 interact.sh

自建 Interactsh

运维成本

需部署、运维

并发 & 稳定性

共享资源,可能有速率限制

高并发、自定义资源

隐私 & 安全

回调日志公开(所有用户共用)

私密可控

上手速度

秒级启动

需安装 Go 环境、配置启动脚本

自建启动示例
# 安装
go install github.com/projectdiscovery/interactsh/cmd/interactsh-server@latest

# 启动
interactsh-server -listen 0.0.0.0:9999 -domain yourdomain.com

运行 Nuclei 时加上:

nuclei \
  -t ssrf-http.yaml \
  -l targets.txt \
  -iserver https://yourdomain.com \
  -itoken YOUR_TOKEN \
  -rate-limit 50

完整模板示例

id: ssrf-http-detect

info:
  name: SSRF HTTP/Gopher Detection
  author: YourName
  severity: medium
  description: |
    使用 Interactsh 回调,区分 CDN 探测(仅 DNS)与真实 SSRF(HTTP/TCP/Gopher)。

variables:
  CALLBACK: "{{interactsh-url}}"
  RAND: "{{random 6}}"

requests:
  - raw:
      - |
        GET http://{{.RAND}}.{{.CALLBACK}}/test HTTP/1.1
        Host: {{Hostname}}
      - |
        GET gopher://{{.RAND}}.{{.CALLBACK}}/_ HTTP/1.1
        Host: {{Hostname}}
    callbacks:
      - "interactsh://{{.RAND}}.{{.CALLBACK}}"
    matchers:
      - type: word
        part: interactsh_protocol
        words:
          - http
          - gopher
          - tcp
  • {{random 6}}:生成 6 位随机前缀,避免子域名冲突
  • {{.CALLBACK}}:运行时自动替换为 interact.sh 或自建域名
  • matchers:只匹配 http/gopher/tcp,过滤掉纯 DNS 探测

推荐扫描流程

  1. DNS 初筛(可选)
callbacks:
  - "dns://{{random 6}}.{{interactsh-url}}"

快速判断哪些目标“有域名解析行为”。

  1. HTTP 深筛
    使用上面的完整模板,只保留 HTTP/Gopher/TCP 回调,精准识别真实 SSRF。

总结

  • CDN 扫描 ≠ SSRF:纯 DNS 回调通常是 CDN/WAF 在探测。
  • Interactsh 回调:能捕获多协议回调,区分“解析”与“连接”。
  • Nuclei 配置
    • callbacks + {{interactsh-url}} 自动注册、轮询
    • matchers 只匹配 HTTP/Gopher/TCP
    • 公共平台无需额外参数,自建服务用 -iserver/-itoken

按此方法批量扫描,既能高效初筛,也能精准复核,最大限度减少误报,只留下真正的 SSRF 漏洞。欢迎点赞、评论与分享!

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到