Facebook上一个有趣的CSRF

AlexFrankly 2017-4-14 安全界 0 0

Facebook的群组提供了直接从Dropbox账户上传文件的功能,这种功能是使用了OAuth 2.0协议实现的。并且存在传统的OAuth CSRF漏洞。

介绍

Facebook群组提供直接从Dropbox帐户上传文件的功能:

1.png

这将允许通过浏览器浏览Dropbox帐户

2.png

然后将特定文件发布到Facebook群组。这个功能是使用OAuth 2.0协议修改而成的。但是OAuth是IETF规范化的访问授权协议。

典型的OAuth流程如下图所示:

3.png

通常,客户端启动OAuth的流程如下:

4.png

然后资源所有者授权服务器将资源重定向到具有授权码的客户端:

5.png

OAuth认证和授权的过程如下:

1、用户访问第三方网站网站,想对用户存放在服务商的某些资源进行操作。

2、第三方网站向服务商请求一个临时令牌。

3、服务商验证第三方网站的身份后,授予一个临时令牌。

4、第三方网站获得临时令牌后,将用户导向至服务商的授权页面请求用户授权,然后这个过程中将临时令牌和第三方网站的返回地址发送给服务商。

5、用户在服务商的授权页面上输入自己的用户名和密码,授权第三方网站访问所相应的资源。

6、授权成功后,服务商将用户导向第三方网站的返回地址。

7、第三方网站根据临时令牌从服务商那里获取访问令牌。

8、服务商根据令牌和用户的授权情况授予第三方网站访问令牌。

9、第三方网站使用获取到的访问令牌访问存放在服务商的对应的用户资源。

Facebook/Dropbox integration

在Facebook/Dropbox集成的功能中Dropbox是客户端,而Facebook是授权/资源服务器。

6.png

这是一个非常标准的OAuth流程,但现实是:

7.png

事实上Facebook正在启动流程:

https://www.facebook.com/dialog/oauth?display=popup&client_id=210019893730&redirect_uri=https%3A%2F%2Fwww.dropbox.com%2Ffb%2Ffilepicker%3Frestrict%3D100000740415566%26group_id%3D840143532794003&scope=publish_actions%2Cuser_groups%2Cemail&response_type=code

所以整个过程应该如下图所示:

8.png

CSRF in OAuth 2

大家一定会注意到启动连接

https://www.facebook.com/dialog/oauth?display=popup&client_id=210019893730&redirect_uri=https%3A%2F%2Fwww.dropbox.com%2Ffb%2Ffilepicker%3Frestrict%3D100000740415566%26group_id%3D840143532794003&scope=publish_actions%2Cuser_groups%2Cemail&response_type=code

缺少一个非常重要的部分(在OAuthland中)即状态参数,该参数在OAuth核心规范中的说明:

An opaque value used by the client to maintain state between the request and callback. The authorization server includes this value when redirecting the user-agent back to the client. The parameter SHOULD be used for preventing cross-site request forgery (CSRF).

可以发现此参数是用来防御CSRF攻击的。

整个CSRF攻击攻击流程如下图所示:

9.png

您也可以在 the the Most Common OAuth2 Vulnerability 中找到对这次攻击的很好的介绍。

CSRF in Facebook/Dropbox integration

在描述具体的攻击之前,我们需要强调一个非常重要的事情。在这种情况下,OAuth中对于CSRF的经典保护(也就是使用状态参数)将不起作用。 原因是由于我们已经看到,流量是由Facebook而不是Dropbox发起的。所以没有办法让Dropbox检查正确的状态参数是否被反弹。攻击者完全可以伪造具有恶意链接的页面。

测试代码如下:

<html>
<img src="https://www.dropbox.com/fb/filepicker?restrict=100000740415566 
&group_id=236635446746130 
&code=AQAJspmJvIyCiTicc4QNr7qVU4EF05AYqBE_K9pl-fbhSuKyxtjHS_UyYU8K0S
czXZCTa9WxtG7I8EoxAIcyqhyO0tagiVSa1m2H3Umg8uZR6gixrlmUXKuyoXmYsb14yxPbwonY
xvepwP2N93gWxhVwl1me-qeenZIX2oKgqBuFMRHAW5SCaYCvYSYtaMlrDyYGoftTCAYM0QfU_
bX94LfkHUl81O1tmrLU2NtnU5Eh_XKvxjiD5j2ftSWfpCoxeb7ccaz_9UPZjsFnKGCtTTPX_2dCqi99aT
7B3M4idq6hzY-wUuDmaOL143WolrCGkDUu-np8gyEFx4wfMMdX0a0g#_=_" />
</html> 

并且受害者访问这个地址后,他的Dropbox上传文件后将看见攻击者的名字。

演示视频:

https://v.qq.com/x/page/y0392zwqvu1.html

事实证明,Dropbox中的一个奇怪的问题是访问令牌被无限期地缓存。因此,一旦制作的授权码与受害者资源所有者绑定,而不管实际使用合法授权代码,并继续使用旧的恶意访问令牌将文件发布到Facebook!

原文链接:http://blog.intothesymmetry.com/2017/04/csrf-in-facebookdropbox-mallory-added.html

*本文作者:zusheng,转载请注明来自Freebuf.COM

转载请注明来自华盟网,本文标题:《Facebook上一个有趣的CSRF》

喜欢 (0) 发布评论