服务器端请求伪造(SSRF)
字数 1197 2025-11-21 13:51:31
服务器端请求伪造(SSRF)
服务器端请求伪造是一种安全漏洞,攻击者利用该漏洞诱使服务器向非预期的内部或外部系统发起恶意请求。该漏洞通常发生在应用程序未对用户提供的URL进行充分验证时,允许攻击者操纵服务器访问受限资源。
1. SSRF的基本原理
- 当Web应用程序接受用户输入的URL(例如通过表单字段或API参数)并直接使用该URL发起后端请求时,若未实施严格的过滤,攻击者可构造特殊URL使服务器访问以下目标:
- 内部服务(如数据库管理接口
http://192.168.1.1:8080/admin) - 云服务实例元数据接口(如AWS的
http://169.254.169.254/latest/meta-data/) - 本地文件系统(如
file:///etc/passwd)
- 内部服务(如数据库管理接口
- 示例场景:一个图片上传功能允许通过URL获取远程图片,若攻击者提交
http://localhost:3306(数据库端口),服务器可能返回数据库错误信息。
2. SSRF的攻击向量分类
- 基础SSRF:服务器直接返回远程资源内容(如读取文件或API响应)。
- 盲SSRF:服务器发起请求但不返回响应内容,但可通过侧信道(如延迟或DNS查询)探测内部网络。
- 链式SSRF:结合其他漏洞(如XXE或CRLF注入)扩大攻击面,例如通过XML外部实体注入触发SSRF。
3. 关键风险场景
- 云环境渗透:利用元数据服务获取实例凭证或配置信息。
- 内部网络扫描:通过端口扫描识别内网服务(如Redis未授权访问)。
- 协议滥用:使用
gopher://或dict://协议与内部服务交互(如发送Redis命令)。 - 绕过访问控制:利用服务器IP白名单权限访问受限API。
4. 防御机制分层设计
- 输入验证层:
- 拒绝非HTTP/HTTPS协议(禁止
file://、ftp://等)。 - 使用正则表达式和白名单限制域名(如仅允许
*.example.com)。
- 拒绝非HTTP/HTTPS协议(禁止
- 网络隔离层:
- 部署服务器时禁用不必要的元数据服务访问。
- 使用网络策略禁止服务器访问敏感网段(如管理子网)。
- 请求处理层:
- 使用解析库提取URL的host部分,解析后与公共IP黑名单对比。
- 设置请求超时(如2秒)和响应大小限制。
- 代理防护层:
- 配置出口代理过滤对外请求,阻断对内部IP的访问。
- 实施DNS重绑定防护(验证解析IP与URL host一致性)。
5. 高级攻击与缓解
- DNS重绑定攻击:攻击者控制域名在TTL内交替返回内外网IP,绕过初始验证。防御需在发起请求前二次验证解析IP。
- URL解析混淆:利用
@符号或重定向构造歧义URL(如http://example.com@internal.com)。应使用标准化库解析URL。 - 服务端请求跟随:默认禁用30x重定向,或限制重定向次数至1次以内。