被动扫描器之插件篇
字数 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个主要事件:

  1. onBeforeRequest:请求发送前
  2. onBeforeSendHeaders:发送请求头前
  3. onSendHeaders:发送请求头时
  4. onHeadersReceived:收到响应头时
  5. onAuthRequired:需要认证时
  6. onResponseStarted:开始接收响应时
  7. onCompleted:请求完成时
  8. onErrorOccurred:发生错误时

2.4 关键事件选择

被动扫描器最关心的数据:

  • 请求URL
  • 请求头
  • POST请求的请求体

推荐使用的事件组合:

  • onBeforeRequest:获取请求体
  • onSendHeaders:获取请求头

2.5 实现细节与注意事项

2.5.1 请求头获取兼容性问题

  • Chrome 79+:必须指定extraHeaders才能获取Origin请求头
  • Chrome 72+:必须指定extraHeaders才能获取以下请求头:
    • Accept-Language
    • Accept-Encoding
    • Referer
    • Cookie

兼容性处理代码示例:

const headers = version >= 72 ? ["requestHeaders", "extraHeaders"] : ["requestHeaders"];
chrome.webRequest.onSendHeaders.addListener(beforeSendHeaderHandler, requestFilters, headers);

2.5.2 请求体格式处理

onBeforeRequest获取的请求体已被解析,有两种形式:

  1. 键值对字典:适用于multipart/form-dataapplication/x-www-form-urlencoded
  2. 原生字节:需要手动解析

字节解析示例:

const postbody = decodeURIComponent(String.fromCharCode.apply(null, new Uint8Array(details.requestBody.raw[0].bytes)));

2.5.3 请求过滤

使用RequestFilter过滤特定请求:

  • urls:过滤请求URL
  • types:过滤资源类型

注意:RequestFilter在注册事件时配置,不能直接修改。如需修改,需先移除监听再添加新事件。

示例:

if (!chrome.webRequest.onSendHeaders.hasListener(beforeSendHeaderHandler)) {
  chrome.webRequest.onSendHeaders.addListener(
    beforeSendHeaderHandler,
    requestFilters,
    headers
  )
}

3. Burp插件开发

3.1 Burp插件基础

Burp插件使用Java开发,主要弥补Chrome插件无法覆盖的场景。

3.2 开发规范

  1. 必须定义BurpExtender
  2. 必须实现IBurpExtender接口
  3. 可以同时实现多个接口
  4. 必须重写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插件的步骤:

  1. 配置debug配置项
  2. 通过以下命令启动Burp:
    java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar burpsuite_community_v2.1.0.jar
    
  3. 在Burp中安装打包好的插件
  4. 在IDEA中设置断点并启动debug

4. 总结

开发被动扫描器插件需要注意以下关键点:

  1. Chrome插件

    • 选择合适的API(chrome.webRequest
    • 处理兼容性问题(特别是请求头获取)
    • 正确解析请求体格式
    • 合理使用请求过滤
  2. Burp插件

    • 遵循开发规范
    • 正确实现IHttpListener接口
    • 准确提取请求头和请求体
    • 掌握打包和调试技巧

通过这两种插件的配合使用,可以全面覆盖Web应用的安全测试需求,获取高质量的流量数据进行安全分析。

被动扫描器插件开发指南: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-Language Accept-Encoding Referer Cookie 兼容性处理代码示例: 2.5.2 请求体格式处理 onBeforeRequest 获取的请求体已被解析,有两种形式: 键值对字典:适用于 multipart/form-data 或 application/x-www-form-urlencoded 原生字节:需要手动解析 字节解析示例: 2.5.3 请求过滤 使用 RequestFilter 过滤特定请求: urls :过滤请求URL types :过滤资源类型 注意: RequestFilter 在注册事件时配置,不能直接修改。如需修改,需先移除监听再添加新事件。 示例: 3. Burp插件开发 3.1 Burp插件基础 Burp插件使用Java开发,主要弥补Chrome插件无法覆盖的场景。 3.2 开发规范 必须定义 BurpExtender 类 必须实现 IBurpExtender 接口 可以同时实现多个接口 必须重写 registerExtenderCallbacks 方法 3.3 关键接口:IHttpListener 被动扫描器主要使用 IHttpListener 接口处理HTTP请求: 参数说明: toolFlag :发起请求的Burp工具标识(如Proxy、Repeater) messageIsRequest :标识是请求(true)还是响应(false) messageInfo :请求/响应详细信息 3.4 请求处理实现 3.4.1 获取请求头 3.4.2 获取请求体 3.5 打包与部署 使用 maven-assembly-plugin 打包,配置示例: 注意:使用外部依赖时需要配置 jar-with-dependencies ,将依赖一并打包。 3.6 调试技巧 使用IDEA调试Burp插件的步骤: 配置debug配置项 通过以下命令启动Burp: 在Burp中安装打包好的插件 在IDEA中设置断点并启动debug 4. 总结 开发被动扫描器插件需要注意以下关键点: Chrome插件 : 选择合适的API( chrome.webRequest ) 处理兼容性问题(特别是请求头获取) 正确解析请求体格式 合理使用请求过滤 Burp插件 : 遵循开发规范 正确实现 IHttpListener 接口 准确提取请求头和请求体 掌握打包和调试技巧 通过这两种插件的配合使用,可以全面覆盖Web应用的安全测试需求,获取高质量的流量数据进行安全分析。