共计 2035 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点:动态 CSRF Token 的测试挑战
在 Web 安全测试中,CSRF(跨站请求伪造)防护通常依赖动态生成的 Token。这些 Token 会在每次请求时变化,导致传统自动化测试工具在以下场景失效:

- 重放攻击失败:捕获的请求因 Token 过期无法重复使用
- 会话状态丢失:多步骤测试流程中 Token 未正确同步
- 验证逻辑绕过:部分系统会检查 Token 历史有效性
技术方案对比:Session Handling Rules vs Extensions
| 方案 | CPU 占用 | 内存消耗 | 适用场景 |
|---|---|---|---|
| Session Handling Rules | 低 | 50-100MB | 简单 Token 替换场景 |
| Extensions | 中高 | 200MB+ | 需复杂 DOM 解析 / 异步处理 |
核心实现:Token 捕获与自动化处理
1. Token 定位策略
-
Header 捕获 :适用于
X-CSRF-Token等标准头字段# 示例:从响应头提取 Token token = response.headers.get('X-CSRF-Token') -
Cookie 捕获 :处理
__RequestVerificationToken等 Cookie 存储# 使用 burp 的 CookieJar 接口 cookies = callbacks.getCookieJar(httpservice) -
DOM-XPath 解析:应对前端动态渲染场景
# 使用 lxml 解析 HTML from lxml import html doc = html.fromstring(response.body) token = doc.xpath('//input[@name="csrf_token"]/@value')[0]
2. 宏配置模板(含异常处理)
from burp import IBurpExtender, ISessionHandlingAction
import re
class BurpExtender(IBurpExtender, ISessionHandlingAction):
def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
if not messageIsRequest:
response = messageInfo.getResponse()
body = self._helpers.bytesToString(response)
# 异常处理:多模式 Token 捕获
try:
token = re.search(r'name="csrf"value="(.+?)"', body).group(1)
except AttributeError:
try:
token = re.search(r'"token":"(.+?)"', body).group(1)
except Exception as e:
print(f"Token 捕获失败: {str(e)}")
return
# 存储 Token 供后续请求使用
self._token_cache = token
else:
# 注入 Token 到新请求
request = messageInfo.getRequest()
new_req = self._helpers.updateParameter(
request,
self._helpers.buildParameter("csrf", self._token_cache, PARAM_BODY)
)
messageInfo.setRequest(new_req)
避坑指南:真实案例解析
- 加密 Token 处理:某银行系统使用 AES 加密 Token
-
解决方案:逆向解密函数或使用 Selenium 获取渲染后值
-
AJAX 异步加载:电商平台购物车 Token 延迟 500ms 加载
-
解决方案:在宏中添加
time.sleep(0.6)等待 -
多 Token 校验:OA 系统同时验证 Header 和 Cookie
- 解决方案:建立 Token 映射表维护多个 Token 关系
性能优化:Non-UI 模式实践
通过 BurpSuite 的 -Djava.awt.headless=true 参数启动,可降低 20% 内存消耗。配合以下配置:
- 禁用不需要的 Scanner 模块
- 设置合理的宏执行间隔(建议≥300ms)
- 使用
Proxy -> Options -> Streaming Responses处理大文件
挑战任务:增强型 Token 处理器
改造上述宏代码实现以下功能:
- 自动检测 Token 失效(通过响应状态码 403/419)
- 失败时自动重新获取 Token 并重试(最多 3 次)
- 验证响应中是否包含预期的成功关键词
提示代码框架:
def should_retry(response):
return b"Invalid CSRF Token" in response or \
response.getStatusCode() in [403, 419]
总结
通过合理配置 CSRF Token Tracker,测试效率可提升显著。建议根据目标系统特性选择匹配策略,并始终关注以下指标:
- Token 捕获成功率(建议≥95%)
- 请求延迟增加(控制在 300ms 内)
- 会话保持稳定性(连续操作不失效)
正文完
