被动扫描器之插件篇
字数 1886 2025-08-18 11:39:08
被动扫描器插件开发指南:Chrome与Burp插件详解
1. 被动扫描器插件概述
被动扫描器通过收集业务正常流量进行安全测试,相比主动扫描器能取得更好的效果。获取高质量流量是被动扫描器发挥作用的关键。本文详细介绍两种被动扫描器插件的开发:Chrome插件和Burp插件。
2. Chrome插件开发
2.1 Chrome插件基础
Chrome插件是通过JavaScript、HTML和CSS编写的浏览器扩展程序,用于添加或修改Chrome功能。开发被动扫描器插件主要关注如何获取浏览器流量数据。
2.2 流量获取API
Chrome插件获取网络流量的主要API:
chrome.devtools.network:需要打开开发者工具chrome.webRequest:推荐使用,无需开发者工具
2.3 webRequest API详解
chrome.webRequest采用事件驱动模型,请求生命周期包含7个主要事件:
onBeforeRequest:请求发送前onBeforeSendHeaders:发送请求头前onSendHeaders:发送请求头时onHeadersReceived:收到响应头时onAuthRequired:需要认证时onResponseStarted:开始接收响应时onCompleted:请求完成时onErrorOccurred:发生错误时
2.4 关键事件选择
被动扫描器最关心的数据:
- 请求URL
- 请求头
- POST请求的请求体
推荐使用的事件组合:
onBeforeRequest:获取请求体onSendHeaders:获取请求头
2.5 实现细节与注意事项
2.5.1 请求头获取兼容性问题
- Chrome 79+:必须指定
extraHeaders才能获取Origin请求头 - Chrome 72+:必须指定
extraHeaders才能获取以下请求头:Accept-LanguageAccept-EncodingRefererCookie
兼容性处理代码示例:
const headers = version >= 72 ? ["requestHeaders", "extraHeaders"] : ["requestHeaders"];
chrome.webRequest.onSendHeaders.addListener(beforeSendHeaderHandler, requestFilters, headers);
2.5.2 请求体格式处理
onBeforeRequest获取的请求体已被解析,有两种形式:
- 键值对字典:适用于
multipart/form-data或application/x-www-form-urlencoded - 原生字节:需要手动解析
字节解析示例:
const postbody = decodeURIComponent(String.fromCharCode.apply(null, new Uint8Array(details.requestBody.raw[0].bytes)));
2.5.3 请求过滤
使用RequestFilter过滤特定请求:
urls:过滤请求URLtypes:过滤资源类型
注意:RequestFilter在注册事件时配置,不能直接修改。如需修改,需先移除监听再添加新事件。
示例:
if (!chrome.webRequest.onSendHeaders.hasListener(beforeSendHeaderHandler)) {
chrome.webRequest.onSendHeaders.addListener(
beforeSendHeaderHandler,
requestFilters,
headers
)
}
3. Burp插件开发
3.1 Burp插件基础
Burp插件使用Java开发,主要弥补Chrome插件无法覆盖的场景。
3.2 开发规范
- 必须定义
BurpExtender类 - 必须实现
IBurpExtender接口 - 可以同时实现多个接口
- 必须重写
registerExtenderCallbacks方法
3.3 关键接口:IHttpListener
被动扫描器主要使用IHttpListener接口处理HTTP请求:
public interface IHttpListener {
void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo);
}
参数说明:
toolFlag:发起请求的Burp工具标识(如Proxy、Repeater)messageIsRequest:标识是请求(true)还是响应(false)messageInfo:请求/响应详细信息
3.4 请求处理实现
3.4.1 获取请求头
public Map<String, String> getHeaders(IHttpRequestResponse messageInfo) {
Map<String, String> headers = new HashMap<>();
IRequestInfo analyzeRequest = helpers.analyzeRequest(messageInfo);
List<String> h = analyzeRequest.getHeaders();
for (String h1: h) {
if (h1.startsWith("GET") || h1.startsWith("POST")) {
continue;
} else {
String[] header = h1.split(":", 2);
headers.put(header[0], header[1].trim());
}
}
return headers;
}
3.4.2 获取请求体
private String getBody(IHttpRequestResponse messageInfo) {
IRequestInfo requestInfo = helpers.analyzeRequest(messageInfo);
int bodyOffset = requestInfo.getBodyOffset();
byte[] byteRequest = messageInfo.getRequest();
byte[] byteBody = Arrays.copyOfRange(byteRequest, bodyOffset, byteRequest.length);
return new String(byteBody);
}
3.5 打包与部署
使用maven-assembly-plugin打包,配置示例:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
注意:使用外部依赖时需要配置jar-with-dependencies,将依赖一并打包。
3.6 调试技巧
使用IDEA调试Burp插件的步骤:
- 配置debug配置项
- 通过以下命令启动Burp:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar burpsuite_community_v2.1.0.jar - 在Burp中安装打包好的插件
- 在IDEA中设置断点并启动debug
4. 总结
开发被动扫描器插件需要注意以下关键点:
-
Chrome插件:
- 选择合适的API(
chrome.webRequest) - 处理兼容性问题(特别是请求头获取)
- 正确解析请求体格式
- 合理使用请求过滤
- 选择合适的API(
-
Burp插件:
- 遵循开发规范
- 正确实现
IHttpListener接口 - 准确提取请求头和请求体
- 掌握打包和调试技巧
通过这两种插件的配合使用,可以全面覆盖Web应用的安全测试需求,获取高质量的流量数据进行安全分析。