挖洞经验 | 用浏览器缓存绕过同源策略(SOP)限制
字数 1306 2025-08-18 11:39:15
利用浏览器缓存绕过同源策略(SOP)限制的教学文档
1. 漏洞背景
1.1 目标系统介绍
Keybase.io是一个开源的跨平台即时通讯工具,特点包括:
- 支持macOS、Linux和Windows平台
- 提供Chrome/Firefox浏览器扩展
- 提供iOS和Android版本
- 采用端到端加密方式保护用户数据
- 承诺为群组、文件和聊天数据提供安全保护
1.2 漏洞涉及的技术
- 同源策略(SOP): 浏览器安全机制,限制不同源的脚本交互
- 跨域资源共享(CORS): 允许服务器声明哪些外部源可以访问资源
- 浏览器缓存机制: 特别是ETag头的使用
2. 漏洞发现过程
2.1 目标API分析
Keybase提供了一个查询用户信息的API端点:
https://keybase.io/_/api/1.0/user/lookup.json?username={USERNAME}
该API的CORS配置如下:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET
Access-Control-Allow-Headers: Content-Type, Authorization, Content-Length, X-Requested-With
Access-Control-Allow-Credentials: false
2.2 CORS配置问题分析
Access-Control-Allow-Origin: *- 允许任何域发起跨域请求Access-Control-Allow-Credentials: false- 不允许携带认证信息- 但实际测试发现,如果请求包含有效Cookie,会返回敏感信息
3. 漏洞详情
3.1 敏感信息泄露
当认证用户查询自己的信息时,API返回的敏感数据包括:
- 邮箱地址
- 可用和已用的邀请码数量
- 计费信息
- 上一次登录的时间戳
- 邮件形式的时间/日期验证码
- TripleDes加密的PGP私钥(遗留功能)
3.2 缓存机制问题
API响应中包含ETag头,但没有设置Cache-Control头,导致:
- 浏览器可以缓存响应
- 攻击者可以利用缓存机制绕过同源策略限制
4. 漏洞利用方法
4.1 利用浏览器缓存
通过构造特殊请求,强制浏览器从缓存中读取先前认证过的响应:
<html>
<script>
var url = "https://keybase.io/_/api/1.0/user/lookup.json?username={YOUR_USERNAME}";
fetch(url, {
method: 'GET',
cache: 'force-cache'
});
</script>
</html>
4.2 攻击步骤
- 受害者正常登录Keybase.io并访问API
- 浏览器缓存API响应(包含ETag)
- 攻击者诱导受害者访问恶意页面
- 恶意页面使用
force-cache选项发起请求 - 浏览器返回缓存的敏感信息
5. 漏洞修复建议
5.1 CORS配置改进
- 限制
Access-Control-Allow-Origin为可信域名 - 对于敏感API,避免使用通配符(*)
5.2 缓存控制
- 对敏感API响应添加
Cache-Control: no-store或Cache-Control: private - 避免使用ETag或添加
Vary: Authorization头
5.3 认证机制
- 对敏感操作要求CSRF token
- 确保
Access-Control-Allow-Credentials: false时不会泄露敏感信息
6. 防御措施
6.1 开发者防御
- 严格审查CORS配置
- 实施适当的缓存控制策略
- 对敏感数据进行额外保护
6.2 用户防御
- 及时注销不使用的会话
- 定期清理浏览器缓存
- 警惕不明来源的网页请求
7. 总结
本漏洞展示了如何利用浏览器缓存机制绕过同源策略限制,关键在于:
- 目标API存在CORS配置不当
- 缺乏适当的缓存控制
- 敏感信息未得到充分保护
通过理解这些机制,开发者可以更好地保护Web应用免受此类攻击。