第二十篇:持久性XSS变异

原文: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编码之后的内容,解码之后如下所示:

1
{“embedIframe”:”<iframe src=\”https://www.linkedin.com/pulse/api/edit/embed?embed={"request":{"originalUrl":"https://www.youtube.com/watch?v=9hWgA7qjK2c","finalUrl":"https://www.youtube.com/watch?v=9hWgA7qjK2c"},"images":[{"width":480,"url":"https://i.ytimg.com/vi/9hWgA7qjK2c/hqdefault.jpg","height":360},{"width":1920,"url":"https://i.ytimg.com/vi/9hWgA7qjK2c/maxresdefault.jpg","height":1080}],"data":{"com.linkedin.treasury.Video":{"width":480,"html":"<iframe scrolling=\”no\” allowfullscreen src=\”//media.licdn.com/embeds/media.html?src=https://www.youtube.com/embed/9hWgA7qjK2c?feature=oembed&amp;url=https://www.youtube.com/watch?v=9hWgA7qjK2c&amp;type=text/html&amp;schema=youtube\" width=\”480\” frameborder=\”0\” class=\”embedly-embed\” height=\”270\” />”,”height”:270}},”provider”:{“display”:”YouTube”,”name”:”YouTube”,”url”:”https://www.youtube.com/"},"author":{"name":"321 Relaxing — Meditation Relax Clips”},”description”:{“localized”:{“en_US”:”Rain HD video and forest, relaxing rain sounds and forest sounds for sleeping meditation. Nature sounds relaxation. Rainforest sounds: https://www.youtube.co..."}},"title":{"localized":{"en_US":"Rain Sounds and Forest Sounds — Relaxing Sleep”}},”type”:”video”}&signature=AcdfNDjBXZOjo2vdz4EOixtGBrlx\”></iframe>”,”universal”:true}

  编辑器将这个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认为它是一个真正的视频播放器

  我们成功在LinkedIn中嵌入了我们的虚假登陆页面。我们将文章命名为’Oops,something went wrong!’

  我们现在可以通过给其他用户分享该文章的私有链接来进行钓鱼。或者也可以直接在LinkedIn上发表它,看看会发生什么。

结论

  我们找到了一种在LinkedLn.com域上创建钓鱼网页的方法。我们使用Open Graph Video meta标签以便在LinkedLn文章中将我们的网络钓鱼页面作为视频播放器注入。

  这是持久性XSS攻击的变体。

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