服务端请求伪造(SSRF)攻击进阶利用与防御绕过技术详解
字数 1853 2025-11-19 04:03:53
服务端请求伪造(SSRF)攻击进阶利用与防御绕过技术详解
1. 知识点描述
服务端请求伪造(SSRF) 是一种由攻击者构造恶意请求,诱使服务端向内部或外部系统发起非预期网络请求的安全漏洞。进阶利用涉及绕过常见防御措施(如黑名单/白名单过滤、URL解析差异等),并利用协议处理差异或内部系统交互实现更深层次的攻击(如访问元数据服务、内网应用渗透、远程代码执行等)。
2. SSRF漏洞原理回顾
- 核心机制:攻击者控制服务端发起的请求目标(如通过用户输入的URL参数)。
- 常见场景:
- 网络爬虫或网页预览功能(用户提交URL,服务端获取内容)。
- 文件上传/导入功能(服务端从指定URL下载文件)。
- Webhook回调或API代理功能。
3. 进阶利用技术
3.1 绕过URL过滤规则
问题:防御代码可能通过黑名单(如禁止127.0.0.1、localhost)或白名单(仅允许特定域名)限制请求目标。
绕过方法:
- IPv6与IPv4转换:
- 使用IPv6地址
[::1]代替127.0.0.1,或缩写形式[::]。 - 利用IPv4映射的IPv6地址(如
::ffff:127.0.0.1)。
- 使用IPv6地址
- 十进制/八进制IP编码:
127.0.0.1→ 十进制2130706433或八进制0177.0.0.1。
- 域名重定向:
- 攻击者控制一个域名(如
evil.com),将其DNS解析指向内网IP(如192.168.1.1)。
- 攻击者控制一个域名(如
- URL解析歧义:
- 利用
@符号:https://expected-domain.com@malicious-host.com(部分解析库将@前内容视为认证信息)。 - 使用斜杠混淆:
http://127.0.0.1:80%252fevil.com(双重URL编码绕过路径检查)。
- 利用
3.2 利用协议处理差异
- file协议:若允许
file://,可直接读取本地文件(如file:///etc/passwd)。 - gopher协议:
- 支持发送任意TCP数据包,可构造HTTP、Redis、MySQL等协议请求。
- 示例:通过gopher向内网Redis发送命令,实现未授权访问或主从复制攻击。
- dict协议:泄露服务端口信息(如
dict://127.0.0.1:6379/info获取Redis信息)。
3.3 攻击云元数据服务
- 目标:云服务器(如AWS、GCP、Azure)的元数据接口(如
169.254.169.254)可能暴露敏感信息(密钥、配置)。 - 绕过技巧:
- 通过重定向:使服务端请求先访问攻击者控制的URL,返回302重定向至元数据接口。
- 利用HTTP跳转:如
http://evil.com/redirect返回Location: http://169.254.169.254/latest/meta-data/。
3.4 链式利用内网应用
- 攻击内网脆弱服务:如通过SSRF访问内网未授权Redis/Jenkins,执行命令或部署恶意负载。
- 盲SSRF利用:即使无回显,可通过时间延迟(如Redis
ping命令)或DNS外带数据(如触发DNS查询到攻击者域名)确认漏洞。
4. 防御绕过实战示例
场景:某应用允许用户输入URL生成网页截图,防御代码检查域名是否在白名单(如example.com)。
攻击步骤:
- 注册子域名
evil.example.com,解析到127.0.0.1。 - 提交URL:
http://evil.example.com:8080/@169.254.169.254/metadata。 - 服务端解析时,白名单验证通过(域名包含
example.com),但实际请求发向本地元数据接口。
5. 防御措施进阶
- 严格白名单:仅允许特定域名或IP,避免使用正则表达式误判。
- 协议限制:禁用高风险协议(如
gopher、file、dict)。 - URL标准化解析:使用统一库(如
url.parse())解析后提取主机名,避免解析差异。 - 网络层隔离:限制服务端出站流量(如防火墙规则禁止访问内网段)。
- 请求验证:对响应内容类型/大小做限制,避免数据外泄。
6. 总结
SSRF进阶利用核心在于利用解析差异、协议特性和环境配置绕过表层防御。防御需结合多层级控制(输入验证、网络隔离、最小权限),并通过渗透测试模拟攻击路径查漏补缺。