文章目录
CSRF漏洞的原理、利用方式和防范措施
一、原理
1. 定义与触发条件
CSRF(跨站请求伪造) 是一种利用用户已登录的会话状态,伪造合法请求执行恶意操作的漏洞。其核心触发条件包括:
- 会话保持:用户未退出目标网站(如银行、社交平台)的登录状态。
- 无二次验证:关键操作(如转账、修改密码)未校验请求来源或用户身份(如Token、验证码)。
- 请求可预测:攻击者能构造包含敏感参数的请求(如
user=attacker&money=10000
)。
2. 攻击链流程图
二、利用方式
1. 攻击手法与分类
(1) 站外CSRF
-
形式:攻击者通过钓鱼邮件、论坛链接诱导用户点击恶意URL。
-
示例:
<img src="http://bank.com/transfer?to=attacker&amount=10000" width="0" height="0">
(用户访问含此代码的页面时,自动发起转账请求)
(2) 站内CSRF
-
形式:利用站内功能(如评论区)嵌入恶意请求。
-
示例:Discuz论坛管理员点击含恶意图片的帖子,触发数据库备份操作:
<img src="http://forum.com/admin/backup?dir=hack&filename=data.sql">
(3) 组合攻击(CSRF+XSS)
-
形式:通过存储型XSS注入CSRF攻击代码,实现自动化攻击。
-
示例:
<script> fetch("http://bank.com/transfer?to=attacker&amount=10000", {credentials: "include"}); </script>
2. 靶场案例
使用 Discuz、DVWA 做实验。
- Discuz拖库攻击
- 漏洞:管理员点击含恶意备份请求的帖子,触发数据库导出操作。
- 影响:攻击者获取论坛全部用户数据,包括密码哈希和敏感信息。
- 修复:Discuz后续版本强制校验管理员操作来源(Referer+Token)。
- DVWA密码篡改
- 漏洞:低安全级别下,直接通过URL修改密码(如
/csrf?password_new=123&password_conf=123
)。 - 影响:攻击者无需原密码即可重置管理员密码。
- 修复:高安全级别引入Token验证(每次请求生成随机值)。
- 漏洞:低安全级别下,直接通过URL修改密码(如
3. 检测工具与流程
-
工具:
- Burp Suite:拦截请求并移除
Referer
头,验证请求是否仍有效。 - CSRFTester:生成恶意请求模板,测试服务器响应。
- OWASP ZAP:自动化扫描CSRF漏洞,支持自定义规则。
- Burp Suite:拦截请求并移除
-
手动检测:
1. 抓取正常请求(如修改密码)。 2. 移除`Referer`和`Token`参数,重放请求。 3. 若操作成功,则存在CSRF漏洞。
-
挖掘CSRF漏洞
- 扫描器
- 修改密码的地方
- 添加用户的地方
- 数据库备份的地方
- 数据交易、支付等
- 其他一些对话框钓鱼页面
- CSRF一般与XSS结合使用
三、防范措施
1. 服务端防御策略
(1) Token验证
-
原理:为每个会话生成随机Token,校验请求合法性。
-
代码示例(PHP):
// 生成Token $_SESSION['token'] = bin2hex(random_bytes(32)); // 校验Token if ($_POST['token'] !== $_SESSION['token']) { die("Invalid Token!"); }
优化点:使用
SameSite
Cookie属性限制跨站请求。
(2) 校验Referer头
-
原理:限制请求来源为可信域名。
-
代码示例(Nginx配置):
if ($http_referer !~* "^https://yourdomain.com") { return 403; }
注意:需处理反向代理场景(如配置
proxy_set_header Referer $http_referer
)。
(3) 验证码/二次确认
-
场景:敏感操作(如支付、密码修改)需用户输入验证码或确认密码。
-
示例:
<form action="/transfer" method="POST"> <input type="text" name="captcha" placeholder="输入验证码"> <input type="submit" value="确认转账"> </form>
(4) 严格区分请求方法
-
规范:使用POST处理写操作(如数据修改),禁用GET执行敏感动作。
-
代码示例(Java Spring):
@PostMapping("/transfer") public ResponseEntity<?> transferFunds(@RequestBody TransferRequest request) { // 业务逻辑 }
2. 客户端防御建议
- 用户习惯:
- 及时退出长时间未使用的会话。
- 避免点击不明链接或图片。
- 安全工具:安装浏览器插件(如uBlock Origin)拦截可疑请求。
3. 安全开发
-
框架支持:
- Spring Security:自动集成CSRF Token。
- Django:内置
{% csrf_token %}
模板标签。 - React/Vue:通过Axios拦截器自动添加Token。
-
代码规范:
// React中自动携带CSRF Token axios.defaults.headers.common['X-CSRF-Token'] = document.querySelector('meta[name="csrf-token"]').content;
4. 安全设备防御
- WAF(Web应用防火墙):
- 规则示例:检测异常Referer或缺失Token的请求。
- 厂商方案:Cloudflare、ModSecurity。
- 硬件层防护:
- H3C IP5:基于硬件检测HTTP头部异常,阻断CSRF攻击。
四、结语与拓展
漏洞本质
CSRF的本质是**“信任用户浏览器发起的任何请求”**。防御核心在于打破这种信任链,通过Token、Referer校验等方式确保请求合法性。
漏洞自查清单
- 关键操作是否要求Token验证?
- 是否校验请求的Referer来源?
- GET请求是否用于数据修改?
- 是否存在未过滤的用户输入点(如图片URL)?
思考题
- 为什么CSRF攻击依赖用户会话?
(提示:服务器通过Cookie/Session识别用户身份,攻击者利用此机制伪造请求。)
延伸阅读
- OAuth 2.0中的CSRF防护:使用
state
参数防止授权流程劫持。 - 现代前端框架的防护机制:如Angular的
HttpClient
默认校验CSRF Token。
参考资源
- OWASP CSRF指南:https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html
- CVE案例库:https://cve.mitre.org/(查询CVE-2021-44228等最新漏洞)
- RFC 7231 HTTP方法定义:https://tools.ietf.org/html/rfc7231