绕过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 利用重定向漏洞
- 在可控服务器上创建重定向脚本:
<?php header("location:http://127.0.0.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防护绕过需要创造性和耐心。攻击者通常会尝试多种技术组合来突破防护。防御者应从攻击者角度思考,考虑所有可能的绕过方式,并实施多层防护措施。记住,安全是一个持续的过程,需要定期审查和更新防护机制。