前言
在上一篇内容中,我们讲解了 SSRF 基础原理、本机服务访问、内网网段探测等常规利用方式。实战环境里,开发人员通常会通过黑名单、白名单、关键词过滤等手段进行基础防护,直接使用原始 Payload 往往会被拦截。
本篇聚焦主流防护策略下的绕过思路,利用 URL 解析规则、编码差异、协议特性、跳转漏洞等技术,拆解各类防御体系的突破方法,同时结合协议底层规则、中间件解析行为分析原理,覆盖 IP 变形、编码绕过、URL 解析歧义、开放重定向联动攻击等高频实战场景。
一、黑名单防护绕过:IP 地址变形与编码穿透
黑名单是抵御 SSRF 最常用的基础手段,原理为通过正则匹配拦截127.0.0.1、内网网段、敏感关键字等特征字符串。该防御存在天然缺陷:防护层仅做字符串匹配,而操作系统、网络组件会按照网络协议规则解析地址,二者解析逻辑不一致,由此产生大量绕过空间。
1.1 IP 地址格式异构表达
点分十进制是最常见的 IP 书写形式,也是黑名单重点拦截对象。我们可以利用 IP 地址的多种合法格式,绕过基于正则的字符串拦截。
IP 简写格式 遵循 IPv4 地址解析规则,连续的0可省略。以本地回环地址为例: 原始地址:127.0.0.1 简写形式:http://127.1/admin 操作系统网络栈会自动补全地址,正常完成请求,可绕过针对完整127.0.0.1的黑名单。
十进制整数格式 将完整 IPv4 地址转换为十进制数字,彻底规避点分格式的正则匹配。 示例:127.0.0.1 转换后为 2130706433 利用 Payload:http://2130706433/admin 主流 HTTP 客户端、操作系统均可正常解析该数字为对应 IP 地址。
1.2 双重 URL 编码绕过
当防护规则同时拦截 IP 地址与敏感路径(如/admin)时,可利用多层解码差异实现绕过,这也是 Web 安全中经典的编码走私手法。
原理说明
多数 WAF、网关仅执行单次 URL 解码,而后端 Web 容器、HTTP 客户端会在路由分发、请求发起阶段再次解码。利用两次解码的解析深度差,即可让恶意字符绕过前端过滤。
实战演示
以字符a为例:
最终 Payload:http://127.1/%2561dmin
- 前端 WAF 解码一次:%2561 → %61,字符串%61dmin无敏感特征,被正常放行;
- 后端容器二次解码:%61 → a,最终路由解析为/admin,攻击生效。
补充规则
URL 编码仅针对协议保留字符、特殊符号,字母、数字本身无需编码。双重编码的核心,本质是对第一次编码产生的百分号% 再次编码,这也是该手法的通用实现逻辑。
二、白名单防护绕过:利用 URL 解析歧义
相比黑名单,域名白名单的防护强度更高,仅允许请求指定可信域名。但 URL 遵循RFC 3986标准,不同编程语言、HTTP 客户端、解析库对特殊符号的解析逻辑存在差异。利用这类解析不一致性,可突破域名白名单限制。
2.1 账号分隔符 @ 解析绕过
URL 标准中,@符号用于划分身份凭据与目标主机,格式为 用户名:密码@域名。防护层仅做字符串前缀匹配,而后端客户端会将@后方内容识别为真实访问地址。
示例: 白名单允许域名:expected-host.com 构造 Payload:https://expected-host@evil-host.com
- 防护层判断:字符串前缀匹配白名单域名,执行放行;
- 后端 HTTP 客户端解析:expected-host 被识别为用户名,真实目标主机为evil-host.com,成功访问恶意地址。
2.2 片段标识符 # 截断绕过
# 是 URL 片段标识符,根据协议规范,#及后方内容仅在客户端本地解析,不会被发送至服务端网络层。
示例: 白名单允许域名:expected-host.com 构造 Payload:https://evil-host.com#expected-host.com
- 防护层判断:URL 中包含白名单域名字符串,执行放行;
- 后端 HTTP 客户端解析:自动丢弃#及后续内容,实际请求地址为evil-host.com。
2.3 子域名层级绕过
将恶意域名作为白名单域名的子域名,利用 DNS 层级规则突破限制。该手法依赖域名解析权限控制。
示例: 白名单域名:expected-host.com 构造 Payload:https://expected-host.evil-host.com 防护层识别前缀符合白名单规则,而该域名由攻击者控制 DNS 解析,可将流量导向任意内网或外网地址。
三、高阶绕过:开放重定向 + SSRF 组合攻击
当白名单规则做了极致加固,封禁特殊符号、限制域名格式,上述解析歧义手法全部失效时,开放重定向漏洞就成为突破防线的核心跳板。二者组合形成的攻击链,是复杂防护环境下最常用的 SSRF 高阶利用方式。
3.1 重定向基础概念与漏洞界定
HTTP 重定向是 Web 服务的常规功能,服务端通过3xx状态码告知客户端跳转至新地址,分为两类,安全边界差异极大:
固定重定向(安全) 跳转目标地址在代码中硬编码,用户无法篡改。例如未登录用户自动跳转到登录页、页面旧路由永久迁移。这类重定向地址固定,不存在被滥用的风险。
开放重定向(高危漏洞) 跳转目标由用户可控参数动态拼接生成,服务端不做地址校验、不限制跳转范围,无条件跟随用户指定的任意 URL。攻击者可利用该特性,让全站可信接口变为 “跳转代理”,这也是配合 SSRF 攻击的核心前提。
3.2 组合攻击完整原理与链路拆解
前置环境
攻击者最终构造请求参数:
plaintext
stockApi=/product/nextProduct?path=http://192.168.0.12/admin
分步解析攻击逻辑
外层白名单校验(第一重放行) WAF / 网关仅校验 stockApi 的目标地址,识别到 /product/nextProduct 属于本站合法路由,完全符合白名单规则,直接放行请求,不会拦截内网地址相关字符。
访问重定向接口(触发跳转) 后端 HTTP 客户端(cURL、requests 等)按照参数地址,正常请求站内接口 /product/nextProduct。该接口读取用户可控的 path 参数,拼接为跳转地址,返回 302 Found 状态码,并在 Location 响应头中写入内网地址 http://192.168.0.12/admin。
自动跟随重定向(突破边界) 绝大多数服务端 HTTP 客户端默认开启自动跟随 301/302 重定向,这是整个攻击链最关键的一环。客户端不会将跳转请求再次经过外层 WAF、白名单规则校验,而是直接在内网环境中发起二次请求,直达原本被禁止访问的内网敏感接口。
简单总结原理:用可信站内路由绕过外层白名单,再依靠开放重定向把跳转目标切换为内网地址,借助客户端自动跳转特性,实现 “二次穿透”。
3.3 关键细节:URL 编码规避参数分割
当请求体格式为 application/x-www-form-urlencoded 表单格式时,?、& 是标准参数分隔符,拥有特殊语法含义。直接拼接复杂 URL 会被中间件拆分参数,导致 Payload 失效。
错误示例与问题分析
plaintext
stockApi=/nextProduct?path=http://evil.com/admin/delete?user=carlos
中间件解析规则:遇到 & 即判定为新参数起始,最终拆分结果:
- 主参数:stockApi = /nextProduct?path=http://evil.com/admin/delete
- 额外参数:user = carlos 恶意路径被截断,接口因参数缺失报错,攻击失败。
解决方案
对 URL 中的协议保留字符做URL 编码,消除其语法分割作用,让整段内容被识别为单个参数值:
- 问号 ? → 编码为 %3f
- 连接符 & → 编码为 %26
编码后的完整载荷会被完整传递至后端,后端发起请求前自动解码,保证攻击链路正常执行。
3.4 盲 SSRF 场景下的结果判定
在无法直接查看内网接口返回内容的盲 SSRF场景中,可结合主流 Web 架构模式判断攻击是否成功。
目前多数业务系统采用 PRG(Post/Redirect/Get) 设计模式:执行删除、修改、新增等数据变更操作后,为避免用户刷新页面重复提交请求,服务端不会返回200 OK,而是固定返回302重定向,引导页面跳转至列表页。
因此在组合攻击链路中,若最终收到 302 Found 状态码,即可判定内网侧的高危操作(删除账号、修改权限等)已正常执行。
四、防御总结与加固建议
基于上文各类绕过手法可以看出,仅依靠应用层字符串匹配、正则过滤的防护手段存在极大局限性。针对 SSRF 的防御需要下沉至网络层、应用层、架构层做全维度加固:
系列小结
从基础利用到各类防御绕过,SSRF 的攻击核心始终围绕不同组件的解析规则差异展开。防护方如果仅停留在简单的关键词拦截,必然会被各类协议特性、编码规则突破。深入理解 RFC 协议标准、中间件行为、网络通信逻辑,既是挖掘漏洞的关键,也是构建有效防御的前提。





