原文:Persistent XSS (unvalidated Open Graph embed) at LinkedIn.com
漏洞:网站对Open Graph标签内容过滤不严
作者:Jonathan Bouman
难度:高
背景
在我之前的报告中,我们了解了一种特殊类型的持久性XSS攻击——the unvalidated oEmbed attack。这种攻击允许我们通过oEmbed功能来注入我们的HTML和javascript代码。
oEmbed是一种开放格式,用来将一个网站中的内容嵌入到另一个网站中。几乎所有富媒体平台都支持oEmbed标准。例如:你只需要将视频链接粘贴在文章中,即可轻松地将Youtube视频添加到Wordpress博客里。Wordpress会将此链接转换为HTML代码,这个HTML就会加载Youtube的视频播放器并且播放该视频。
例如:如果我在本篇文章中粘贴我的推特个人资料链接,那么媒体平台将创建一个包含我的推特个人资料的框架,这就是oEmbed的功能。正如我们之前所了解的那样,它们易受攻击并且允许未经验证的oEmbeds。
[*]oEmbed端点由Twitter指定,Medium将其用于嵌入
丰富视觉内容的另一种方法是使用 Open Graph Protocol。网站可以将Open Graph标签添加到它们的网页,用来指定被嵌入的内容类型(图片、视频、gif)
[*]维基百科有一个标签,它定义如果被嵌入到文章中应该显示图片
大多数平台在嵌入内容之前都会先检查这些特定的oEmbed和Open Graph标签的URL,他们按照特定的顺序执行检查操作。在检查完所有标签之后,他们才会决定是否嵌入以及怎样嵌入链接。
嵌入式的最大优点是读者不必离开博客就能查看到媒体丰富的内容(例如:视频,图像,演示文稿)。此外,对于媒体平台,如Vimeo和Youtube,这是增加他们访问量的好办法。
大多数允许您嵌入外部内容的平台都具有白名单,只有白名单上域名的url才能被嵌入,比如Wordpress。您肯定不希望将未经验证的HTML代码注入到您的平台上。
但是如果这个白名单失效了,并且我们能够将我们的恶意代码注入到目标平台的话会发生什么呢?
之前我们已经证明过oEmbed是vulnerable的,现在再来看看我们是否可以通过操作Open Graph标签再次攻陷目标,let’s give it a try!
验证目标
如果让我们寻找在哪里可以嵌入外部内容的地方的话,博客往往是最好的选择。点击下图 Write an Article 按钮编辑文章
我们得到一个漂亮又干净的编辑器,它允许我们编写文章,包括标题和内容。在我们的光标旁边有一个小图标,它允许我们”添加图像或者视频以获得视觉效果”。
如果我们按下这个小图标,我们就可以选择链接按钮,并在我们的博客中添加丰富视觉的内容
嵌入请求:
是时候启动Burp Suite并检查我们的网络流量了,在我们填写URL之后会发生什么?
[*]链接被转换为嵌入Youtube播放器的HTML代码
可以看到LinkedIn将我们输入的URL转换为我们可以嵌入的HTML代码。响应是将URL编码之后的内容,解码之后如下所示:
|
|
编辑器将这个iframe解析到我们的文章中,这导致视频播放器出现之前会有三个iframe互相嵌套。
这意味着即使我们能够注入我们自己的恶意HTML代码,我们也无法访问LinkedIn域名;我们在iframe中被隔离了。我们无法访问任何LinkedIn cookies,并且我们无法操纵iframe之外的HTML。
但是我们可以注入一个虚假的LinkedIn登录屏幕并窃取访问者的密码,这种可能性还是挺大的。LinkedIn嵌入内容时没有任何视觉上的提示,被嵌入的内容只是干净的无边框,因此访问者很难将其与真正的登录屏幕区分开来。
一个完美的网络钓鱼登录:
首先我们需要设计钓鱼登录屏幕,因为我们希望让非技术人员也能够理解到它的严重性。一个简单的javascript警告框通常不够说服力。
SnappySnippet是一个复制其它网站HTML元素的工具。该Chrome扩展程序允许您选择网站中的元素,并将其粘贴为纯HTML和CSS代码
我们将来自SnappySnippet的代码粘贴到一个新的HTML文件中,稍微调整一下,然后在最后添加一些javascript,以便捕获email和密码。如果有人提交表单,我们希望在javascript弹窗中显示登录详情作为概念证明
让我们将这个虚假的登录html文件上传到我们自己的服务器上,并尝试将其嵌入我们的LinkedIn文章中。看看如果我们在没有任何oEmbed或者Open Graph标签的情况下链接会发生什么。
我们可以看到它被放到了一个”通用嵌入式包装器”中,只是显示了我们的URL,周围有一个小的灰色边框而已。
利用Open Graph:
如果我们仔细查看Open Graph 协议规范,我们会发现有一个名为og:video的标签。它定义了如何嵌入视频播放器。
现在我们创建一个带有og:video标签的HTML文件,然后在其中加载我们构造的虚假登录链接而不是视频播放器,结果会怎样呢?
[*]我们试图将该文档作为视频播放器嵌入到文章中
[*]我们的虚假登录被加载,LinkedIn认为它是一个真正的视频播放器