被误解的X-XSS-Protection

文章使用google翻译

原文:https://blog.innerht.ml/the-misunderstood-x-xss-protection/

被误解的X-XSS-Protection


前几天,我在Twitter上进行了一次民意调查,看看人们认为是XSS过滤器/审核员最糟糕的环境。结果是非常惊人的:

Which header setting of XSS filter/auditor do youthink is the worst?

— File Descriptor (@filedescriptor) March 17, 2017

总之,最糟糕的是 X-XSS-Protection: 0,其次 X-XSS-Protection: 1; mode=block,最后 X-XSS-Protection: 1是最坏的。在我看来(也可能是其他一些人),结果是令人惊讶的,因为我们期望他们是相反的(即X-XSS-Protection: 1应该是最差的)。在这篇简短的博客文章中,我将讨论这些问题,并希望让人们认识到安全性的含义。

简单的介绍
在Internet Explorer 8中,引入了针对XSS攻击的防御。这种浏览器内置的功能称为XSS过滤器,旨在缓解反映的XSS。Webkit后来有了自己的版本,叫做Chrome和Safari的XSS审计。这个想法很简单:如果一个恶意的输入被反映在文档中,反射的部分将被删除或整个文档根本不会被渲染。

关于设置,网站可以明确地包含 X-XSS-Protection标题,告诉浏览器过滤器/审核员应该如何操作。Thare有三种可能的选择:

  • 0(禁用XSS过滤器/审核员)
  • 1(删除不安全的部分;如果没有X-XSS-Protection标题,这是默认设置)
  • 1; mode = block(如果找到XSS,则不要渲染文档)
罪魁祸首
让我们来谈谈离开设置默认的问题。第一个问题是它扩大了攻击面。通过滥用误报,攻击者可以选择性地禁用页面上的无辜脚本。
被误解的X-XSS-Protection_第1张图片
XSS审计员在行动

在上面的例子中,jQuery库尽管不应该被删除。这是因为审计人员无法区分脚本是被攻击者注入的还是用于页面的。你可以想象,如果这是一个安全库,攻击者可以简单地伪造一个注入并将其移除。事实上,类似的技巧已经被用来对付基于JS的frame-buster。

第二个问题是它引入了新的漏洞。在2009年,由于XSS滤波器的缺陷,在IE中发现了UXSS。实质上,攻击者可以将无害的标记变成有害的标记,因为过滤器错误地替换了关键位置中的字符,从而损坏了原始文档结构。通过精心制作的有效载荷,可以为属性上下文提供转义。最近,还有更多UXSS被发现在其他上下文中使用与XSS过滤器完全相同的根本原因。

第三个问题是XSS过滤器/审计员旁路是不可避免的。你可以看看这个,这个,这个和这个。从历史中学习,我们知道无论过滤器/审核员如何努力改进,总会有潜在的绕过。此外,审计师在某些情况下也有其自身的局限性。Chromium团队实际上清楚地表明,XSS审计师只是一种纵深防御机制,并不能抓住所有可能的XSS变体。

所以现在应该不会有人认为XSS过滤器/审核员很容易被绕开,而其部分移除方法是有问题的。那么“全部或全部”的方法(也 X-XSS-Protection: 1; mode=block就是最推荐和最普通的方法)是救世主吗?

乍看之下,似乎可以解决误报滥用的问题,并且在删除脚本的过程中消除引入漏洞的可能性,同时提供最小的防御。它肯定能防止攻击者滥用误报,但不幸的是,它不断引入新的漏洞。其中最重要的一个是引发Facebook 泄密的引用漏洞。这也是为什么Facebook决定关闭XSS过滤器/审计员(即)。其他相关的错误包括这个和这个。与上面相比,虽然bug数量相对要小得多。 X-XSS-Protection: 0

那么,最佳选择?
总而言之,这取决于 X-XSS-Protection: 0和之间的情况 X-XSS-Protection: 1; mode=block。如果您认为您的应用程序无XSS或无法承担不寻常的筛选器/审计器错误,那么请选择前者。否则,一般使用后者是完美的。经验法则是你永远不会默认它。

你可能感兴趣的:(web)