前言

2019年9月19号,DOMPurify(XSS过滤器)发布了新版本,新版本修复了本文即将提到的绕过问题。抛砖引玉,因此在本文中,我首先介绍DOMPurify的大体情况以及工作原理,进而引出绕过原理。如果读者已经充分掌握DOMPurify和mXSS的原理-建议你直接跳到Chromium(和Safari)中的mXSS这一部分。

HTML过滤器——我们为什么需要它以及相应的工作原理

许多web应用程序,以编辑器的形式,允许用户使用一些特殊的文本格式(例如,粗体,斜体等等)。这个功能在博客,邮件当中使用甚广。这里出现的主要安全问题就是有些不法用户可能输入一些恶意HTML/JavaScript从而引入XSS。因此,这类允许用户进行个性化输入的应用程序的创建者就面临一个很头疼的问题:如何确保用户的输入的HTML是安全的,从而不会引起不必要的XSS。
这就是为什么需要HTML过滤器的原因。HTML过滤器的主要目的是揪出不可信的输入,对其进行过滤,并生成安全的HTML(过滤所有危险标签的HTML)。

过滤器通常通过解析输入来进行过滤(从JavaScript中有几种方法可以实现这一点,例如使用 DOMParser.prototype.parseFromString方法),然后,过滤器本身有一个安全的元素和属性的列表,遍历DOM树然后删除列表中没有包括的内容(简要的介绍了一下原理,真正的原理比这个复杂多了)。
因此,假设我们有一个具有以下安全列表的过滤器:

元素: <div>, <b>, <i> and <img>.
属性: src.

接着,用户输入以下HTML:

<div>I am trying to be <i>malicious</i> <u>here</u>! <img src=1 onerror=alert(1)></div>

解析之后,获得以下DOM树:

对比一下安全列表,需要删除两处不包含在列表里的元素及属性

<u>
onerror

因此,遍历DOM树并执行过滤操作之后,得到以下结果:

于是现在就产生了一个“安全的”DOM树,其中过滤了所有不存在安全列表的元素或属性。因此,过滤后就变成了以下字符串:

<div>I am trying to be <i>malicious</i> here! <img src="1"></div>
点击收藏 | 1 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖