代码之家  ›  专栏  ›  技术社区  ›  Ned Batchelder

IE8XSS过滤器:它真正做什么?

  •  43
  • Ned Batchelder  · 技术社区  · 15 年前

    Internet Explorer 8有一个新的安全功能,即 XSS filter 试图拦截跨站点脚本尝试。它是这样描述的:

    XSS过滤器是InternetExplorer8的新功能,它在URL和HTTP POST请求中检测到JavaScript。如果检测到javascript,XSS过滤器将搜索反射证据,如果攻击请求未被提交,则返回到攻击网站的信息。如果检测到反射,XSS过滤器将清除原始请求,以便无法执行附加的javascript。

    我发现,即使没有“反射的证据”,XSS过滤器也会启动,并且开始认为过滤器只是在向另一个站点发出请求并且响应包含javascript时才会注意到。

    但即便如此,也很难证实,因为这种效应似乎来去往往。IE有不同的区域,当我想我重现了这个问题时,过滤器就不再启动了,我不知道为什么。

    有人知道怎么对付这个吗?过滤器真正需要的是什么?有没有什么方法可以让一个好人把数据发布到第三方网站上,这样可以让HTML在iframe中显示而不触发过滤器?

    背景:我正在从第三方网站加载一个javascript库。这个javascript从当前的HTML页面中获取一些数据,并将其发布到第三方站点,该站点会响应一些要在iframe中显示的HTML。要查看它的实际情况,请访问 AOL Food 翻页并单击文章上方的“打印”图标。

    3 回复  |  直到 14 年前
        1
  •  56
  •   bobince    15 年前

    它真正的作用是什么?它允许第三方链接到一个混乱的网站版本。

    当[满足一些条件并且]它在查询提交中看到一个字符串,该字符串在页面中一字不差地存在,并且它认为这可能是危险的。

    假设如果 <script>something()</script> 在查询字符串和页面代码中都存在,那么它必须存在,因为服务器端脚本不安全,并将该字符串直接反映为标记而不进行转义。

    但当然,除了这是一个完全有效的查询,有人可能是碰巧输入了匹配的查询,也尽可能匹配,因为有人看了页面,故意把它的一部分复制了出来。例如:

    http://www.bing.com/search?q=%3Cscript+type%3D%22text%2Fjavascript%22%3E

    按照IE8中的步骤操作,我已经成功地破坏了您的必应页面,这样它将给出脚本错误,弹出结果位将不起作用。本质上,它给了攻击者一个链接被跟踪的许可证,允许他挑选和禁用页面中他不喜欢的部分,甚至可能包括其他与安全相关的措施,如framebuster脚本。

    IE8认为“潜在危险”是什么?不仅仅是这个脚本标签,还有很多奇怪的东西。 eg .此外,它似乎与使用文本模式系统(可能是regex)的一组“危险”模板相匹配,而不是像最终解析页面本身那样的任何类型的HTML解析器。是的,请使用IE8,您的浏览器是par_

    __XSS保护_ 完全假象 . 它不可能是固定的,这一概念本身就有缺陷。除了在不需要的情况下介入的问题外,它无法真正保护您免受最基本的攻击,而且攻击者肯定会绕过IE8变得更广泛使用的这些块。如果您忘记正确地逃避HTML输出,那么您仍然很容易受到攻击;所有xss__protection__必须为您提供的是一种错误的安全感。不幸的是,微软似乎喜欢这种错误的安全感;在ASP.NET中,在服务器端也有类似的xss_protection_157;。

    因此,如果您对webapp创作有了一些线索,并且像个好孩子一样正确地将输出转义到HTML,那么通过输出头部来禁用这种不需要的、不可行的、错误的入侵绝对是个好主意:

    X-XSS-Protection: 0
    

    在您的HTTP响应中。(及使用) ValidateRequest="false" 如果使用的是ASP.NET,则显示在页面中。)

    对于其他人来说,他们仍然在PHP中把字符串放在一起,而不注意正确的编码…好吧,你还是开着吧。别指望它能真正保护你的用户,但你的网站已经被破坏了,所以谁会在乎它是否会再破坏一点,对吧?

    要查看它的实际情况,请访问一个AOL食品页面,然后单击故事上方的“打印”图标。

    啊,是的,我可以在IE8中看到这个突破。但是,在IE对阻止其执行的内容进行黑客攻击的地方并不明显…我能看到的唯一一个跨域请求是XSS过滤器的候选者是 http://h30405.www3.hp.com/print/start :

    POST /print/start HTTP/1.1
    Host: h30405.www3.hp.com
    Referer: http://recipe.aol.com/recipe/oatmeal-butter-cookies/142275?
    
    csrfmiddlewaretoken=undefined&characterset=utf-8&location=http%253A%2F%2Frecipe.aol.com%2Frecipe%2Foatmeal-butter-cookies%2F142275&template=recipe&blocks=Dd%3Do%7Efsp%7E%7B%3D%25%3F%3D%3C%28%2B.%2F%2C%28%3D3%3F%3D%7Dsp%7Ct@kfoz%3D%25%3F%3D%7E%7C%7Czqk%7Cpspm%3Db3%3Fd%3Do%7Efsp%7E%7B%3D%25%3F%3D%3C%7D%2F%27%2B%2C.%3D3%3F%3D%7Dsp%7Ct@kfoz%3D%25%3F%3D%7E%7C%7Czqk...
    

    那个 blocks 参数继续与页更胡言乱语。大概有 某物 在那里(巧合?)它反映在返回的HTML中,并触发IE8对XSS漏洞的一个混乱想法。

    要解决此问题,HP需要使位于h30405.www3.hp.com的服务器包含 X-XSS-Protection: 0 标题。

        2
  •  25
  •   EricLaw    15 年前

    你应该给我(ericlaw@microsoft)发送一个网络捕获(www.fiddlercap.com)你认为不正确的场景。

    XSS过滤器的工作原理如下:

    1. 是否为此进程启用了xssfilter?
      如果是,继续进行下一次检查。 如果没有旁路XSS过滤器并继续加载
    2. 是否加载“文档”(像框架,而不是子下载)? 如果是,继续进行下一次检查。 如果没有旁路XSS过滤器并继续加载
    3. 是HTTP/HTTPS请求吗? 如果是,继续进行下一次检查。 如果没有旁路XSS过滤器并继续加载
    4. 响应是否包含x-xss-protection头? 对: 值=1:XSS过滤器已启用(无URLACTION检查) 值=0:XSS过滤器已禁用(无URLACTION检查) 否:进行下一次检查
    5. 网站加载是否位于URLACTION启用XSS筛选的区域中?(默认情况下:Internet、受信任、受限制) 如果是,继续进行下一次检查。 如果没有旁路XSS过滤器并继续加载
    6. 是跨站点请求吗?(referer header:HTTP请求referer header中的最终(post-redirect)完全限定域名是否与正在检索的URL的完全限定域名匹配?) 如果是,绕过XSS过滤器并继续加载 如果没有,那么请求中的URL应该中性化。
    7. 响应数据的启发式指示是否来自不安全的请求数据? 如果是,修改响应。

    现在,7的确切细节相当复杂,但基本上,您可以想象IE将请求数据(URL/Post Body)与响应数据(脚本体)进行匹配,如果匹配,则会修改响应数据。

    在您的站点的情况下,您需要查看邮件的正文 http://h30405.www3.hp.com/print/start 以及相应的响应。

        3
  •  7
  •   Roland Bouman    15 年前

    事实上,情况比看上去更糟。XSS过滤器可以使安全站点不安全。在这里阅读: http://www.h-online.com/security/news/item/Security-feature-of-Internet-Explorer-8-unsafe-868837.html

    从那篇文章:

    但是,Google通过发送x-x s s-protection:0头来禁用IE的x s s过滤器,这使得它免疫。

    我对你的网站不太了解,无法判断这是否是一个解决方案,但你可以尝试一下。 下面是关于过滤器的更深入的技术讨论,以及如何禁用它: http://michael-coates.blogspot.com/2009/11/ie8-xss-filter-bug.html