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文件。
要求:
- Burp Suite Professional - 必须安装 (portswigger.net)
- burpsuite-project-file-parser扩展 - 提供CLI功能
安装扩展:
- 从 github.com/BuffaloWill/burpsuite-project-file-parser 下载
- 在Burp Suite中:Extender → Extensions → Add
- 选择下载的JAR文件
快速参考
使用包装脚本:
{baseDir}/scripts/burp-search.sh /path/to/project.burp [FLAGS]
脚本使用环境变量以确保平台兼容性:
BURP_JAVA:Java可执行文件路径BURP_JAR:burpsuite_pro.jar路径
有关设置说明,请参见平台配置。
子组件过滤器(请使用这些)
始终使用子组件过滤器而不是完整转储。 完整的proxyHistory或siteMap可能返回千兆字节数据。子组件过滤器只返回所需内容。
可用过滤器
| 过滤器 | 返回 | 典型大小 |
|---|---|---|
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.headersproxyHistory.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:优化广泛搜索
如果计数/大小太高:
-
使用子组件过滤器(见上表):
# 而不是:proxyHistory(千兆字节) # 使用:proxyHistory.request.headers(千字节) -
缩小正则表达式模式:
# 太宽(匹配所有): responseHeader='.*' # 更好 - 目标特定头: responseHeader='.*X-Frame-Options.*' responseHeader='.*Content-Security-Policy.*' -
在检索前使用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='...'搜索(体可能每个兆字节)- 任何广泛正则表达式如
.*或.+
调查工作流
-
确定范围 - 你在寻找什么?(特定漏洞类型、端点、头模式)
-
首先搜索审计项 - 从Burp的发现开始:
{baseDir}/scripts/burp-search.sh project.burp auditItems | jq 'select(.severity == "High")' -
检查置信度分数 - 过滤可操作发现:
... | jq 'select(.confidence == "Certain" or .confidence == "Firm")' -
提取受影响URL - 获取攻击面:
... | jq -r '.url' | sort -u -
搜索原始流量以获取上下文 - 检查实际请求/响应:
{baseDir}/scripts/burp-search.sh project.burp "responseBody='pattern'" -
手动验证 - 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]