📌 引言:为什么你的账号会"自动"转账?
当用户访问恶意网站时,竟能神不知鬼不觉地完成社交账号绑定、银行转账等操作——这就是CSRF(跨站请求伪造)的可怕之处。本文将用黑客视角+开发者防御思维,深度解析这种位列OWASP Top 10的经典漏洞。
一、CSRF攻击原理深度剖析
1.1 攻击三要素
用户已登录目标网站
用户访问恶意页面
恶意页面发送伪造请求
目标网站执行危险操作
1.2 关键攻击条件
-
请求可预测(参数无随机性)
-
浏览器自动携带身份凭证(Cookie/Session)
-
目标操作无二次验证
1.3 与XSS的区别
| 特征 | CSRF | XSS |
|---|---|---|
| 攻击方向 | 跨站请求伪造 | 跨站脚本注入 |
| 利用方式 | 利用用户登录态 | 窃取用户数据 |
| 防御重点 | 请求合法性校验 | 输入输出过滤 |
二、4种典型攻击场景复现
2.1 GET型攻击(银行转账案例)
<!-- 恶意页面代码 --> <img src="http://bank.com/transfer?to=hacker&amount=10000" width="0" height="0">
2.2 POST型攻击(修改邮箱案例)
<form id="csrfForm" action="http://social.com/change_email" method="POST">
<input type="hidden" name="email" value="hacker@evil.com">
</form>
<script>document.getElementById('csrfForm').submit();</script>
2.3 JSON API攻击(结合CORS漏洞)
// 利用CORS错误配置发送请求
fetch('http://api.example.com/update_profile', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({is_admin: true}),
credentials: 'include'
});
2.4 文件上传攻击(结合XSS)
<input type="file" name="avatar" onchange="upload()">
<script>
function upload() {
var form = new FormData();
form.append('file', this.files[0]);
fetch('http://target.com/upload', {
method: 'POST',
body: form,
credentials: 'include'
});
}
</script>
三、5大防御方案与代码实现
3.1 CSRF Token方案(Django示例)
# settings.py
MIDDLEWARE = [
'django.middleware.csrf.CsrfViewMiddleware'
]
# 模板中插入Token
<form method="post">
{% csrf_token %}
<!-- 表单内容 -->
</form>
# 视图层验证
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def transfer(request):
# 业务逻辑
3.2 SameSite Cookie属性
// Spring Boot配置
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer serializer = new DefaultCookieSerializer();
serializer.setSameSite("Strict");
return serializer;
}
3.3 双重提交Cookie验证
// 前端生成Token并写入Cookie和请求头
const token = generateRandomToken();
document.cookie = `CSRF-TOKEN=${token}; Path=/; Secure`;
axios.defaults.headers.common['X-CSRF-TOKEN'] = token;
3.4 关键操作二次验证
<!-- 转账前的密码确认 --> <input type="password" name="confirm_password" required>
3.5 防御方案对比
| 方案 | 防御强度 | 实现复杂度 | 适用场景 |
|---|---|---|---|
| CSRF Token | ★★★★★ | 中 | Web表单提交 |
| SameSite Cookie | ★★★★☆ | 低 | 现代浏览器环境 |
| 二次验证 | ★★★★★ | 高 | 金融等高敏感操作 |
四、渗透测试实战:如何检测CSRF漏洞?
4.1 手工测试步骤
-
抓取目标请求(Burp Suite)
-
移除CSRF Token参数
-
重放请求观察响应
4.2 自动化工具使用
# 使用OWASP ZAP进行扫描 zap-cli quick-scan -s xss,sqli,csrf http://example.com
4.3 漏洞修复验证
POST /change_password HTTP/1.1 Host: example.com Cookie: sessionid=xyz123 Content-Type: application/x-www-form-urlencoded new_password=hacked&csrf_token=missing # 预期返回403错误
🔚 总结:CSRF防御架构设计
| 安全层级 | 防御措施 | 实施要点 |
|---|---|---|
| 客户端 | SameSite Cookie | 设置Strict/Lax模式 |
| 服务端 | CSRF Token+校验 | 随机化+绑定会话 |
| 业务逻辑 | 敏感操作二次验证 | 密码/短信验证码 |
| 监控 | 异常请求报警 | 检测缺失Token的请求 |
安全箴言:
"没有绝对的安全,只有分层的防御体系。" —— 匿名安全工程师
📚 扩展阅读
-
RFC 6265 - HTTP状态管理机制
302

被折叠的 条评论
为什么被折叠?



