BurpSuite CSRF Token Tracker 实现原理与实战避坑指南

1次阅读
没有评论

共计 2035 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景痛点:动态 CSRF Token 的测试挑战

在 Web 安全测试中,CSRF(跨站请求伪造)防护通常依赖动态生成的 Token。这些 Token 会在每次请求时变化,导致传统自动化测试工具在以下场景失效:

BurpSuite CSRF Token Tracker 实现原理与实战避坑指南

  • 重放攻击失败:捕获的请求因 Token 过期无法重复使用
  • 会话状态丢失:多步骤测试流程中 Token 未正确同步
  • 验证逻辑绕过:部分系统会检查 Token 历史有效性

技术方案对比:Session Handling Rules vs Extensions

方案 CPU 占用 内存消耗 适用场景
Session Handling Rules 50-100MB 简单 Token 替换场景
Extensions 中高 200MB+ 需复杂 DOM 解析 / 异步处理

核心实现:Token 捕获与自动化处理

1. Token 定位策略

  1. Header 捕获 :适用于X-CSRF-Token 等标准头字段

    # 示例:从响应头提取 Token
    token = response.headers.get('X-CSRF-Token')

  2. Cookie 捕获 :处理__RequestVerificationToken 等 Cookie 存储

    # 使用 burp 的 CookieJar 接口
    cookies = callbacks.getCookieJar(httpservice)

  3. 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)

避坑指南:真实案例解析

  1. 加密 Token 处理:某银行系统使用 AES 加密 Token
  2. 解决方案:逆向解密函数或使用 Selenium 获取渲染后值

  3. AJAX 异步加载:电商平台购物车 Token 延迟 500ms 加载

  4. 解决方案:在宏中添加 time.sleep(0.6) 等待

  5. 多 Token 校验:OA 系统同时验证 Header 和 Cookie

  6. 解决方案:建立 Token 映射表维护多个 Token 关系

性能优化:Non-UI 模式实践

通过 BurpSuite 的 -Djava.awt.headless=true 参数启动,可降低 20% 内存消耗。配合以下配置:

  1. 禁用不需要的 Scanner 模块
  2. 设置合理的宏执行间隔(建议≥300ms)
  3. 使用 Proxy -> Options -> Streaming Responses 处理大文件

挑战任务:增强型 Token 处理器

改造上述宏代码实现以下功能:

  1. 自动检测 Token 失效(通过响应状态码 403/419)
  2. 失败时自动重新获取 Token 并重试(最多 3 次)
  3. 验证响应中是否包含预期的成功关键词

提示代码框架:

def should_retry(response):
    return b"Invalid CSRF Token" in response or \
           response.getStatusCode() in [403, 419]

总结

通过合理配置 CSRF Token Tracker,测试效率可提升显著。建议根据目标系统特性选择匹配策略,并始终关注以下指标:

  • Token 捕获成功率(建议≥95%)
  • 请求延迟增加(控制在 300ms 内)
  • 会话保持稳定性(连续操作不失效)
正文完
 0
评论(没有评论)