Sanitize还可以对CSS规则进行消毒处理,但是将任意内容放入<style>的简单技巧就是利用注释符进行处理。

因此,绕过payload如下:

<svg><style>/*&lt;/style>&lt;img src onerror=alert(1)*/

让我们逐步分析原因。首先,Sanitize将HTML解析为以下DOM树:

<svg>不在白名单列表中,并被删除。但是,<svg>的内容会被忽略。因此,此时的DOM树如下:

没有更多要清除的内容,因此代码被序列化为:

<style>/*</style><img src onerror=alert(1)>*/

这将导致XSS。

总结

Ruby Sanitize库存在一个安全问题,如果网站使用RELAXED配置,则可以完全绕过它。在我这篇文章之后,删除<svg><math>元素的默认行为已更改,以便它们的内容也被删除。