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的工作流程分为三个步骤:

  1. 将HTML解析为DOM树
  2. 从DOM树中删除不在白名单内的标签和属性
  3. 将过滤后的DOM树序列化为HTML

例如输入:

ABC<script>alert(1)</script>

会被解析为DOM树,删除<script>标签和onerror属性后,输出:

ABC

漏洞发现过程

关键点1:<style>标签的特殊处理

Sanitize的白名单中包含<style>标签,但该标签有以下特殊处理:

  1. HTML解析器不会解码<style>标签中的HTML实体
  2. 在反序列化生成HTML时,<style>标签内的内容不会进行HTML实体编码

例如:

<div>I &lt; 3 XSS</div>
<style>I &lt; 3 XSS</style>

解析为DOM树后,<div>中的&lt;被解码为<,但<style>中的保持不变。

反序列化后输出:

<div>I &lt; 3 XSS</div>
<style>I < 3 XSS</style>

关键点2:Foreign content特性

HTML5规范中,<svg><math>标签内的内容会进行HTML实体解码。例如:

<svg><style>I &lt;3 XSS</style></svg>

会被解析为包含<字符的DOM树,最终输出可能导致XSS。

关键点3:利用注释绕过过滤

虽然RELAXED配置不允许<svg><math>标签,但可以利用以下技巧:

  1. 构造包含注释的payload:
<svg><style>/*&lt;/style>&lt;img src onerror=alert(1)*/</style></svg>
  1. Sanitize会删除<svg>标签,但保留其内容

  2. 最终DOM树包含:

<style>/*</style>*/</style>
  1. 反序列化后输出:
<style>/*</style>*/

从而触发XSS。

漏洞修复

Sanitize 5.2.1版本修复了此漏洞,主要改进包括:

  1. 更严格处理<style>标签内容
  2. 防止通过注释绕过过滤机制

防护建议

  1. 升级Sanitize到5.2.1或更高版本
  2. 如果无法升级,可以考虑从白名单中移除<style>标签
  3. 对用户输入进行多层防御,不依赖单一过滤机制

总结

该漏洞展示了HTML解析和序列化过程中的边缘情况如何导致安全过滤被绕过。开发者在实现HTML过滤时需要考虑各种特殊标签和解析规则,确保过滤机制在所有情况下都能正确工作。

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 例如输入: 会被解析为DOM树,删除 <script> 标签和 onerror 属性后,输出: 漏洞发现过程 关键点1: <style> 标签的特殊处理 Sanitize的白名单中包含 <style> 标签,但该标签有以下特殊处理: HTML解析器不会解码 <style> 标签中的HTML实体 在反序列化生成HTML时, <style> 标签内的内容不会进行HTML实体编码 例如: 解析为DOM树后, <div> 中的 &lt; 被解码为 < ,但 <style> 中的保持不变。 反序列化后输出: 关键点2:Foreign content特性 HTML5规范中, <svg> 和 <math> 标签内的内容会进行HTML实体解码。例如: 会被解析为包含 < 字符的DOM树,最终输出可能导致XSS。 关键点3:利用注释绕过过滤 虽然RELAXED配置不允许 <svg> 和 <math> 标签,但可以利用以下技巧: 构造包含注释的payload: Sanitize会删除 <svg> 标签,但保留其内容 最终DOM树包含: 反序列化后输出: 从而触发XSS。 漏洞修复 Sanitize 5.2.1版本修复了此漏洞,主要改进包括: 更严格处理 <style> 标签内容 防止通过注释绕过过滤机制 防护建议 升级Sanitize到5.2.1或更高版本 如果无法升级,可以考虑从白名单中移除 <style> 标签 对用户输入进行多层防御,不依赖单一过滤机制 总结 该漏洞展示了HTML解析和序列化过程中的边缘情况如何导致安全过滤被绕过。开发者在实现HTML过滤时需要考虑各种特殊标签和解析规则,确保过滤机制在所有情况下都能正确工作。