你想参加私有众测?我很乐意邀请你,请联系我Jonathan@Protozoan.nl
背景
在我的上一篇文章中,我们已经学到存储型xss中的特殊类型。这次攻击允许我们通过操作oEmbed功能去注入HTML和JavaScript。
oEmbed是一种开放的格式,它允许从其他网站插入内容。大多数富文本平台支持标准的oEmbed。比如,你会很容易的在你Wordpress博客的文章中通过粘贴一段 Vimeo的视频链接来添加一段视频。Wordpress将把链接转换成HTML。这段HTML加载视频播放器,然后播放指定的视频。
如果我粘贴我的推特的链接到这篇文章中,那么Medium就会创建一段带我照片的简介。这就是oEmbed的功能。在我们知道这些之前,它们有一个很严重的漏洞,允许用户插入未经验证的oEmbeds。
另一种方式就是通过 Open Graph 协议来嵌入一个假的富文本。一个网站在页面上添加Open Graph标签,目的是指定你插入的内容类型。
在用户嵌入内容之前,大多数平台会检查指定的oEmbed和Open Graph标签。网站会遵守特殊的规则。然后网站会检查所有的标签,以决定是否嵌入其中或者以怎样的方式嵌入其中。
还有一个有利条件是,独自不需要离开博客去查看富文本内容(比如:视频,图片,表演)。还可以插入像Vimeo和Youtube等视频平台的链接,也可以提高他们的播放量和点击率。
大多数平台允许你嵌入一些其他的内容,但是它们会有域名的白名单。看一下 Wordpress的做法。你想把你的HTML注入到平台中,这可能有点难度。
但是如果白名单的实现出现了错误,那么我们就可以把我们的恶意代码注入到我们的目标平台上去,那么这样的错误是什么呢?
我们已经证明了oEmbed中的漏洞,现在我们看看能不能利用这个技巧来操纵Open Graph标签呢?让我们试试。
选取目标
今天我们应该选谁好呢?你说LinkedIn?好主意。当我想联系我关注的研究员时,LinkedIn是我最喜欢的去的地方。而且上面有大量的CEO/CTO/CTTO/CNYANCATO。所以当我报告一个漏洞时(例如没有安全负责人的平台)。我就会快速的联系到那个网站的负责人,给他们的经理直接发送一个消息就足够了:”嘿,你的网站有漏洞了,你快去看一下。你的技术支持还在睡觉。“
这里我插一句嘴,LinkedIn是一个有一个非常负责任的漏洞披露平台,它们甚至也有私有众测项目
让我们给他们报告一个漏洞,然后争取参加私有众测的机会吧
识别目标
博客,这就是我想要寻找的地方,这里允许我们插入一些额外的内容。对LinkedIn 文章说hello。通过访问你的动态然后点击 Write an Article 这个按钮,你就会打开这部分功能。
我们访问到了一个看起来比较干净的编辑器,这里允许我们去写我们的第一篇文章,这个文章由标题和内容组成。我们移动鼠标到下面的小图标中,这里有一些可以添加图片和视频的功能。
点击这个小图标,我们点开添加链接的按钮,然后在我们的博客中添加富文本内容。
插入请求
是时候打开 Burp Suite 然后观察我们的数据传输,当我们填入链接的时候到底发生了什么?
我们看到LinkedIn把我们的url转换成了HTML代码。返回报文被url编码了,下面是解码的结果:
{“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&url=https://www.youtube.com/watch?v=9hWgA7qjK2c&type=text/html&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}
编辑器把它解析成框架,然后放入我们的文章中,结果被放入了三个框架之中,它们中每一个之后都有一个视频播放器。我们继续,然后就看到我们嵌入的YouTube视频 relaxing rain sounds
这意味着我们能够注入我们自己的恶意HTML,这个html不是LinkedIn域下的。我们可以创建独立的框架。但是我们不能得到LinkedIn的cookie,我们也不能操作框架外的html
如果我们能注入一个假的LinkedIn登录页面,然后偷走访客的密码,这样的话,影响也是蛮大的。在LinkedIn中嵌入内容,LinkedIn不会暗示这是一个嵌入的东西,就只是一个干净的,无边框的盒子。所以,对于普通人来说,还是很难区分这是一个钓鱼页面还是一个真正的登录页面。
完美的钓鱼页面
首先我们要设计一个钓鱼页面来,因为我希望能让其他人很快的了解到这个漏洞的危害程度到底有多深。弹出一个JavaScript的警告框是不够的。
想要复制一个网站的页面元素,可以用SnappySnippet。这是一个Chrome的插件,它可以让你选择网站的元素,并且把它的HTML和css文本都复制下来。
我们把SnappySnippet中的代码贴到新的的HTML文件中去,然后把它转换的小一点,并在结尾添加一些JavaScript代码,以捕捉到用户输入的邮箱和密码。如果你输入用户名和密码并且提交了之后,我就会用JavaScript的警告框来显示你的登录信息。
我把假的登录页面上传到我自己的服务器中,然后把它嵌入到LinkedIn的文章里面,如你所见,我们没有用到oEmbed或者Open Graph标签
有一点失败的地方就是我们插入的页面周围有一圈灰色边框,看上去就像被嵌在里面的一样。
利用Open Graph
如果你仔细观察Open Graph协议,你会发现有个标签名是og:video。它告诉浏览器视频播放器该如何被嵌入其中。
如果我们用og:video标签加载我们的钓鱼页面而不是视频播放器,那么会发生什么?
欧耶,我们把钓鱼页面成功的嵌入到了LinkedIn的文章中。让我们把文章标题改成‘Oops, something went wrong!’,然后继续
现在我们可以通过精心构造一篇文章,然后把链接发给其他人,就可以盗取其他用户的用户名和密码了。或者,我们可以把它公开在LinkedIn上,看看会发生什么。
现在所有的事情都已经完成,是时候写一篇报告交给LinkedIn的安全团队了
结尾
我在LinkedIn.com 中创建了一个完美的钓鱼页面。我们在LinkedIn的文章中在Open Graph Video标签中注入了我们的钓鱼页面。
这也是一种存储型xss攻击
攻击的影响
我还忘了哪些呢?请给我留言
避免这次攻击的解决方案
- 不要让用户来控制Open Graph标签,使用白名单来控制嵌入的内容
- 不要用框架
赏金
没有