# CSRF 跨站请求伪造:借刀杀人之术|红蓝对抗视角
> 一句话核心:**利用用户当前浏览器的登录态,诱导用户在已登录状态下,无意识发起非预期请求,在目标网站执行操作;攻击者拿不到Cookie,只是借用浏览器自带的身份。**
> 类比(借刀杀人):你已经登录了银行网站,攻击者给你一张图片,你点开一瞬间,浏览器自动带着你的银行Cookie提交转账请求;网站分不清这个请求是用户主动操作还是被诱导触发。
## 一、原理拆解
1. 用户A登录业务网站`xxx.com`,浏览器保存登录Cookie(会话凭证)。
2. Cookie特性:**访问xxx.com时,浏览器自动带上对应域名Cookie**。
3. 攻击者构造恶意页面,嵌入自动提交的表单/图片/JS。
4. 用户A访问恶意页面 → 浏览器自动发起对`xxx.com`的请求,**自动带上A的Cookie**。
5. 服务端收到请求,校验Cookie有效,认为是用户本人操作,执行请求对应的业务动作。
> ✅关键区分(演练高频考点)
> - CSRF:**不能读取返回内容,只能发起请求**;拿不到Cookie、拿不到页面数据,只能执行操作(改密码、添加管理员、下单)
> - XSS跨站脚本:可以读取Cookie、读取页面内容,权限更强。
> 一句话:XSS是偷你的凭证;CSRF是借用你已有的登录身份发请求。
## 二、利用条件(缺一不可)
1. 目标网站**仅依靠Cookie做身份认证**,没有额外校验手段。
2. 存在可执行动作的接口(修改密码、新增账号、后台配置、转账)。
3. 接口操作**仅用GET/POST参数执行,没有CSRF Token、验证码、二次确认**。
4. 受害者处于**已登录状态**,且访问攻击者构造的恶意页面。
## 三、常见Payload形式
### 1. GET型CSRF(最简单,图片标签触发)
```html

```
用户打开包含这行代码的网页,浏览器自动请求这个地址,携带Cookie。
### 2. POST型CSRF(自动提交表单)
```html
```
页面加载自动提交POST表单。
> 限制:不能跨域读取接口响应结果,只能发送请求。
## 四、攻击链路
1. 红队寻找业务接口:后台增删改接口,测试是否存在CSRF
2. 验证:接口是否只依赖Cookie,无token校验
3. 构造恶意HTML页面(攻击载体)
4. 诱导已登录管理员访问页面(邮件、聊天消息)
5. 浏览器自动发起请求,服务端执行操作(新增管理员、修改配置)
6. 完成攻击,全程攻击者无法获取Cookie,仅借用用户会话
## 五、蓝队检测与识别
### 审计方法
抓包观察关键业务请求:
- 请求头是否携带`X-CSRF-Token`、`anti-csrf-token`等随机令牌
- 敏感操作是否有验证码、二次弹窗确认
- 校验请求来源:`Referer`、`Origin`头
### 日志特征
- 正常业务:敏感操作请求来源是本站页面
- CSRF攻击:请求Origin/Referer为外部恶意网站域名
> 注意:部分浏览器支持**剥离Referer头**,仅靠Referer防护不牢靠。
## 六、防御方案(优先级从高到低)
1. **CSRF Token(最标准方案)**
敏感接口每次请求附带服务端生成的随机token,放在表单/请求头,和session绑定;攻击者无法获取这个随机值,无法构造请求。
2. **校验Origin / Referer请求头**
校验请求来源域名,拒绝外部域发起的请求;作为辅助手段,不可单独依赖。
3. **敏感操作增加二次验证**
验证码、短信验证、弹窗确认。
4. **Cookie设置 SameSite 属性(现代浏览器防御)**
`SameSite=Strict` / `Lax`,限制跨站场景下自动携带Cookie。
```
Set-Cookie: JSESSIONID=xxxx; SameSite=Lax; HttpOnly
```
> SameSite是浏览器层面防护,老浏览器不支持,不能替代Token。
## 七、实战踩坑
1. HttpOnly Cookie **不防CSRF**!HttpOnly是防止XSS读取Cookie,CSRF不需要读取Cookie,浏览器自动携带。(极易混淆的坑!)
2. 很多人误以为POST不能CSRF,POST型CSRF非常常见,只是需要自动提交表单。
3. CSRF无法拿到返回数据,**不能直接读取页面内容**,只能执行操作;想拿数据需要搭配其他漏洞。
## 一句话速记
CSRF = 借用户浏览器已登录的Cookie自动发起跨站请求;**只执行操作,无法窃取Cookie和页面数据;核心防御是CSRF Token**。
---
下一章:**XSS跨站脚本:前端代码注入,窃取会话与钓鱼**,继续吗?