挖洞经验 | 用浏览器缓存绕过同源策略(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配置问题分析

  1. Access-Control-Allow-Origin: * - 允许任何域发起跨域请求
  2. Access-Control-Allow-Credentials: false - 不允许携带认证信息
  3. 但实际测试发现,如果请求包含有效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 攻击步骤

  1. 受害者正常登录Keybase.io并访问API
  2. 浏览器缓存API响应(包含ETag)
  3. 攻击者诱导受害者访问恶意页面
  4. 恶意页面使用force-cache选项发起请求
  5. 浏览器返回缓存的敏感信息

5. 漏洞修复建议

5.1 CORS配置改进

  • 限制Access-Control-Allow-Origin为可信域名
  • 对于敏感API,避免使用通配符(*)

5.2 缓存控制

  • 对敏感API响应添加Cache-Control: no-storeCache-Control: private
  • 避免使用ETag或添加Vary: Authorization

5.3 认证机制

  • 对敏感操作要求CSRF token
  • 确保Access-Control-Allow-Credentials: false时不会泄露敏感信息

6. 防御措施

6.1 开发者防御

  1. 严格审查CORS配置
  2. 实施适当的缓存控制策略
  3. 对敏感数据进行额外保护

6.2 用户防御

  1. 及时注销不使用的会话
  2. 定期清理浏览器缓存
  3. 警惕不明来源的网页请求

7. 总结

本漏洞展示了如何利用浏览器缓存机制绕过同源策略限制,关键在于:

  1. 目标API存在CORS配置不当
  2. 缺乏适当的缓存控制
  3. 敏感信息未得到充分保护

通过理解这些机制,开发者可以更好地保护Web应用免受此类攻击。

利用浏览器缓存绕过同源策略(SOP)限制的教学文档 1. 漏洞背景 1.1 目标系统介绍 Keybase.io是一个开源的跨平台即时通讯工具,特点包括: 支持macOS、Linux和Windows平台 提供Chrome/Firefox浏览器扩展 提供iOS和Android版本 采用端到端加密方式保护用户数据 承诺为群组、文件和聊天数据提供安全保护 1.2 漏洞涉及的技术 同源策略(SOP) : 浏览器安全机制,限制不同源的脚本交互 跨域资源共享(CORS) : 允许服务器声明哪些外部源可以访问资源 浏览器缓存机制 : 特别是ETag头的使用 2. 漏洞发现过程 2.1 目标API分析 Keybase提供了一个查询用户信息的API端点: 该API的CORS配置如下: 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 利用浏览器缓存 通过构造特殊请求,强制浏览器从缓存中读取先前认证过的响应: 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应用免受此类攻击。