CSRF的攻击、防御与挖掘
字数 1792 2025-08-15 21:30:29
CSRF攻击原理、防御与挖掘技术详解
1. CSRF基础概念
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种利用用户已认证身份在不知情的情况下执行非预期操作的攻击方式。
1.1 HTTP无状态特性
HTTP/HTTPS协议本身是无状态的,无法区分不同用户的请求。例如:
- 用户A和用户B同时访问同一个URL,服务器无法区分是谁发起的请求
- 在购物车场景中,需要区分不同用户的购物车内容
1.2 Cookie与Session机制
为解决无状态问题,发展出了Session+Cookie机制:
- 用户访问网站时,服务器分配唯一的session_id(如session_id=userA)
- session_id存储在浏览器的Cookie中
- 后续每次请求,浏览器自动在HTTP头中附加该Cookie
- 服务器通过session_id识别用户身份
2. CSRF攻击原理
2.1 攻击条件
CSRF攻击成功需要三个关键条件:
- 用户已登录目标网站,身份认证Cookie仍然有效
- 浏览器会自动在请求中附带目标网站的Cookie
- 目标网站完全依赖Cookie进行身份验证,没有二次验证机制
2.2 攻击示例
攻击流程:
- 用户A正常登录siteA,获得有效session_id存储在Cookie中
- 恶意用户userB构造一个siteA的恶意请求(如添加商品到购物车并付款)
- userB诱导userA访问该恶意链接(通过邮件、论坛等)
- userA点击链接后,浏览器自动附带siteA的Cookie发送请求
- siteA服务器验证Cookie有效,执行操作
2.3 CSRF与XSS的区别
| 特性 | CSRF | XSS |
|---|---|---|
| 目标 | 冒用用户身份执行操作 | 窃取用户数据/会话 |
| Cookie获取 | 无法获取用户Cookie | 可以获取用户Cookie |
| 危害程度 | 相对较低 | 相对较高 |
3. CSRF防御措施
3.1 用户自我保护
- 访问重要网站时,不随意点击不明链接
- 退出网站时主动清除Cookie
- 使用浏览器隐私模式进行敏感操作
3.2 开发者防御方案
3.2.1 验证码/密码
在敏感操作(如支付、转账)前要求用户:
- 输入验证码
- 输入支付密码
- 进行生物识别(指纹、面部识别)
原理:攻击者无法获取这些二次验证信息
3.2.2 双重Cookie验证
- 用户登录后,服务器下发身份Cookie
- 执行敏感操作时,服务器在响应中返回该Cookie值到表单隐藏字段
- 正常请求时,表单和Cookie中的值匹配
- 恶意请求只有Cookie值,没有或有不正确的表单值
实现示例:
<!-- 正常表单 -->
<form action="/purchase" method="POST">
<input type="hidden" name="csrf_token" value="userA_cookie_value">
<!-- 其他表单字段 -->
</form>
3.2.3 CSRF Token
- 服务器生成唯一Token(包含用户标识、时间戳、有效期等信息)
- Token存储在表单隐藏字段或自定义HTTP头中
- 每次请求验证Token有效性
Django实现示例:
# 中间件中自动添加CSRF Token
'django.middleware.csrf.CsrfViewMiddleware'
# 模板中
<form method="post">
{% csrf_token %}
<!-- 表单内容 -->
</form>
3.2.4 SameSite Cookie属性
设置Cookie的SameSite属性:
SameSite=Strict:完全禁止跨站发送CookieSameSite=Lax:宽松模式,允许部分安全跨站请求
示例:
Set-Cookie: sessionid=userA; SameSite=Lax; Secure; HttpOnly
4. CSRF漏洞挖掘
4.1 测试点
- 所有表单提交点
- 所有GET请求修改数据的接口
- 状态修改操作(如密码修改、邮箱绑定)
4.2 测试方法
- 检查请求是否缺少:
- CSRF Token
- 验证码
- 二次身份验证
- 构造恶意请求测试:
- 使用其他域页面发起跨站请求
- 验证是否仅凭Cookie就能完成操作
4.3 自动化工具
- Burp Suite的CSRF PoC生成器
- OWASP ZAP
- CSRFTester
5. 最佳实践建议
- 敏感操作必须使用POST方法
- 重要操作必须加入二次验证
- 全局防御使用CSRF Token
- Cookie安全设置HttpOnly和Secure标志
- API设计RESTful API应使用自定义头部而非Cookie
6. 总结
CSRF攻击利用的是Web应用的信任机制和浏览器的自动行为。有效的防御需要结合多种技术手段,从验证机制、Cookie安全和请求验证多个层面构建防护体系。开发者应当将CSRF防护作为Web应用安全的基础要求,在系统设计阶段就予以考虑。