Burp Suite Bambda 过滤模式深度教学文档
1. 概述与前言
Bambda 是 Burp Suite Professional 在 2023.10.3 版本中引入的一项革命性特性。它允许用户通过编写自定义代码来筛选 HTTP History 中的条目,提供了远比传统基于设置模式的过滤更强大和灵活的操控能力。
主要价值:
- 实现极其灵活的请求/响应数据过滤,能够基于复杂的逻辑条件精确匹配目标数据流。
- 支持对请求内容进行动态处理和替换,为高级攻击测试和流量修改提供了可能。
新版本同时支持将已配置的规则视图转换为 Bambda 表达式,便于学习和迁移。
2. 核心接口详解
Bambda 功能的实现依赖于 Burp Extensions Montoya API 中的几个关键接口。理解这些接口是编写有效 Bambda 代码的基础。
2.1 ProxyHttpRequestResponse 接口
此接口是处理 Burp 代理拦截的 HTTP 请求与响应 的核心。
常用方法与属性举例:
// 获取当前请求的 MIME 类型 (e.g., "application/json", "text/html")
var mimeType = requestResponse.mimeType();
// 获取请求的路径(不包含查询参数),并转换为小写便于比较
var path = requestResponse.request().pathWithoutQuery().toLowerCase();
// 获取请求的 HTTP 方法 (e.g., "GET", "POST")
var method = requestResponse.request().method();
// 获取请求的目标主机名
String host = requestResponse.request().httpService().host();
// 获取完整的请求 URL
String url = requestResponse.request().url();
// 获取请求体内容(适用于 POST 等)
String body = requestResponse.request().bodyToString();
// 获取响应的状态码
int statusCode = requestResponse.response().statusCode();
官方API文档参考:https://portswigger.github.io/burp-extensions-montoya-api/javadoc/burp/api/montoya/proxy/ProxyHttpRequestResponse.html
2.2 ProxyWebSocketMessage 接口
此接口专门用于处理 WebSocket 消息。
常用方法与属性举例:
// 检查 WebSocket 消息负载中是否包含特定字符串(不区分大小写)
message.contains("openim.ws_msg_push_ack", false);
// 获取接收此 WebSocket 消息的监听器端口
int listenerPort = message.listenerPort();
// 获取 WebSocket 消息的负载内容,并转换为字符串
// 需要配合 Utilities 接口的转换工具
String payload = utilities().byteUtils().convertToString(message.payload().getBytes());
// 判断消息方向(客户端到服务器 / 服务器到客户端)
boolean isOutgoing = message.direction().isOutgoing();
官方API文档参考:ProxyWebSocketMessage (burp-extensions-montoya-api 2025.8 API)
2.3 Utilities 接口
这是一个功能丰富的工具类接口,提供各种数据编码、解码、转换和生成实用方法,是处理原始数据的瑞士军刀。
包含的常用工具类:
base64Utils(): 用于 Base64 编码和解码。byteUtils(): 用于字节数组和字符串之间的转换(非常常用)。htmlUtils(): 用于 HTML 编码和解码。urlUtils(): 用于 URL 编码和解码。randomUtils(): 用于生成随机数、字符串等。jsonUtils(): 用于解析和处理 JSON 数据。
2.4 logging 接口
用于在 Burp 的 Extender > Bambda 标签页下的输出控制台中进行调试和日志记录。在编写复杂表达式时,打印日志至关重要。
基本用法:
// 输出日志到 Bambda 控制台
logging().output().println("This is a debug message: " + someVariable);
// 记录错误信息
logging().raiseError("An error occurred!");
3. 实际应用场景与代码示例
以下是一些可直接使用或稍作修改即可投入实战的 Bambda 代码片段。
3.1 过滤掉特定的 HTTP Method 请求
场景:在流量巨大的历史记录中隐藏所有 OPTIONS 或 TRACE 等噪音请求。
// 隐藏所有 OPTIONS 方法的请求
var method = requestResponse.request().method();
return !method.equalsIgnoreCase("OPTIONS");
// 隐藏 GET 和 OPTIONS 请求
var method = requestResponse.request().method();
return !(method.equalsIgnoreCase("GET") || method.equalsIgnoreCase("OPTIONS"));
3.2 过滤掉特定的 Host 请求
场景:专注于测试目标域名,排除第三方资源(如 jQuery、Google Analytics 等)的干扰。
// 只显示指向 example.com 或其子域的请求
String host = requestResponse.request().httpService().host();
return host.endsWith("example.com") || host.endsWith(".example.com"); // 注意前面的点
// 排除所有对 google.com 相关域的请求
String host = requestResponse.request().httpService().host();
return !host.contains("google");
3.3 过滤 WebSocket 中包含特定字符的请求
场景:在大量的 WS 消息中,只关注包含特定指令或数据的消息。
// 只显示包含 "critical_error" 或 "user_login" 的 WebSocket 消息
String payload = utilities().byteUtils().convertToString(message.payload().getBytes());
return payload.contains("critical_error") || payload.contains("user_login");
3.4 提取并高亮 WebSocket JSON 消息中的特定字段
场景:WS 消息是 JSON 格式,需要快速定位其中某个字段的值(如 userID)。
// 1. 首先确保是 JSON 格式的 WS 消息
String payload = utilities().byteUtils().convertToString(message.payload().getBytes());
if(payload.trim().startsWith("{") && payload.contains("\"userId\":")) {
// 此处可以编写简单的解析逻辑或使用 jsonUtils() 提取值
// 这里仅作过滤,高亮需要在匹配器 (Matcher) 中设置
return true;
}
return false;
3.5 提取请求中的 Email 并高亮显示
场景:在请求参数或响应中快速发现和标记可能的敏感信息(邮箱)。
// 组合使用请求和响应搜索
import java.util.regex.Pattern;
import java.util.regex.Matcher;
String requestAndResponse = requestResponse.request().toString() + requestResponse.response().toString();
Pattern pattern = Pattern.compile("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}");
Matcher matcher = pattern.matcher(requestAndResponse);
return matcher.find(); // 如果找到邮箱则返回 true,该条目会显示
注意:此正则表达式仅作示例,可能需调整以适应不同格式的邮箱。
3.6 动态替换消息头中的值
场景:自动化修改所有请求中的某个 Header,例如将 User-Agent 替换为自定义值。
// 注意:Bambda 主要用于过滤,但结合 Montoya API 的修改能力可以实现替换
// 以下概念性代码展示逻辑,完整实现通常在 Burp 扩展中而非单行 Bambda
var request = requestResponse.request();
if (request.headers().contains("User-Agent: Old-Agent")) {
// 创建一个修改后的请求(此处为概念性代码)
var newRequest = request.withHeader("User-Agent", "My-Custom-Agent");
// 用修改后的请求替换原请求(此操作通常在代理拦截或修改扩展中完成)
// requestResponse = requestResponse.withRequest(newRequest);
return true; // 让修改后的请求通过
}
return true;
重要:在 Bambda 过滤器中直接修改请求/响应需要深入理解 API 的工作流程,通常更复杂的修改会通过编写完整的 Burp 扩展来实现。
4. 使用流程与技巧
-
开启 Bambda:
- 进入 Proxy > HTTP history。
- 点击过滤器栏中的 Filter 按钮。
- 在弹出的规则视图中,将模式从 Simple 或 Advanced 切换到 Bambda。
-
编写与测试:
- 在下方的代码编辑器中输入你的逻辑。代码必须返回一个
boolean值(true表示保留该条目,false表示过滤掉)。 - 充分利用
logging().output().println()进行调试,输出变量值,判断逻辑分支。 - 编写完成后,流量列表会实时刷新,立即呈现过滤效果。
- 在下方的代码编辑器中输入你的逻辑。代码必须返回一个
-
转换学习:
- 先在 Simple/Advanced 模式下配置规则,然后切换到 Bambda 模式,Burp 会自动生成等效的代码表达式。这是学习 Bambda 语法的最佳方式。
-
性能考量:
- 过于复杂的 Bambda 表达式(如深度解析大型 JSON 或 XML)可能会对 Burp 性能产生轻微影响。在处理极高流量时,应保持逻辑简洁高效。
5. 总结
Bambda 模式将 Burp Suite 的流量过滤能力从简单的模式匹配提升到了可编程级别。通过掌握 ProxyHttpRequestResponse、ProxyWebSocketMessage、Utilities 等核心接口,安全测试人员能够:
- 精准定位:从海量流量中快速筛选出与测试目标最相关的关键请求。
- 降低噪音:有效排除第三方资源、健康检查等无关流量的干扰。
- 深度处理:不仅限于过滤,更为高级的流量分析和修改提供了入口。
- 提升效率:将重复性的手动筛选工作自动化,极大提升了渗透测试和漏洞挖掘的工作流效率。
建议结合官方 Montoya API 文档进行实践,从简单的规则转换开始,逐步编写更复杂的自定义过滤逻辑,从而完全掌控 Burp Suite 中的流量视图。