CSRF 核心原理与攻击模型
CSRF 核心原理与攻击模型
1. 攻击本质
CSRF 利用用户浏览器的 “信任状态”(已登录目标网站),通过诱导用户访问恶意页面,使其浏览器自动向目标网站发送用户本无意发起的请求。核心逻辑是:攻击者不直接获取用户凭证,而是利用浏览器自动携带 Cookie 的机制。
2. 攻击三要素
- 用户已登录目标网站:Cookie 有效且未过期。
- 浏览器自动携带 Cookie:同源策略下,跨域请求仍会附加目标网站 Cookie。
- 目标网站未验证请求来源:未校验 CSRF 令牌、Referer 或 Origin 头。
3. 典型攻击流程
登录目标网站返回Cookie构造恶意页面访问恶意页面,执行自动请求执行恶意操作(如转账)用户目标服务器攻击者用户浏览器攻击成功
二、攻击技术深度解析
1. 攻击类型与 Payload 构造
| 类型 | 技术实现 | 示例代码 |
|---|---|---|
| GET 型 | 通过 URL 参数触发敏感操作(如/transfer?to=attacker&amount=1000) |
<img src="https://bank.com/transfer?to=attacker&amount=1000"> |
| POST 型 | 通过自动提交的表单触发(如隐藏表单 + JavaScript 自动提交) | <form action="https://bank.com/transfer" method="POST"> <input type="hidden" name="to" value="attacker"> <input type="hidden" name="amount" value="1000"> </form> <script>document.forms[0].submit();</script> |
| AJAX 型 | 通过fetch或XMLHttpRequest发起跨域请求(需绕过 CORS) |
fetch('https://bank.com/transfer', { method: 'POST', body: 'to=attacker&amount=1000', credentials: 'include' }); |
| 点击劫持 | 通过透明 iframe 覆盖合法按钮,诱导用户点击触发请求(如钓鱼页面) | <iframe src="https://bank.com/transfer" style="opacity:0; width:100%; height:100%"></iframe> |
2. 绕过防御的核心技巧
| 防御机制 | 绕过方法 | 技术细节 |
|---|---|---|
| CSRF 令牌 | 删除令牌、使用旧令牌、跨用户复用令牌 | 测试删除请求中的csrf_token参数,观察服务器是否接受请求。若令牌未绑定会话,可尝试用其他用户的有效令牌。 |
| Referer 校验 | 伪造 Referer 为目标子域名(如https://attacker.target.com)、删除 Referer 头 |
在请求中设置Referer: https://target.com,或使用data:text/html协议发送请求。 |
| SameSite Cookie | 利用SameSite=Lax允许跨域 GET 请求携带 Cookie(如跳转攻击) |
构造<a href="https://target.com/transfer">链接,用户点击后触发 GET 请求。 |
| 双重提交 Cookie | 通过会话固定技术设置伪造的 Cookie 令牌 | 1. 诱导用户访问攻击者页面,设置Cookie: CSRF_TOKEN=FAKE;2. 发送请求时携带CSRF_TOKEN=FAKE。 |
三、红队实战全流程
1. 信息收集与漏洞初筛
枚举敏感端点
- 使用 Burp Suite 的 Target 模块爬取所有表单提交 URL(如
/user/change-password、/api/order/submit)。 - 重点关注
POST、PUT、DELETE等修改状态的请求。
- 使用 Burp Suite 的 Target 模块爬取所有表单提交 URL(如
自动化扫描
配置 Burp Suite 的 CSRF 扫描器,测试每个端点是否缺少令牌或令牌可重复使用。
使用自定义脚本批量发送跨域请求:
import requests url = "https://target.com/transfer" headers = {"Referer": "https://attacker.com"} data = {"to": "attacker", "amount": 1000} response = requests.post(url, data=data, headers=headers, cookies=user_cookies) if "成功" in response.text: print("CSRF漏洞存在!")
2. 手动验证与深度测试
令牌有效性测试
- 删除请求中的
csrf_token参数,观察是否仍能执行操作。 - 测试令牌是否可预测(如时间戳、固定值)。
- 删除请求中的
Referer 欺骗
- 修改
Referer为攻击者域名(如https://attacker.com),检查服务器是否拒绝请求。
- 修改
跨域请求伪造
创建恶意 HTML 页面,部署到攻击者服务器,诱导用户访问:
html
<form action="https://target.com/transfer" method="POST"> <input type="hidden" name="to" value="attacker"> <input type="hidden" name="amount" value="1000"> </form> <script>document.forms[0].submit();</script>
3. 高价值攻击场景
| 场景类型 | 攻击目标 | 技术要点 |
|---|---|---|
| 资金操作 | 转账、支付、提现 | 优先测试金额参数是否可篡改(如负数、超限值)。 |
| 权限提升 | 添加管理员、修改用户角色 | 测试role参数是否可修改为admin。 |
| 数据破坏 | 删除文章、清空数据库 | 利用 CSRF 触发批量删除接口。 |
| 会话固定 | 控制用户会话(结合钓鱼) | 1. 发送伪造的Set-Cookie头;2. 诱导用户登录。 |
四、防御体系构建与漏洞修复
1. 防御措施对比
| 防御手段 | 实现方式 | 效果评级 | 兼容性 |
|---|---|---|---|
| CSRF 令牌 | 在表单中嵌入随机令牌,服务器校验令牌有效性 | ★★★★★ | 全兼容 |
| Referer 校验 | 验证请求来源是否为同源(如Referer: https://target.com) |
★★★☆☆ | 旧浏览器可能不支持 |
| SameSite Cookie | 设置SameSite=Lax/Strict限制跨域 Cookie 携带 |
★★★★☆ | Chrome 80 + 默认启用 |
| 验证码 | 对高风险操作添加验证码(如转账时输入短信验证码) | ★★★★★ | 影响用户体验 |
2. 漏洞修复示例
PHP 设置 CSRF 令牌
// 生成令牌 $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); // 输出到表单 echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">'; // 验证 if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die("CSRF攻击检测!"); }Node.js 校验 Referer
const referer = req.headers.referer; if (!referer.startsWith('https://target.com')) { res.status(403).send('请求来源非法'); }
五、工具链与资源推荐
1. 自动化工具
| 工具名称 | 功能描述 | 官网链接 |
|---|---|---|
| Burp Suite | 抓包、扫描、生成 CSRF POC | https://portswigger.net/burp |
| OWASP ZAP | 自动化扫描、代理测试 | https://www.zaproxy.org/ |
| CSRF PoC Generator | 在线生成恶意表单 | https://www.csrfmonkey.org/ |
2. 学习资源
- OWASP CSRF Prevention Cheat Sheet:https://owasp.org/www-community/attacks/csrf
- CSRF 实战靶场:https://portswigger.net/web-security/csrf/lab-token-validation
- CTF 案例:https://github.com/ctfs/write-ups/blob/master/2025/hacklu-ctf-2025/csrf-to-xss-chain.md
六、高阶技巧与攻击链组合
1. CSRF + XSS 联动攻击
- XSS 窃取 CSRF 令牌
- 通过 XSS 漏洞获取目标页面的 CSRF 令牌,构造合法请求。
- CSRF 触发 XSS
- 利用 CSRF 漏洞上传恶意脚本(如 HTML 文件),触发存储型 XSS。
2. 绕过 SameSite=Lax
利用预加载请求
<link rel="prerender" href="https://target.com/transfer?to=attacker&amount=1000">
3. 防御绕过案例
- 场景:某银行网站仅校验
Referer的域名前缀。 - 绕过:构造
Referer: https://target.com.attacker.com,绕过正则表达式校验。
七、总结与防御建议
CSRF 攻击的核心是利用用户浏览器的自动请求机制,而防御的关键在于验证请求来源的合法性。红队实战中,应优先攻击高价值端点,结合自动化工具与手动验证,同时注意绕过现代浏览器的安全机制(如 SameSite Cookie)。开发人员需实施多层防御,包括 CSRF 令牌、Referer 校验和验证码,以降低攻击风险。
