SSRF服务端请求伪造漏洞进阶与防护
字数 1321 2025-11-06 22:53:29
SSRF服务端请求伪造漏洞进阶与防护
1. 漏洞描述
SSRF(Server-Side Request Forgery)服务端请求伪造是一种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统。进阶SSRF漏洞不仅包括基本的内部网络探测,还涉及绕过技术、云服务元数据利用、端口扫描、以及与其他漏洞的组合利用。
2. 漏洞原理深入
- 攻击流程:攻击者向Web应用提交一个精心构造的URL → 服务端代码未经验证直接获取该URL内容 → 服务器以自身身份向目标地址发起请求 → 返回响应数据给攻击者。
- 关键点:漏洞利用的是服务端的网络访问权限,这可能让攻击者访问到内部系统、云元数据等受限资源。
- 常见触发场景:在线翻译、数据抓取、图片下载、Webhook回调等需要服务端发起网络请求的功能。
3. 进阶攻击手法
-
URL解析绕过:
- 使用
@符号:http://evil.com@internal.ip/ - 域名重绑定:利用DNS服务使同一域名在短时间内解析到不同IP
- 短网址、重定向服务隐藏真实目标地址
- IPv6、特殊编码(八进制、十六进制)表示IP地址
- 使用
-
云元数据服务利用:
- AWS元数据:
http://169.254.169.254/latest/meta-data/ - Azure元数据:
http://169.254.169.254/metadata/instance - GCP元数据:
http://metadata.google.internal/computeMetadata/v1/ - 通过SSRF获取云服务器的敏感配置信息、临时凭证等
- AWS元数据:
-
协议利用:
- File协议读取本地文件:
file:///etc/passwd - Dict协议探测端口服务:
dict://internal.ip:port/ - Gopher协议实现多种协议通信(Redis、MySQL等)
- File协议读取本地文件:
4. 漏洞检测方法
-
黑盒测试:
- 提交不同协议URL观察响应差异
- 使用Burp Collaborator等工具检测带外数据交互
- 尝试访问已知的内网地址和云元数据端点
-
代码审计:
- 查找网络请求函数(如curl、file_get_contents等)
- 检查URL参数是否经过严格验证
- 分析请求目标是否用户可控且未限制
5. 防护方案进阶
-
输入验证强化:
- 白名单机制:只允许特定的域名和协议
- 深度解析URL:提取真正请求的host,防止解析差异
- 禁用非常用协议(file、gopher、dict等)
-
网络层防护:
- 设置网络访问策略,限制服务器出站连接
- 使用中间代理进行请求转发,实施安全检查
- 配置防火墙规则,禁止访问内网段和元数据服务
-
应用层防护:
- 实施认证机制,确保SSRF请求不提升权限
- 设置请求超时,防止端口扫描利用
- 对响应内容进行安全检查,避免数据泄露
6. 防护代码示例
import requests
from urllib.parse import urlparse
def safe_fetch_url(url):
# 解析URL获取host
parsed = urlparse(url)
hostname = parsed.hostname
# 内网IP黑名单
internal_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']
cloud_metadata = ['169.254.169.254', 'metadata.google.internal']
# 检查是否为内网地址
if is_internal_ip(hostname, internal_ips) or hostname in cloud_metadata:
raise Exception("Access to internal resources is prohibited")
# 协议白名单
if parsed.scheme not in ['http', 'https']:
raise Exception("Unsupported protocol")
# 发起请求
response = requests.get(url, timeout=5, allow_redirects=False)
return response.content
def is_internal_ip(hostname, internal_ranges):
# IP地址内网段检查实现
# 详细实现需要将hostname转换为IP并检查是否在内部网段内
pass
7. 总结
SSRF漏洞的危害随着云原生架构的普及而日益严重。有效的防护需要结合输入验证、网络隔离、安全配置等多层防御措施。在代码层面实施严格的白名单验证,在架构层面限制服务器的网络访问权限,才能从根本上减少SSRF漏洞的风险。