安服水洞系列|04. CSRF
字数 1554 2025-08-11 08:36:07
CSRF漏洞详解与防御指南
1. CSRF概述
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种利用受害者在已登录目标网站的情况下,通过该网站的权限执行恶意操作的攻击方式。
1.1 基本概念
- 攻击者诱骗受害者浏览器发送伪造请求
- 利用受害者在目标网站的已认证状态
- 可执行如修改密码、删除数据等恶意操作
1.2 危害程度
- 危害范围从轻微到严重不等
- 高级利用案例:内网穿透、RCE(如phpstudy漏洞)
- 但部分厂商在众测中可能不接受CSRF或轻微危害的CSRF报告
2. CSRF攻击原理
2.1 攻击流程
- 用户登录并保持目标网站会话
- 用户访问恶意网站或点击恶意链接
- 恶意代码构造并发送伪造请求
- 目标网站服务器误认为是用户合法请求并执行
2.2 浏览器Cookie策略
- 自2021年起,Chrome默认应用SameSite=Lax策略
- 示例:
Set-Cookie: session=0F8tgdOhi9ynR1M9wa3ODa; SameSite=Lax - Lax策略影响:
- 允许跨站点GET请求携带Cookie
- 阻止跨站点POST请求携带Cookie
3. CSRF漏洞检测
3.1 检测方法
-
检查请求中是否存在防护机制:
- Token验证
- Referer检查
- 验证码
-
测试步骤:
- 对于GET请求:直接构造URL测试
- 对于POST请求:
- 尝试去掉Referer头重新提交
- 使用不同浏览器测试(因SameSite策略实现可能不同)
3.2 检测工具
- Burp Suite:可生成CSRF PoC
- CSRFTester
- CSRF Request Builder
- XSRFProbe(GitHub项目)
4. CSRF攻击构造
4.1 基本攻击方式
- 构造恶意HTML表单自动提交
- 使用img标签触发GET请求
- 使用iframe隐藏操作
4.2 JSON CSRF示例
<html>
<body>
<script>
function submitRequest() {
var xhr = new XMLHttpRequest();
xhr.open("POST", "https://www.xxxxx.com/simauth/app/updateAppInfo", true);
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");
xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
xhr.withCredentials = true;
xhr.send(JSON.stringify({"appId":"300016001555","appName":"0xdawn"}));
}
</script>
<form action="#">
<input type="button" value="Submit request" onclick="submitRequest()">
</form>
</body>
</html>
4.3 漏洞挖掘思路
- 重点关注可提交数据的功能点,特别是:
- 上传图片功能
- 可自由构建URL的接口
- 检查关键操作(如密码修改、数据删除)是否缺乏防护
5. CSRF防御措施
5.1 主要防御方法
-
Token验证
- 在请求中加入随机生成的token
- 服务器端验证token有效性
- 推荐使用同步器令牌模式
-
验证码
- 关键操作要求输入验证码
- 有效阻断自动化CSRF攻击
-
Referer检查
- 验证请求来源是否为合法域名
- 但可能被绕过(如某些浏览器隐私模式)
-
SameSite Cookie属性
- 设置
SameSite=Strict或SameSite=Lax - Strict最严格,完全禁止跨站携带Cookie
- 设置
-
自定义HTTP头
- 添加并验证自定义头(X-Requested-With等)
- 因为浏览器同源策略限制跨域自定义头
5.2 进阶防御
-
双重提交Cookie
- token同时存在于Cookie和请求参数中
- 服务器比较两者是否一致
-
用户交互验证
- 关键操作前要求重新输入密码
- 增加攻击难度
-
操作延时
- 敏感操作设置执行延时
- 提供撤销操作的时间窗口
6. 开发注意事项
- 不要依赖单一防御机制:采用多层次防御
- GET请求安全:确保GET请求不修改数据(遵循REST规范)
- 关键操作防护:对修改密码、转账等操作特别加强防护
- 定期审计:检查防护机制是否被绕过
7. 进阶学习资源
- CSRF进阶知识
- OWASP CSRF防护指南
- 各语言框架的CSRF防护模块文档
8. 总结
CSRF是一种常见但危害可大可小的Web安全漏洞。随着浏览器安全策略的演进(如SameSite Cookie),部分传统的CSRF攻击方式已失效,但攻击者也在不断寻找新的绕过方法。开发者应当理解CSRF原理,实施多层次防御,并定期检查防护措施的有效性。