共计 1271 个字符,预计需要花费 4 分钟才能阅读完成。
CSRF 防护机制与测试挑战
CSRF(跨站请求伪造)防护的核心机制之一是使用动态 Token。服务器在生成表单时会嵌入一个随机 Token,提交请求时验证该 Token 的有效性。这种机制虽然提升了安全性,却给自动化测试带来两个主要问题:

- Token 动态性:每次页面加载 Token 都会变化,传统爬虫无法维持会话状态
- 请求关联性:后续请求往往需要携带前序请求生成的 Token,形成依赖链
手动处理 vs 自动化工具对比
- 手动处理 Token
- 优点:可应对任意复杂 Token 逻辑
-
缺点:效率低下(每个请求需人工介入)、难以处理多步骤流程
-
CSRF Token Tracker
- 优点:自动捕获 / 更新 / 注入 Token、支持多请求关联
- 缺点:需要初始配置、对非标准 Token 处理有限
配置实战详解
1. 识别页面 Token
打开 BurpSuite 的 Target 标签,观察典型请求:
POST /transfer HTTP/1.1
...
csrf_token=5a3d8f7b2e1c
同时检查 HTML 表单:
<input type="hidden" name="csrf_token" value="5a3d8f7b2e1c">
2. 配置提取规则
在 Project options → Session → Session Handling Rules 中添加规则:
- 点击
Add新建规则 - 在
Rule Actions选择Run macro - 配置 Token 提取正则(示例):
name="csrf_token" value="([a-f0-9]{12})"
3. 更新策略设置
- 更新触发条件 :当检测到
302 重定向或Set-Cookie时 - 作用范围 :限定在
/api/*路径下 - 异常处理:设置 3 次重试机制
完整配置示例
# Burp 宏定义示例(Python 语法)def macro(request, response):
# 从响应中提取 Token
token = re.search(r'csrf_token=([^&"\']+)', response).group(1)
# 修改后续请求
request.setParameter('csrf_token', token)
return request
性能与安全考量
- 性能影响
- 增加约 5 -10% 的请求处理时间
-
建议:对静态资源路径添加排除规则
-
安全风险
- 避免在生产环境启用(可能修改合法请求)
- 临时 Token 应设置较短有效期
避坑指南
- 问题 1 :Token 未正确注入
- 检查正则是否匹配 DOM 实际结构
-
使用
Logger++插件验证捕获结果 -
问题 2 :循环重定向
- 确认 Token 更新未破坏会话状态
-
在
Scope中排除登录 / 注销路径 -
问题 3 :多步骤流程失效
- 为每个关键节点创建独立 macro
- 使用
Session.tokensAPI 跨请求传递
进阶思考
当遇到以下复杂场景时,可考虑:
- JWT Token:结合
Authorization头处理 - 加密 Token:编写自定义解密 processor
- 双 Token 验证:配置多重匹配规则
建议从简单的登录表单开始实践,逐步扩展到购物车、支付等多步骤流程测试。记录不同框架(如 Spring Security、Django CSRF)的 Token 生成规律,建立自己的规则库。
正文完
