逆向工程实战手册 第 99 章

第 99 章 浏览器持久化与客户端存储攻击

浏览器把"状态"存在各种存储里:Cookie、localStorage、sessionStorage、IndexedDB、Cache Storage、Service Worker。这些存储既是前端逆向的"证据源",也是攻击面(XSS 后的数据窃取/持久化劫持)。理解浏览器存储 = 理解"客户端会话"的攻防。

📍 知识点地图 | 主题:浏览器存储 | 前置:第13章 | 后续:— | 核心概念:Cookie/localStorage/IndexedDB/SW、缓存投毒

99.1 浏览器存储全景(先懂分层)

存储 特点 安全含义
Cookie 自动随请求发送,分 HttpOnly/Secure/SameSite 会话令牌(HttpOnly 防 JS 读)
localStorage 持久,JS 可读写,不随请求 敏感数据存放点(Token/缓存)
sessionStorage 标签页级,关闭即清 短期状态
IndexedDB 大容量结构化数据库 App 数据(消息/缓存/离线数据)
Cache Storage HTTP 响应缓存 缓存投毒/离线数据
Service Worker 后台拦截请求的脚本 中间人能力(最危险!)
WebSQL(废弃) 旧式 SQL 遗留数据
Cookie 属性(决定安全性):
  HttpOnly: JS 不可读(防 XSS 窃取)—— 但网络层仍可见
  Secure: 仅 HTTPS 发送
  SameSite: Lax/Strict(防 CSRF 跨站发送)
  Domain/Path: 作用范围(父域 Cookie 子域可读!)

攻击面:
  □ 子域 Cookie 投毒(父域 Cookie → 任意子域读写)
  □ XSS 窃取非 HttpOnly Cookie(第 58.3)
  □ 会话固定(登录前后 Cookie 不变)
  □ Cookie 预测/篡改(签名/加密缺失)

取证价值: Cookie 还原会话(登录态)

99.3 localStorage/sessionStorage 攻击面

为什么危险:
  □ 前端开发者常把 Token/用户信息放 localStorage(方便)
  □ XSS 一旦命中 → 直接读走(localStorage.getItem('token'))
  □ 无 HttpOnly 概念(纯 JS 存储)

攻击:
  XSS: localStorage.getItem('token') → 外带
  持久化 XSS: 数据存 localStorage → 每次页面加载执行

取证:
  localStorage 内容还原前端状态/离线数据

99.4 Service Worker(最危险的存储型攻击)

原理: 注册的 SW 脚本拦截页面所有请求(fetch 事件)
  → 可修改响应/缓存/重定向

攻击场景:
  1. 持久化 XSS: XSS 注入 SW 注册 → 即使 XSS 修复,SW 仍在
  2. 中间人: SW 修改所有 fetch 响应(注入脚本/伪造内容)
  3. 缓存投毒: 篡改 Cache Storage → 用户拿到恶意缓存
  4. 持久后门: SW 长期存活(更新困难)

防御: 严格 SW 作用域/注册校验 + 清除机制
检测: navigator.serviceWorker.getRegistrations()

99.5 浏览器存储取证(分析视角)

前端逆向(第 13 章)辅助:
  □ localStorage/IndexedDB 里的"状态"揭示业务逻辑
  □ Cache Storage 里的响应 = 接口数据的离线副本
  □ SW 脚本 = 前端逻辑的一部分(别忽略!)

取证场景:
  □ 自动化登录: 读取存储中的 Token 重放
  □ 会话还原: Cookie+localStorage 组合恢复登录态
  □ 数据恢复: IndexedDB 中的聊天/消息缓存

99.6 存储攻击利用链

链 1(XSS → 数据):
  XSS → localStorage/IndexedDB 读取 → 外带敏感数据

链 2(XSS → 持久控制):
  XSS → 注册恶意 Service Worker → 长期拦截/投毒

链 3(子域 → 会话):
  子域 XSS/上传 → 读父域 Cookie → 会话接管

链 4(缓存 → 投毒):
  Cache Storage 篡改 → 用户加载恶意缓存 → 钓鱼/窃取

99.7 检查清单

□ 存储盘点(Cookie/localStorage/IndexedDB/SW)
□ Cookie 属性审计(HttpOnly/Secure/SameSite)
□ localStorage 敏感数据定位
□ IndexedDB 数据浏览
□ Service Worker 注册检查
□ 子域 Cookie 范围评估
□ XSS 后利用(读取/持久化)
□ 取证: 存储内容还原

动手练习

  1. 用 DevTools 检查一个网站的全部存储(Cookie/localStorage/IndexedDB/SW),记录敏感项。
  2. 在练习环境模拟"XSS 读取 localStorage Token"的完整利用。
  3. 注册一个测试 Service Worker,体验它对请求的拦截能力。
  4. 分析一个应用的 Cookie 属性(HttpOnly/SameSite 配置),评估 XSS 后的窃取难度。

深入阅读

  • 仓库:CTF-Sandbox-Orchestrator/competition-browser-persistence/(浏览器持久化 CTF 子技能)
  • 仓库:CTF-Sandbox-Orchestrator/competition-browser-persistence/references/browser-persistence.md
  • 仓库:skills/js-reverse/(前端逆向联动)
  • 仓库:CTF-Sandbox-Orchestrator/competition-web-runtime/(Web 运行时)
  • 仓库:skills/browser-automation/(自动化读取存储)