第 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 | 遗留数据 |
99.2 Cookie 安全机制(会话攻防核心)
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 后利用(读取/持久化)
□ 取证: 存储内容还原
动手练习
- 用 DevTools 检查一个网站的全部存储(Cookie/localStorage/IndexedDB/SW),记录敏感项。
- 在练习环境模拟"XSS 读取 localStorage Token"的完整利用。
- 注册一个测试 Service Worker,体验它对请求的拦截能力。
- 分析一个应用的 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/(自动化读取存储)