用途
本技能用于搜索和提取 Burp Suite 项目文件(.burp)中的数据,服务于安全分析场景。适用情形包括:使用正则表达式搜索响应头或响应体;从 Burp 项目中提取安全审计发现;导出代理历史(proxy history)或站点地图(site map)数据;分析 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 路径)。
平台配置示例:
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"
可将上述 export 加入 shell 配置文件(.bashrc、.zshrc 等)以持久生效。若不用封装脚本,可直接调用:
"$BURP_JAVA" -jar -Djava.awt.headless=true "$BURP_JAR" \
--project-file=/path/to/project.burp [FLAGS]
子组件过滤器(建议使用)
应始终使用子组件过滤器,而非完整转储。完整的 proxyHistory 或 siteMap 可能返回数 GB 数据,子组件过滤器只返回所需内容。可用过滤器包括:proxyHistory.request.headers(请求行 + 头,通常很小)、proxyHistory.request.body(仅请求体)、proxyHistory.response.headers(状态 + 头,通常很小)、proxyHistory.response.body(仅响应体,体积大,应避免)、以及 siteMap 对应的同名过滤器。
默认做法是先取头部而非主体:
{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
仅在查看头部后针对特定 URL 获取主体,并且始终截断。硬性规则:超过 1000 字符的主体内容绝不应进入上下文;若用户需要完整主体内容,应在 Burp Suite 界面中查看。
正则搜索操作
搜索响应头:responseHeader='.*regex.*',输出 {"url":"...", "header":"..."}。例如查找服务器签名:
responseHeader='.*(nginx|Apache|Servlet).*' | head -c 50000
搜索响应体:responseBody='.*regex.*',必须始终将 body 截断至最多 1000 字符:
{baseDir}/scripts/burp-search.sh project.burp "responseBody='.*<form.*action.*'" | \
head -n 10 | jq -c '.body = (.body[:1000] + "...[TRUNCATED]")'
其他操作
提取审计项:auditItems 返回所有安全发现,输出包含 name、severity、confidence、host、port、protocol、url。审计项不含主体,体积较小,可用 head -n 100 安全获取。
转储代理历史(应避免):不要直接使用 proxyHistory,改用 proxyHistory.request.headers、proxyHistory.response.headers 等子组件过滤器。转储站点地图(应避免):不要直接使用 siteMap,同样改用子组件过滤器。
输出限制(必需)
检索数据前必须先检查结果大小,宽泛搜索可能返回数千条记录、每条可达数 MB。先用 wc -cl 同时检查记录数与字节大小,输出格式为 <bytes> <lines>。判断参考:行数 < 50 安全,50-200 需收窄,200+ 过宽,1000+ 应停止;字节 < 50KB 安全,50-200KB 需收窄,200KB+ 过宽,1MB+ 应停止。两项都需通过。若结果过大,可使用子组件过滤器、收窄正则(例如用 responseHeader='.*X-Frame-Options.*' 替代 responseHeader='.*')、或在检索前用 jq 过滤。即使收窄后也要始终截断:所有输出使用 head -c 50000(最大 50KB),body 字段必须截断至 1000 字符。
调查工作流
- 明确范围:查找什么(特定漏洞类型、端点、头部模式)。
- 先搜索审计项:从 Burp 的发现开始,例如
... auditItems | jq 'select(.severity == "High")'。 - 检查置信度分数,过滤可操作发现:
... | jq 'select(.confidence == "Certain" or .confidence == "Firm")'。 - 提取受影响 URL,获取攻击面:
... | jq -r '.url' | sort -u。 - 搜索原始流量以获取上下文。
- 人工验证:Burp 发现只是指示,不是证据。
结果解读
Burp 同时报告严重性(High/Medium/Low)与置信度(Certain/Firm/Tentative),triage 时应同时使用两者。例如 High + Certain 可能是真实漏洞,应优先调查;High + Tentative 常为误报,报告前需验证;Medium + Firm 值得调查,可能需人工验证。不应仅根据严重性报告发现。
代理历史可能不完整,可能因范围过滤排除了域名、拦截设置丢弃了请求、或浏览器流量未经过 Burp 代理。若未找到预期流量,应检查原项目中的 Burp 范围和代理设置。
响应体可能为 gzip 压缩、分块或非 UTF-8 编码,在明文上有效的正则可能在这些响应上静默失败。若搜索结果少于预期,可检查响应是否压缩、尝试更宽泛的模式或先搜索头部、或在 Burp 界面中查看原始与渲染后的响应。
应拒绝的合理化借口
常见捷径及问题:认为“正则看起来没问题”应先在小样本上验证,编码与转义会导致静默失败;“高严重性 = 必须修复”还需检查置信度,Burp 存在误报;“所有审计项都相关”应按实际威胁模型过滤;“代理历史是完整的”可能受 Burp 范围/拦截设置过滤;“Burp 发现了就是漏洞”Burp 发现需人工验证,只是指示潜在问题而非证据。
输出格式与示例
所有输出为 JSON,每行一个对象,可管道传给 jq 格式化或 grep 过滤。
搜索 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]")'
引用文档
以下为作者声明的引用来源,保留指定版本、署名和许可。
- trailofbits/skills/plugins/burpsuite-project-parser/skills/burpsuite-project-parser/SKILL.md — 署名:Trail of Bits;许可:CC-BY-SA-4.0;版本:
5c15f4f5644b4bd3d48882a802a7232d501852b6。