挖洞经验 | 跨站Websocket Hijacking漏洞导致的Facebook账号劫持
字数 1528 2025-08-18 11:39:23
跨站WebSocket Hijacking漏洞分析与防御指南
漏洞概述
跨站WebSocket Hijacking (CSWSH)是一种安全漏洞,允许攻击者通过恶意构造的WebSocket连接劫持用户的会话。在Facebook的案例中,该漏洞存在于一个测试阶段的新应用中,可能导致用户账号被完全劫持。
漏洞环境
- 受影响系统:Facebook新推出的测试应用(托管在facebook.com子域名下)
- 测试范围:仅限于受邀安全人员测试的预发布环境
- 漏洞奖励:Facebook支付了$12,500的漏洞赏金
漏洞根本原因
-
不安全的Origin验证:
- 应用允许本地IP地址(如0.0.0.1/8或192.168.1.1/8)作为有效的Origin主机头
- 缺乏严格的同源策略(SOP)和跨域资源共享(CORS)限制
-
混合认证机制:
- 设计上应使用随机数进行安全登录验证
- 实际实现中错误地使用了Facebook全局Cookie进行身份验证
- 随机数在登录页面生成,在后续WebSocket消息中验证
攻击原理
-
会话劫持:
- 攻击者与受害者处于同一本地网络
- 通过构造恶意Origin头建立WebSocket连接
- 利用WebSocket不受SOP/CORS限制的特性
-
攻击媒介:
- DNS欺骗(Spoofing)
- 点对点发送恶意链接
- 通过恶意APP启动无权限限制的HTTP服务
详细攻击步骤
1. 信息收集阶段
- 访问目标应用(REDACTED.facebook.com)
- 保存包含WebSocket通信处理的JavaScript文件
- 分析加密的WebSocket通信和编码的JavaScript逻辑
2. 攻击准备阶段
- 修改收集的JavaScript文件(植入攻击payload)
- 启动本地HTTP服务托管恶意文件
3. 攻击执行阶段
- 向同一网络内的受害者发送恶意链接(deep-link形式)
- 受害者访问链接后:
- 脚本与REDACTED.facebook.com建立WebSocket连接
- 利用用户的Cookie信息通过身份验证
- 受害者看到自己"成功登录"Facebook
- 后台执行攻击payload(如添加攻击者控制的邮箱/手机号)
4. 攻击确认
- 攻击payload在受害者登录后发送特定WebSocket消息
- 实现对受害者Facebook账户的完全控制
- 测试确认在Android设备上有效(iOS未测试)
防御措施
1. 严格的Origin验证
- 实现精确的Origin白名单机制
- 禁止接受本地IP地址作为有效Origin
- 验证完整的域名匹配而非部分匹配
2. 认证机制一致性
- 确保所有认证路径使用相同机制(随机数或Cookie,但不能混合)
- 实现明确的认证流程文档和代码审查
3. WebSocket安全增强
// 服务器端WebSocket连接验证示例
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws, req) => {
// 严格的Origin检查
const origin = req.headers.origin;
if (!isAllowedOrigin(origin)) {
ws.close();
return;
}
// 使用独立的CSRF令牌
const csrfToken = req.headers['x-csrf-token'];
if (!validateCSRFToken(csrfToken)) {
ws.close();
return;
}
// 其他业务逻辑...
});
4. 其他防御措施
- 实现WebSocket连接的CSRF令牌保护
- 对敏感操作要求二次认证
- 限制WebSocket连接的功能范围
- 记录和监控异常的WebSocket连接尝试
漏洞处理时间线
- 2019.12.10:漏洞初次报告
- 2019.12.10:Facebook确认漏洞有效性
- 2019.12.17:Facebook完成漏洞修复
- 2020.1.2:发放$12,500漏洞赏金
总结
跨站WebSocket Hijacking是一种严重的安全威胁,特别是在混合认证机制和不严格的Origin验证条件下。开发人员应当:
- 对所有WebSocket连接实施严格的Origin验证
- 避免混合使用不同的认证机制
- 对敏感操作实施额外的保护措施
- 在预发布阶段进行充分的安全测试
通过实施这些措施,可以有效防止类似CSWSH漏洞的利用,保护用户账户安全。