深入分析Facebook网站上的存储型XSS
字数 1929 2025-08-29 08:32:09
Facebook存储型XSS漏洞深入分析与防御指南
漏洞概述
本教学文档详细分析Facebook网站上发现的多个存储型XSS漏洞,这些漏洞通过Open Graph协议在留言板上嵌入外部视频来实施攻击。当用户点击播放视频时,XSS代码会在facebook.com的上下文中执行。
Open Graph协议工作机制
Open Graph(OG)协议允许在社交媒体帖子中嵌入富媒体内容,其工作流程如下:
- 攻击者在Facebook帖子中发布URL
- Facebook服务器读取URL(服务器端),解析OG元标签,提取内容信息
- 受害者通过封面图像和播放按钮查看帖子
- 点击播放按钮时,视频加载并执行XSS代码
关键点:服务器端读取用户提供的URL可能导致SSRF漏洞。
漏洞类型与利用分析
1. 基于FlashMediaElement.swf的存储型XSS
漏洞原理:
- 当ogVideoType为"video/flv"时,Facebook加载FlashMediaElement.swf
- Flash将日志信息通过Flash-to-javascript发送到facebook.com
- 漏洞存在于setTimeout函数的不安全使用和转义处理不当
利用步骤:
- 构造恶意OG元标签:
<meta property="og:video:type" content="video/flv">
<meta property="og:video:secure_url" content='https://evil.com/video.flv?"+alert(document.domain+" XSSed!")+"'>
- Chrome浏览器解析URL时不对哈希部分的引号进行编码
- 导致执行:
log("http://evil.com/video.flv?"+alert(document.domain+" XSSed!")+"")
修复方案:
Facebook修复了Flash文件,不再使用setTimeout函数,并正确转义引号。
2. 无需Flash的存储型XSS
漏洞原理:
- 当ogVideoType为"video/vimeo"时,直接构造iframe
- absolutizeUrl函数处理后未对输出进行编码
利用步骤:
- 设置ogVideoUrl为:
http://evil.com/#" onload="alert(document.domain)"
- 导致生成:
<iframe src="https://player.vimeo.com/video/#" onload="alert(document.domain)"?api=1"></iframe>
修复方案:
Facebook添加了对引号的编码处理。
3. 错误消息中的XSS
漏洞原理:
- 当ogVideoType为未知类型时,错误消息中包含未编码的ogVideoUrl
利用步骤:
- 设置ogVideoUrl为:
https://opnsec.com/#"></a>
4. Silverlight组件中的XSS
漏洞原理:
- 当ogVideoType为"silverlight"时,使用逗号分隔参数
- 攻击者可注入额外参数覆盖安全参数
利用步骤:
- 设置ogVideoUrl为:
https://opnsec.com/#,id=alert(document.domain)&
- 导致Silverlight调用:
alert(document.domain) & _init()
修复方案:
Facebook决定移除所有MediaElement组件,采用新的视频处理方式。
漏洞影响范围
这些漏洞不仅存在于Facebook,也影响使用MediaElement.js的其他平台,特别是WordPress:
- WordPress默认使用MediaElement.js处理短代码
- 允许攻击者在评论或作者文章中植入存储型XSS
- WordPress在2018年2月发布了相关修复
防御建议
1. Open Graph协议安全使用
- 警惕SSRF、XSS和Clickjacking风险
- 对用户提供的URL进行严格验证
- 使用X-Frame-Options防止Clickjacking
2. URL处理最佳实践
- 不要依赖浏览器解析JavaScript代码中的URL
- 使用白名单正则表达式验证URL
- 对所有动态插入的内容进行适当的编码
3. 安全编码实践
- 避免使用危险的函数如setTimeout和eval
- 对所有用户输入进行上下文相关的输出编码
- 实现内容安全策略(CSP)
4. 安全测试建议
- 进行深入的代码审查,特别是涉及动态内容的部分
- 使用多种浏览器测试XSS漏洞(不同浏览器处理方式不同)
- 注意现代工具可能检测不到高级XSS漏洞
浏览器URL解析差异
不同浏览器对URL中特殊字符的编码处理不同:
| 浏览器 | URL哈希部分引号编码 | URL搜索部分引号编码 |
|---|---|---|
| Firefox | 编码 | 编码 |
| Chrome(旧版) | 不编码 | 编码 |
| Chrome(65+) | 编码 | 编码 |
| IE/Edge | 不编码 | 不编码 |
| Safari | 不编码 | 编码 |
关键教训:不应依赖浏览器进行URL编码,应主动实施编码。
总结
本教学文档详细分析了Facebook上通过Open Graph协议和MediaElement.js组件实现的多种存储型XSS漏洞。这些漏洞展示了现代Web应用中复杂的安全挑战,特别是当涉及第三方组件、富媒体内容和跨浏览器兼容性时。防御这类漏洞需要多层次的安全措施,包括输入验证、输出编码、安全编码实践和持续的安全测试。