课程笔记:XSS 跨站脚本攻击
课程名称:计算机网络应用 核心摘要:本讲介绍 OWASP Top 10 中排名第七的 XSS(跨站脚本攻击)。重点讲解 XSS 的命名由来、攻击原理(数据与代码混淆)、典型攻击场景(弹窗、流量劫持、恶意跳转、窃取 Cookie/Session)及演示案例,并从宏观层面给出输入校验、输出转义、标签属性选型等防护思路。
一、 核心概念与原理
- XSS(Cross-Site Scripting,跨站脚本攻击):攻击者向 Web 页面中注入恶意
script脚本代码,当用户浏览该页面时,恶意脚本被执行,从而实现窃取 Cookie、窃取数据、恶意跳转等攻击行为。 - 命名由来:原本应缩写为 CSS(Cross-Site Scripting),但为避免与层叠样式表 CSS(Cascading Style Sheets) 混淆,故改称 XSS。
- OWASP Top 10 排名:在 2017 年 OWASP Top 10 中位列 第 7 名。排名靠后不代表攻击性弱,其共性(通用性)强、分类多、场景复杂、防护困难。
- 攻击场景:广泛存在于各类 Web 项目中(Java Web、PHP、ASP 等均可能发生),本课以 Java Web 为主进行讲解。
- 历史背景:早期 XSS 多为跨域攻击,故称"跨站脚本";如今 JavaScript 功能强大,是否跨域已不影响攻击效果,但因历史原因仍沿用"跨站脚本攻击"这一名称。
- 本质原理:Web 应用程序混淆了用户提交的数据与 JavaScript 脚本代码——本期望用户输入的是数据,攻击者却输入了代码,而系统将输入的代码当作代码执行。
- 危害定位:长期以来被视为客户端 Web 安全中的头号大敌,破坏力大、产生场景复杂,需分场景具体问题具体分析地进行防护。
二、 技术细节与协议分析
1. XSS 攻击能力一览
| 攻击行为 | 说明 |
|---|---|
| 窃取 Cookie | 登录的 Session 信息通常存储在 Cookie 中,泄露后可冒充用户身份 |
| 窃取数据 | 通过脚本读取页面或用户敏感数据 |
| 恶意跳转 | 通过修改 window.location.href 跳转至钓鱼站点 |
| 流量劫持 | 将本应访问目标地址的流量引导至恶意地址 |
| 弹窗探测 | 通过 alert 弹出信息(如 Cookie、Session)做攻击探测 |
原则:只要 script 能干什么,XSS 就能干什么。
2. 演示案例:留言/报名系统
系统构成(数据存储于 MySQL 数据库 message 表):
| 模块 | 说明 |
|---|---|
| 报名留言窗口 | 用户录入手机号、姓名等,写入数据库 |
| 数据展示页面 | 后台/销售人员登录后查看报名数据(含 id、content、时间) |
正常数据(如手机号 188677050、188677051、床前明月光)留言与展示均无问题。
3. 三种典型 Payload 演示
| 攻击方式 | Payload 示例 | 效果 |
|---|---|---|
| 弹窗注入 | <script>alert('you are...')</script> | 留言后刷新页面即弹出对话框 |
| 恶意跳转 | <script>window.location.href='https://www.baidu.com'</script> | 刷新页面后自动跳转至目标站点(演示为百度,实战可指向钓鱼站) |
| 标签事件注入 | <img src="a.png" onerror="alert('attack')"> | 图片 src 不存在触发 onerror 事件,执行弹窗脚本 |
演示中植入弹窗即可证明漏洞存在;能弹窗就能弹 Cookie、弹 Session,隐私信息面临严重风险。
4. 攻击流程
攻击者构造恶意 Payload
↓
提交到 Web 应用输入点(留言框/表单)
↓
数据写入数据库 / 临时存储
↓
受害用户浏览展示页面
↓
浏览器将恶意数据当作脚本执行
↓
窃取 Cookie / 跳转 / 流量劫持
三、 实践应用与配置命令
1. 演示用 SQL 操作(清理恶意数据)
-- 查询留言表中所有记录
SELECT * FROM message;
-- 删除注入的恶意数据(根据实际 id 删除)
-- DELETE FROM message WHERE id = ?;
2. 宏观防护思路(输入 / 输出双向控制)
输入环节:
- 对用户输入做校验(输入验证 / Input Validation)
- 对特殊字符做转义(转移 / Encoding)
- 直接禁用危险标签或属性
输出环节:
- 输出时进行转义、过滤,避免数据被当作代码执行
标签/属性选型:
- 避免使用 innerHTML(会将字符串解析为 HTML,存在 XSS 风险)
- 改用 innerText(将内容作为纯文本处理,不解析标签)
| 环节 | 措施 | 关键词 |
|---|---|---|
| 输入 | 校验、转义、禁用危险标签 | 输入验证 |
| 输出 | 转义、过滤 | 输出编码 |
| 标签 | innerHTML → innerText | DOM 操作 |
四、 重点与难点提示
- 易混点:XSS 缩写来自 Cross-Site Scripting,而非"X 开头 + 两个 S 开头"的单词;改称 XSS 是为了与 CSS(层叠样式表)区分。
- 考点:XSS 在 OWASP Top 10(2017)中排名 第 7;本质是数据与代码混淆。
- 核心原理:Web 应用混淆了用户提交的数据与 JS 脚本代码,把本应是数据的内容当作代码执行。
- 典型 Payload:
<script>alert(...)</script>、window.location.href=...、<img src=x onerror=...>。 - 危害能力:窃取 Cookie/Session、窃取数据、恶意跳转、流量劫持——script 能做的 XSS 都能做。
- 防护难点:场景复杂多样,无法一次性解决,需分场景具体问题具体分析。
- 防护要点:输入校验 + 输出转义 + 选用
innerText替代innerHTML。 - 面试题:简述 XSS 的原理、分类与防御手段;为何 XSS 不叫 CSS?
五、 课后疑问/遗留问题
- 本讲仅演示了基础的弹窗与跳转攻击,更复杂的攻击手法将在后续课程展开。
- XSS 的多种分类(存储型 / 反射型 / DOM 型)尚未详细讲解,留待后续课程补充。
- 实际项目中如何结合框架(如 Java Web)进行输入校验与输出编码的具体实现,有待后续实践。
HttpOnly属性在防御 Cookie 窃取中的作用,留待后续防护章节深入。