CVE-2020-4054:Ruby Sanitize < 5.2.1 可被绕过
字数 1078 2025-08-20 18:17:47
Ruby Sanitize < 5.2.1 HTML过滤绕过漏洞分析(CVE-2020-4054)
漏洞概述
CVE-2020-4054是Ruby Sanitize模块在5.2.1版本之前存在的一个HTML过滤绕过漏洞。当Sanitize模块配置为RELAXED模式时,攻击者可以利用该漏洞绕过安全过滤机制,导致跨站脚本(XSS)攻击。
受影响版本
Ruby Sanitize模块版本 < 5.2.1
漏洞背景
Sanitize是一个Ruby模块,用于检测和过滤HTML中的恶意内容。它基于白名单机制工作,只允许预先定义的HTML标签和属性通过。
HTML过滤基础原理
Sanitize的工作流程分为三个步骤:
- 将HTML解析为DOM树
- 从DOM树中删除不在白名单内的标签和属性
- 将过滤后的DOM树序列化为HTML
例如输入:
ABC<script>alert(1)</script>
会被解析为DOM树,删除<script>标签和onerror属性后,输出:
ABC
漏洞发现过程
关键点1:<style>标签的特殊处理
Sanitize的白名单中包含<style>标签,但该标签有以下特殊处理:
- HTML解析器不会解码
<style>标签中的HTML实体 - 在反序列化生成HTML时,
<style>标签内的内容不会进行HTML实体编码
例如:
<div>I < 3 XSS</div>
<style>I < 3 XSS</style>
解析为DOM树后,<div>中的<被解码为<,但<style>中的保持不变。
反序列化后输出:
<div>I < 3 XSS</div>
<style>I < 3 XSS</style>
关键点2:Foreign content特性
HTML5规范中,<svg>和<math>标签内的内容会进行HTML实体解码。例如:
<svg><style>I <3 XSS</style></svg>
会被解析为包含<字符的DOM树,最终输出可能导致XSS。
关键点3:利用注释绕过过滤
虽然RELAXED配置不允许<svg>和<math>标签,但可以利用以下技巧:
- 构造包含注释的payload:
<svg><style>/*</style><img src onerror=alert(1)*/</style></svg>
-
Sanitize会删除
<svg>标签,但保留其内容 -
最终DOM树包含:
<style>/*</style>*/</style>
- 反序列化后输出:
<style>/*</style>*/
从而触发XSS。
漏洞修复
Sanitize 5.2.1版本修复了此漏洞,主要改进包括:
- 更严格处理
<style>标签内容 - 防止通过注释绕过过滤机制
防护建议
- 升级Sanitize到5.2.1或更高版本
- 如果无法升级,可以考虑从白名单中移除
<style>标签 - 对用户输入进行多层防御,不依赖单一过滤机制
总结
该漏洞展示了HTML解析和序列化过程中的边缘情况如何导致安全过滤被绕过。开发者在实现HTML过滤时需要考虑各种特殊标签和解析规则,确保过滤机制在所有情况下都能正确工作。