XSS on Google Search -mutation XSS

2019.06.11
  我们这些总有一死的人的命运多么奇特!我们每个人在这个世界上都只作一个短暂的逗留;目的何在,却无从知道,尽管有时自以为对此若有所感。
                           -阿尔伯特•爱因斯坦

  1. 浏览器在解析HTML的时候显自然而然而又非常奇怪:
    在这里插入图片描述
      检查解析的HTML,即DOM树。第一个例子带有脚本的div的标签,浏览器通过添加结束脚本标记,然后关闭div标签来修复它,并将整个内容嵌入到常规的html文档中,这看起来或听起来好像非常的符合逻辑。
      另外一个例子。有一个脚本标签,其中包含一个div标签。看看浏览器做了什么,它采用了脚本标签,将其放入头部。脚本内容是javascript,是div标签。然后添加了脚本关闭标记,最后的引号和尖括号成为了body的文本内容。

  2. Mutation XSS
      突变XSS漏洞是由浏览器解释HTML标准的方式不同造成的。由于浏览器的不同,很难对服务器上的用户输入进行清理。服务器不仅需要考虑浏览器之间的所有差异,还需要考虑它们的版本之间的所有差异。对输入进行过滤以防止XSS的最有效的方法是让浏览器解释输入而不实际执行它。
      有一个很好的客户端库用于防止XSS:DOMPurify。这个库也被Closure使用。然而,DOMPurify并不是万能法宝。在极少数情况下,需要额外的过滤操作才能确保万无一失。确切地说,2018年9月随着Closure的更新而删除了额外的过滤操作。
    在这里插入图片描述
      DOMPurify。使用template元素对用户的输入进行清除。浏览器以不同的方式处理div元素的innerHtml属性和template元素的相同属性。对于div元素,innerHtml在赋值后立即执行,对于tempalte,执行前可以进行过滤处理。
    在这里插入图片描述在这里插入图片描述
      使用template.content列出所有的子项,有一个img标签,在DOM中使用removeAttribuite删除它的onerror。现在将他添加到div中就什么都不会发生了。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    以上就是DOMPurify的工作方式。

  3. XSS on Google Search
      2019年2月,安全研究员Masato Kinugawa发现了这个这个奇怪的HTML浏览器怪癖,这导致了DOMpurify中的问题。
      使用masato的google XSS有效负载。看一下它解析的内容文档树,里边有一个noscript元素,里面有一个p标签,其中有一个title属性包含了一个字符串。该字符串包含一个结束的noscript标记和一个img XSS vector, 但是这被忽略了。像前边的div事例一样,被解析为属性。现在这里是安全的,没有javascript会被执行。
    在这里插入图片描述
    我们将它分配给div.innerHTML。这是触发弹出了一个alert(1)
    在这里插入图片描述
    来看一下div中的内容。现在看起来就像前边第二个例子
    在这里插入图片描述
      为什么div上的innerHTML解析字符串的方式不同于上面template的innerHTML?答案就在于官方的HTML规范。HTML规范规定,根据浏览器中是否启用JavaScript,必须对noscript标签进行不同的解释。
    在这里插入图片描述
    我们的浏览器启用了javascript, 但template中已经禁用javascript。因此浏览器以不同方式解析给定的字符串。
      这正是Google发生的事情。
    在这里插入图片描述
      谷歌的Javascript代码实际上是开源的。据我了解,这次漏洞的起因是在2018年9月26日,开源Closure库(最初由谷歌创建并用于谷歌搜索)的一名开发人员创建了一个提交,删除了部分输入过滤。据推测,这是因为开发人员在用户界面设计方面出现了问题。但此次提交的开发人员以及审核人员并未发现这一举动将会导致XSS。并且这个XSS在Google 的javascript库中存在了大约5个月,很可能影响了许多依赖该sanitizing的谷歌产品。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值