[Web安全-CSRF漏洞]
字数 2322 2025-08-11 22:57:21
CSRF漏洞详解与防御指南
1. CSRF基础概念
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种严重的Web安全漏洞,攻击者利用受害者已登录的身份,在受害者不知情的情况下执行非预期的操作。
1.1 CSRF攻击原理
- 攻击者盗用用户身份,以用户名义发送恶意请求
- 对服务器来说请求完全合法,因为携带了用户的合法凭证
- 可执行的操作包括:发送邮件、发消息、账号盗取、添加管理员、购买商品、转账等
2. CSRF攻击类型
2.1 GET型CSRF
攻击场景:
- 网站功能通过GET请求实现(如修改邮箱)
- 示例URL:
/user.php?id=1&email=123@163.com - 攻击者构造恶意URL:
/user.php?id=1&email=abc@163.com - 诱导用户点击后,用户邮箱被修改
特点:
- 利用简单,只需诱导用户点击链接
- 适用于通过GET请求修改数据的场景
2.2 POST型CSRF
攻击场景:
- 网站功能通过POST表单提交实现(如购买视频)
- 攻击者构造自动提交表单的恶意页面:
<form action=/coures/user/handler/25332/buy method=POST>
<input type="text" name="xx" value="xx" />
</form>
<script>document.forms[0].submit();</script>
- 用户访问后表单自动提交,完成非预期操作(如扣除余额购买视频)
特点:
- 需要构造包含表单的页面
- 利用JavaScript自动提交表单
- 适用于通过POST请求执行操作的场景
3. CSRF攻击实例分析
银行转账案例
-
正常流程:
- Bob登录银行网站
- 发送请求:
http://bank.example/withdraw?account=bob&amount=1000000&for=bob2 - 服务器验证session后执行转账
-
攻击流程:
- 黑客Mallory构造恶意页面包含:``
- 诱使Bob访问该页面
- 若Bob刚登录银行且session未过期,请求会附带cookie发送
- 服务器验证通过,执行转账
-
攻击特点:
- 受害者完全不知情
- 日志中显示为合法请求
- 难以追踪攻击者
4. CSRF防御措施
4.1 验证HTTP Referer字段
原理:
- 检查请求头中的Referer字段
- 只允许来自同域名的请求
实现:
- 拦截器检查Referer是否以
bank.example开头 - 非本域请求视为CSRF攻击并拒绝
优缺点:
- 优点:实现简单,无需修改现有逻辑
- 缺点:
- 浏览器Referer实现不一致
- IE6/FF2等浏览器可篡改Referer
- 用户可能禁用Referer导致误判
- 隐私泄露风险
4.2 Anti-CSRF Token
原理:
- 在请求中添加不可伪造的token
- token不存储在cookie中
- 服务器验证token有效性
实现方式:
- GET请求:URL后附加token
http://url?csrftoken=tokenvalue - POST请求:表单中添加隐藏字段
<input type="hidden" name="csrftoken" value="tokenvalue">
增强措施:
- 页面加载时JavaScript自动为所有a/form标签添加token
- 动态生成内容需手动添加token
- 外链不加token防止泄露
优缺点:
- 优点:比Referer更安全
- 缺点:
- 实现复杂,容易遗漏
- token可能通过Referer泄露
- 动态内容处理困难
4.3 自定义HTTP头验证
原理:
- 将token放入自定义HTTP头(如X-CSRFToken)
- 通过XMLHttpRequest发送
实现:
// 设置全局AJAX头
$.ajaxSetup({
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
});
优缺点:
- 优点:
- token不会通过URL泄露
- 不受Referer限制
- 缺点:
- 仅适用于AJAX请求
- 需重写前端代码
- 浏览器功能(前进/后退)受限
5. CSRF漏洞挖掘方法
5.1 手工测试
- 抓取正常请求数据包
- 无Referer和token → 极可能存在CSRF
- 测试Referer检查
- 去掉Referer后提交仍有效 → 存在CSRF
- 检查token机制
- 修改/删除token后请求仍有效 → 存在CSRF
5.2 工具测试
- CSRFTester:
- 抓取浏览器所有链接和表单
- 修改表单数据重新提交
- 成功则存在漏洞
- CSRF Request Builder:
- 专门用于CSRF检测
- 可生成攻击POC
6. 使用Burp Suite生成CSRF POC
6.1 攻击流程
- 目标:
192.168.61.1 - 攻击机:
192.168.61.132 - 步骤:
- 登录目标网站抓取修改信息的包
- Burp中:Engagement tools → Generate CSRF PoC
- 复制HTML代码到攻击机
- 发送恶意链接给目标:
http://192.168.61.132/1.html - 目标点击后信息被修改
6.2 Burp操作详解
- 拦截目标请求
- 右键选择"Engagement tools" → "Generate CSRF PoC"
- 调整POC选项(自动提交/表单样式等)
- 复制生成的HTML代码
- 在攻击服务器上托管该页面
- 通过钓鱼等方式诱导目标访问
7. 最佳防御实践
-
关键操作防护:
- 重要操作(如转账、改密)使用POST
- 结合token和Referer检查
- 增加二次验证(短信/邮件确认)
-
token设计原则:
- 足够随机,不可预测
- 绑定用户session
- 设置合理有效期
- 每个表单独立token
-
架构层面:
- 敏感操作使用专用接口
- 限制关键接口的调用频率
- 记录完整操作日志
-
补充措施:
- 设置SameSite cookie属性
- 重要操作验证原始密码
- 实施操作确认机制
通过综合运用以上防御措施,可有效防范CSRF攻击,保护Web应用和用户数据安全。