点击上方蓝字“madMen”关注我哟
原文:https://research.securitum.com/xss-in-amp4email-dom-clobbering/
译者:https://github.com/neal1991
这篇文章是我在2019年8月通过 Google 漏洞奖励计划报告的 AMP4Email 中已经修复的 XSS 的文章。该 XSS 是对著名浏览器问题 DOM Clobbering 的真实利用案例。
什么是 AMP4Email
AMP4Email(也称为动态邮件)是 Gmail 的一项新功能,可以让电子邮件包含动态 HTML 内容。尽管撰写包含 HTML 标签的电子邮件已经很多年了,但通常认为 HTML 仅包含静态内容,即某种格式,图像等,没有任何脚本或表单。AMP4Email 打算更进一步,允许电子邮件中包含动态内容。在 Google 官方 G Suite 官方博客中的帖子中,对动态邮件的使用案例进行了很好的总结
通过动态邮件,你可以轻松地直接从消息本身直接操作,例如对事件进行快速回复,填写问卷,浏览目录或回复评论。
以在 Google 文档中进行评论为例。现在,你将不再在有人在评论中提及你时接收到单独的电子邮件通知,而是会在 Gmail 中看到最新的主题,你可以在邮件中直接从中轻松回复或解决评论。
该功能引发了一些明显的安全性问题。最重要的一个可能是:跨站点脚本(XSS)?如果我们允许电子邮件中包含动态内容,是否意味着我们可以轻松地注入任意 JavaScript 代码?好吧,答案是否定的;没那么容易。
AMP4Email 具有强验证器,简而言之,它是允许在动态邮件中使用的标签和属性的强大白名单。你可以在 https://amp.gmail.dev/playground/ 上尝试,你还可以给自己发送动态电子邮件来研究工作原理!
图1. AMP4Email playground
如果你尝试添加验证器未明确允许的任何 HTML 元素或属性,则会收到错误消息。
图2. AMP 验证器禁止使用任意脚本标签
在使用 AMP4Email 并尝试各种方法绕过它时,我注意到标签中不允许 id 属性(图3)。
图3.不允许使用属性 id
这看起来像是开始安全分析的好地方,因为创建具有用户控制的id属性的HTML元素可能会导致 DOM Clobbering。
DOM Clobbering
DOM Clobbering 是 web 浏览器的遗留功能,给许多应用程序带来麻烦。基本上,当你在 HTML 中创建一个元素(例如 <inputid=username>
),然后希望从 JavaScript 引用该元素时,通常会使用 document.getElementById('username')
或者 document.querySelector('#username')
之类的函数。但这不是唯一的方法!
传统的方法是仅通过全局 window
对象的属性来访问它。因此,在这种情况下, window.username
与 document.getElementById('username')
完全相同!如果应用程序基于某些全局变量的存在做出决定(例如, if(window.isAdmin){...}
),则此行为(称为 DOM Cloberring)可能导致有趣的漏洞。
为了进一步分析 DOM Clobbering,假设我们有以下 JavaScript 代码:
if(window.test1.test2) {
eval(''+window.test1.test2)
}
我们的工作是通过仅使用 DOM Cloberring 技术执行任意 JS 代码。要完成这个任务,我们需要找到两个问题的解决方案
我们知道可以在
window
上创建新属性,但是可以在其他对象上创建新属性(比如