Burp项目解析器Skill burpsuite-project-parser

这个技能用于从Burp Suite项目文件中搜索和提取数据,支持使用正则表达式搜索响应头和体、提取安全审计发现、分析HTTP流量,适用于网络安全审计和漏洞挖掘。关键词:Burp Suite, 安全审计, 漏洞挖掘, HTTP流量分析, 正则表达式搜索。

安全审计 0 次安装 0 次浏览 更新于 3/14/2026

name: burpsuite-project-parser description: 从命令行搜索和探索Burp Suite项目文件(.burp)。用于使用正则表达式搜索响应头或体、提取安全审计发现、转储代理历史或站点地图数据、或分析Burp项目中捕获的HTTP流量。 allowed-tools:

  • Bash
  • Read

Burp项目解析器

使用burpsuite-project-file-parser扩展搜索和提取Burp Suite项目文件中的数据。

使用时机

  • 使用正则表达式搜索响应头或体
  • 从Burp项目中提取安全审计发现
  • 转储代理历史或站点地图数据
  • 分析Burp项目文件中捕获的HTTP流量

先决条件

此技能将解析委托给Burp Suite Professional - 它不直接解析.burp文件。

要求:

  1. Burp Suite Professional - 必须安装 (portswigger.net)
  2. burpsuite-project-file-parser扩展 - 提供CLI功能

安装扩展:

  1. github.com/BuffaloWill/burpsuite-project-file-parser 下载
  2. 在Burp Suite中:Extender → Extensions → Add
  3. 选择下载的JAR文件

快速参考

使用包装脚本:

{baseDir}/scripts/burp-search.sh /path/to/project.burp [FLAGS]

脚本使用环境变量以确保平台兼容性:

  • BURP_JAVA:Java可执行文件路径
  • BURP_JAR:burpsuite_pro.jar路径

有关设置说明,请参见平台配置

子组件过滤器(请使用这些)

始终使用子组件过滤器而不是完整转储。 完整的proxyHistorysiteMap可能返回千兆字节数据。子组件过滤器只返回所需内容。

可用过滤器

过滤器 返回 典型大小
proxyHistory.request.headers 仅请求行和头 小 (< 1KB/记录)
proxyHistory.request.body 仅请求体 变量
proxyHistory.response.headers 仅状态和头 小 (< 1KB/记录)
proxyHistory.response.body 仅响应体 大 - 避免
siteMap.request.headers 站点地图的同上
siteMap.request.body 变量
siteMap.response.headers
siteMap.response.body 大 - 避免

默认方法

从头开始,不是体:

# 好 - 仅头,安全检索
{baseDir}/scripts/burp-search.sh project.burp proxyHistory.request.headers | head -c 50000
{baseDir}/scripts/burp-search.sh project.burp proxyHistory.response.headers | head -c 50000

# 坏 - 完整记录包括体,可能千兆字节
{baseDir}/scripts/burp-search.sh project.burp proxyHistory  # 永远不要这样做

仅在查看头后为特定URL获取体,并始终截断:

# 1. 首先,从头中找到有趣URL
{baseDir}/scripts/burp-search.sh project.burp proxyHistory.response.headers | \
  jq -r 'select(.headers | test("text/html")) | .url' | head -n 20

# 2. 然后使用目标正则表达式搜索体 - 必须将体截断为1000字符
{baseDir}/scripts/burp-search.sh project.burp "responseBody='.*specific-pattern.*'" | \
  head -n 10 | jq -c '.body = (.body[:1000] + "...[TRUNCATED]")'

硬规则:体内容>1000字符绝不能进入上下文。 如果用户需要完整体内容,他们必须在Burp Suite的UI中查看。

正则表达式搜索操作

搜索响应头

responseHeader='.*regex.*'

搜索所有响应头。输出:{"url":"...", "header":"..."}

示例 - 查找服务器签名:

responseHeader='.*(nginx|Apache|Servlet).*' | head -c 50000

搜索响应体

responseBody='.*regex.*'

强制:始终将体内容截断至最多1000字符。 响应体可能每个兆字节。

# 必需格式 - 始终截断.body字段
{baseDir}/scripts/burp-search.sh project.burp "responseBody='.*<form.*action.*'" | \
  head -n 10 | jq -c '.body = (.body[:1000] + "...[TRUNCATED]")'

永远不要检索完整体内容。 如果需要查看更多特定响应,请用户打开Burp Suite的UI。

其他操作

提取审计项

auditItems

返回所有安全发现。输出包括:名称、严重性、置信度、主机、端口、协议、URL。

注意: 审计项小(无体) - 安全使用head -n 100检索。

转储代理历史(避免)

proxyHistory

永远不要直接使用此。 改用子组件过滤器:

  • proxyHistory.request.headers
  • proxyHistory.response.headers

转储站点地图(避免)

siteMap

永远不要直接使用此。 改用子组件过滤器。

输出限制(必需)

关键:在检索数据前始终检查结果大小。 广泛搜索可能返回数千记录,每个可能兆字节。这将溢出上下文窗口。

步骤1:始终首先检查大小

在任何搜索前,检查记录数和字节大小:

# 检查记录数和总字节 - 永远不要跳过此步骤
{baseDir}/scripts/burp-search.sh project.burp proxyHistory | wc -cl
{baseDir}/scripts/burp-search.sh project.burp "responseHeader='.*Server.*'" | wc -cl
{baseDir}/scripts/burp-search.sh project.burp auditItems | wc -cl

wc -cl 输出显示:<字节> <行>(例如,524288 42 表示512KB跨越42记录)。

解释结果 - 两者都必须通过:

指标 安全 窄搜索 太宽 停止
行数 < 50 50-200 200+ 1000+
字节数 < 50KB 50-200KB 200KB+ 1MB+

单行10MB响应将显示高字节数但仅1行 - 字节检查会捕获此。

步骤2:优化广泛搜索

如果计数/大小太高:

  1. 使用子组件过滤器(见上表):

    # 而不是:proxyHistory(千兆字节)
    # 使用:proxyHistory.request.headers(千字节)
    
  2. 缩小正则表达式模式:

    # 太宽(匹配所有):
    responseHeader='.*'
    
    # 更好 - 目标特定头:
    responseHeader='.*X-Frame-Options.*'
    responseHeader='.*Content-Security-Policy.*'
    
  3. 在检索前使用jq过滤:

    # 仅获取特定内容类型
    {baseDir}/scripts/burp-search.sh project.burp proxyHistory.response.headers | \
      jq -c 'select(.url | test("/api/"))' | head -n 50
    

步骤3:始终截断输出

即使优化后,始终管道截断:

# 始终使用head -c限制总字节(最多50KB)
{baseDir}/scripts/burp-search.sh project.burp proxyHistory.request.headers | head -c 50000

# 对于体搜索,截断每个JSON对象的体字段:
{baseDir}/scripts/burp-search.sh project.burp "responseBody='pattern'" | \
  head -n 20 | jq -c '.body = (.body | if length > 1000 then .[:1000] + "...[TRUNCATED]" else . end)'

# 限制记录数和字节大小:
{baseDir}/scripts/burp-search.sh project.burp auditItems | head -n 50 | head -c 50000

强制执行硬限制:

  • head -c 50000(最多50KB)在所有输出上
  • 截断.body字段至1000字符 - 强制,无例外
    jq -c '.body = (.body[:1000] + "...[TRUNCATED]")'
    

在计数和截断前永远不要运行这些:

  • proxyHistory / siteMap(完整转储 - 始终使用子组件过滤器)
  • responseBody='...' 搜索(体可能每个兆字节)
  • 任何广泛正则表达式如.*.+

调查工作流

  1. 确定范围 - 你在寻找什么?(特定漏洞类型、端点、头模式)

  2. 首先搜索审计项 - 从Burp的发现开始:

    {baseDir}/scripts/burp-search.sh project.burp auditItems | jq 'select(.severity == "High")'
    
  3. 检查置信度分数 - 过滤可操作发现:

    ... | jq 'select(.confidence == "Certain" or .confidence == "Firm")'
    
  4. 提取受影响URL - 获取攻击面:

    ... | jq -r '.url' | sort -u
    
  5. 搜索原始流量以获取上下文 - 检查实际请求/响应:

    {baseDir}/scripts/burp-search.sh project.burp "responseBody='pattern'"
    
  6. 手动验证 - Burp发现是指示,不是证明。验证每个。

理解结果

严重性 vs 置信度

Burp报告严重性(高/中/低)和置信度(确定/坚定/试探)。在分类时使用两者:

组合 含义
高 + 确定 可能是真实漏洞,优先调查
高 + 试探 经常是误报,报告前验证
中 + 坚定 值得调查,可能需要手动验证

“高严重性,试探置信度”发现经常是误报。不要仅基于严重性报告发现。

当代理历史不完整时

代理历史仅包含Burp捕获的内容。由于以下原因可能缺少流量:

  • 范围过滤器 排除域
  • 拦截设置 丢弃请求
  • 浏览器流量 未通过Burp代理路由

如果未找到预期流量,检查原始项目中的Burp范围和代理设置。

HTTP体编码

响应体可能被gzip压缩、分块或使用非UTF8编码。在纯文本上工作的正则表达式模式可能在编码响应上无声失败。如果搜索返回比预期少的结果:

  • 检查响应是否压缩
  • 尝试更广泛的模式或先搜索头
  • 使用Burp的UI检查原始与渲染响应

拒绝的合理化

导致错过漏洞或误报的常见捷径:

捷径 为什么错误
“这个正则表达式看起来好” 首先在样本数据上验证—编码和转义导致无声失败
“高严重性=必须修复” 也检查置信度分数;Burp有误报
“所有审计项都相关” 按实际威胁模型过滤;不是每个发现对每个应用都重要
“代理历史完整” 可能被Burp范围/拦截设置过滤;你只看到Burp捕获的内容
“Burp找到了,所以是漏洞” Burp发现需要手动验证—它们指示潜在问题,不是证明

输出格式

所有输出是JSON,每行一个对象。管道到jq格式化:

{baseDir}/scripts/burp-search.sh project.burp auditItems | jq .

使用grep过滤:

{baseDir}/scripts/burp-search.sh project.burp auditItems | grep -i "sql injection"

示例

搜索CORS头(带字节限制):

{baseDir}/scripts/burp-search.sh project.burp "responseHeader='.*Access-Control.*'" | head -c 50000

获取所有高严重性发现(审计项小,但仍限制):

{baseDir}/scripts/burp-search.sh project.burp auditItems | jq -c 'select(.severity == "High")' | head -n 100

从代理历史中提取仅请求URL:

{baseDir}/scripts/burp-search.sh project.burp proxyHistory.request.headers | jq -r '.request.url' | head -n 200

搜索响应体(必须将体截断至1000字符):

{baseDir}/scripts/burp-search.sh project.burp "responseBody='.*password.*'" | \
  head -n 10 | jq -c '.body = (.body[:1000] + "...[TRUNCATED]")'

平台配置

包装脚本需要两个环境变量来定位Burp Suite的捆绑Java和JAR文件。

macOS

export BURP_JAVA="/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/java"
export BURP_JAR="/Applications/Burp Suite Professional.app/Contents/Resources/app/burpsuite_pro.jar"

Windows

$env:BURP_JAVA = "C:\Program Files\BurpSuiteProfessional\jre\bin\java.exe"
$env:BURP_JAR = "C:\Program Files\BurpSuiteProfessional\burpsuite_pro.jar"

Linux

export BURP_JAVA="/opt/BurpSuiteProfessional/jre/bin/java"
export BURP_JAR="/opt/BurpSuiteProfessional/burpsuite_pro.jar"

将这些导出添加到你的shell配置文件(.bashrc, .zshrc, 等)以持久化。

手动调用

如果不使用包装脚本,直接调用:

"$BURP_JAVA" -jar -Djava.awt.headless=true "$BURP_JAR" \
  --project-file=/path/to/project.burp [FLAGS]