绕过SSRF包含
字数 1567 2025-08-25 22:58:20

SSRF绕过技术详解

1. SSRF简介

SSRF (Server-Side Request Forgery,服务器端请求伪造)是一种攻击者通过服务器发起任意请求的安全漏洞。当Web应用程序提供从外部获取资源的功能时,如果没有适当的保护措施,攻击者可能利用此功能访问内部网络资源。

2. SSRF保护机制

2.1 黑名单机制

  • 阻止对已知危险地址(如内网IP段)的请求
  • 实现简单但容易被绕过
  • 常见于大多数SSRF防护实现

2.2 白名单机制

  • 只允许访问预先批准的URL列表
  • 安全性更高但实现更复杂
  • 默认情况下比黑名单更严格

3. 绕过白名单的技术

3.1 利用开放重定向漏洞

  • 在白名单域中寻找开放重定向漏洞
  • 构造请求使服务器重定向到内部IP
  • 示例:http://whitelisted.com/redirect?url=http://127.0.0.1

3.2 利用不良正则表达式

  • 子域名欺骗:victim.com.attacker.com
  • 路径欺骗:attacker.com/victim.com
  • 利用正则表达式匹配不严格的问题

4. 绕过黑名单的技术

4.1 利用重定向漏洞

  1. 在可控服务器上创建重定向脚本:
<?php header("location:http://127.0.0.1"); ?>
  1. 让目标服务器请求你的重定向URL
  2. 服务器将被重定向到受限的内部地址

4.2 DNS欺骗

  1. 控制一个域名(如attacker.com)
  2. 修改DNS记录使子域名指向内部IP
    • 例如:subdomain.attacker.com127.0.0.1
  3. 让服务器请求你的域名,它将解析到内部地址

4.3 使用IPv6地址

  • 尝试使用IPv6格式的地址
  • 服务器可能只对IPv4实施了保护
  • 示例:[::1]代替127.0.0.1

4.4 编码技术

4.4.1 十六进制编码

  • 将IP地址的每个段转换为十六进制
  • 格式:0x[hex]
  • 示例:
    • 127.0.0.10x7f.0x0.0x0.0x1

4.4.2 八进制编码

  • 将IP地址的每个段转换为八进制
  • 格式:0[octal]
  • 示例:
    • 127.0.0.10177.0.0.01

4.4.3 双字编码(Dword)

  • 将整个IP地址转换为32位整数
  • 计算方法:octet1*256³ + octet2*256² + octet3*256¹ + octet4*256⁰
  • 示例:
    • 127.0.0.1127*256³ + 0*256² + 0*256¹ + 1*256⁰ = 2130706433
    • 使用:http://2130706433

4.4.4 URL编码

  • 对主机名或路径进行URL编码
  • 示例:
    • localhost%6c%6f%63%61%6c%68%6f%73%74

4.4.5 混合编码

  • 组合使用多种编码技术
  • 示例:
    • 127.0.0.10177.0.0.0x1

5. 防御建议

  1. 尽可能使用白名单而非黑名单
  2. 对白名单域进行严格的验证,防止子域名或路径欺骗
  3. 修复所有开放重定向漏洞
  4. 实施DNS解析后的IP地址验证
  5. 同时处理IPv4和IPv6地址
  6. 规范化所有输入并验证编码
  7. 限制请求协议(通常只允许HTTP/HTTPS)
  8. 设置请求超时和响应大小限制

6. 测试方法论

  1. 尝试直接访问受限地址(如127.0.0.1)确认防护存在
  2. 确定防护机制类型(黑名单/白名单)
  3. 根据防护类型选择合适的绕过技术
  4. 尝试各种编码变体
  5. 检查是否有重定向漏洞可利用
  6. 考虑DNS层面的攻击
  7. 如果所有方法都失败,尝试理解防护逻辑并寻找设计缺陷

7. 总结

SSRF防护绕过需要创造性和耐心。攻击者通常会尝试多种技术组合来突破防护。防御者应从攻击者角度思考,考虑所有可能的绕过方式,并实施多层防护措施。记住,安全是一个持续的过程,需要定期审查和更新防护机制。

SSRF绕过技术详解 1. SSRF简介 SSRF (Server-Side Request Forgery,服务器端请求伪造)是一种攻击者通过服务器发起任意请求的安全漏洞。当Web应用程序提供从外部获取资源的功能时,如果没有适当的保护措施,攻击者可能利用此功能访问内部网络资源。 2. SSRF保护机制 2.1 黑名单机制 阻止对已知危险地址(如内网IP段)的请求 实现简单但容易被绕过 常见于大多数SSRF防护实现 2.2 白名单机制 只允许访问预先批准的URL列表 安全性更高但实现更复杂 默认情况下比黑名单更严格 3. 绕过白名单的技术 3.1 利用开放重定向漏洞 在白名单域中寻找开放重定向漏洞 构造请求使服务器重定向到内部IP 示例: http://whitelisted.com/redirect?url=http://127.0.0.1 3.2 利用不良正则表达式 子域名欺骗: victim.com.attacker.com 路径欺骗: attacker.com/victim.com 利用正则表达式匹配不严格的问题 4. 绕过黑名单的技术 4.1 利用重定向漏洞 在可控服务器上创建重定向脚本: 让目标服务器请求你的重定向URL 服务器将被重定向到受限的内部地址 4.2 DNS欺骗 控制一个域名(如attacker.com) 修改DNS记录使子域名指向内部IP 例如: subdomain.attacker.com → 127.0.0.1 让服务器请求你的域名,它将解析到内部地址 4.3 使用IPv6地址 尝试使用IPv6格式的地址 服务器可能只对IPv4实施了保护 示例: [::1] 代替 127.0.0.1 4.4 编码技术 4.4.1 十六进制编码 将IP地址的每个段转换为十六进制 格式: 0x[hex] 示例: 127.0.0.1 → 0x7f.0x0.0x0.0x1 4.4.2 八进制编码 将IP地址的每个段转换为八进制 格式: 0[octal] 示例: 127.0.0.1 → 0177.0.0.01 4.4.3 双字编码(Dword) 将整个IP地址转换为32位整数 计算方法: octet1*256³ + octet2*256² + octet3*256¹ + octet4*256⁰ 示例: 127.0.0.1 → 127*256³ + 0*256² + 0*256¹ + 1*256⁰ = 2130706433 使用: http://2130706433 4.4.4 URL编码 对主机名或路径进行URL编码 示例: localhost → %6c%6f%63%61%6c%68%6f%73%74 4.4.5 混合编码 组合使用多种编码技术 示例: 127.0.0.1 → 0177.0.0.0x1 5. 防御建议 尽可能使用白名单而非黑名单 对白名单域进行严格的验证,防止子域名或路径欺骗 修复所有开放重定向漏洞 实施DNS解析后的IP地址验证 同时处理IPv4和IPv6地址 规范化所有输入并验证编码 限制请求协议(通常只允许HTTP/HTTPS) 设置请求超时和响应大小限制 6. 测试方法论 尝试直接访问受限地址(如127.0.0.1)确认防护存在 确定防护机制类型(黑名单/白名单) 根据防护类型选择合适的绕过技术 尝试各种编码变体 检查是否有重定向漏洞可利用 考虑DNS层面的攻击 如果所有方法都失败,尝试理解防护逻辑并寻找设计缺陷 7. 总结 SSRF防护绕过需要创造性和耐心。攻击者通常会尝试多种技术组合来突破防护。防御者应从攻击者角度思考,考虑所有可能的绕过方式,并实施多层防护措施。记住,安全是一个持续的过程,需要定期审查和更新防护机制。