Burp Suite Extension Development Guide
Burp Suite是什么?
Burp Suite是一款Web应用程序渗透测试工具,可以帮助用户发现和利用Web应用程序中的漏洞,提高渗透测试的效率和精度。
Web应用程序最常用的传输数据的协议就是HTTP/HTTPS,所以我们将从HTTP协议的数据格式开始介绍。
HTTP/HTTPS协议内容简要划分
Burp中最为核心的对象就是HTTP数据包,我们的所有操作、各种API接口都是围绕HTTP数据包展开的。下图对HTTP数据包进行划分:

数据映射表:

插件能对HTTP数据包做的操作无非“增删查改”四种,下面这段代码对常用操作均进行了演示。
https://github.com/bit4woo/burp-api-drops/blob/master/src/burp/Lession5.java
请求包:
header的获取、删除、新增、修改body的获取、修改parameter的获取、删除、新增、修改发送一个新的请求
响应包:
header的获取、删除、新增、修改body的获取、修改
httpService:
host的获取、修改port的获取、修改protocol的获取、修改
插件的调用原理介绍
以下全文将以Java语言的视角展开,

插件的总入口是
BurpExtender类,该类是必须得实现IBurpExtender接口;当实现
IBurpExtender接口后,会要求重写registerExtenderCallbacks()方法,而该函数的作用就是注册回调,当自己的写的插件需要哪些API支持的时候,都需要在该函数中进行注册,这样burp在执行的时候,会读取自己写的插件代码是否有回调注册,如果有就进行执行相应代码。
基本逻辑流程如下:
BurpExtender类————> registerExtenderCallbacks()方法 ————> 调用Callbacks.registerXxx接口名称(this) ————> 去执行注册接口的方法
Burp Suite的API的简要划分
Burp Suite 提供了丰富的插件接口,可以让开发者编写自定义插件,扩展 Burp Suite 的功能。 最新版本的APIs还是挺多的,想要高效的编写出插件,还是得了解你的需求,根据需求去匹配使用相关接口,下面我列举一些常用的 Burp Suite 插件接口类:
IBurpExtender 接口:该接口用于定义 Burp Suite 插件的入口点,即插件的主类。在该接口的 registerExtenderCallbacks 方法中,开发者可以注册其他插件接口类和事件监听器。IExtensionStateListener 接口:该接口用于定义插件状态的变化监听器。开发者可以通过实现该接口,监视插件的启动、停止和卸载等事件,并在这些事件发生时执行自定义的操作。IHttpListener 接口:该接口用于定义 HTTP 拦截器。通过实现该接口,开发者可以在 Burp Suite 中拦截 HTTP 请求和响应,并实现自定义的处理逻辑,例如修改请求或响应、分析参数等。IScannerCheck 接口:该接口用于定义漏洞扫描器。通过实现该接口,开发者可以编写自定义的漏洞检测逻辑,并将其集成到 Burp Suite 的漏洞扫描器中,从而提高漏洞检测的效率和精度。IIntruderPayloadGenerator 接口:该接口用于定义 Intruder 负载生成器。通过实现该接口,开发者可以编写自定义的负载生成逻辑,并将其集成到 Burp Suite 的 Intruder 工具中,用于进行爆破和暴力破解等攻击。IContextMenuFactory 接口:该接口用于定义右键菜单工厂。通过实现该接口,开发者可以向 Burp Suite 的右键菜单中添加自定义的菜单项,并实现菜单项的点击事件。IMessageEditorTabFactory 接口:该接口用于定义消息编辑器选项卡工厂。通过实现该接口,开发者可以向 Burp Suite 的消息编辑器中添加自定义的选项卡,并实现选项卡的内容显示和编辑功能。
开发流程简介
大体步骤如下:

- 创建项目、导入jar包
开发插件有些规定需要记住,目录名必须设置成burp目录,类名即文件名必须是BurpExtender。
导入burp的接口jar包有多种方式,我下面以maven的方式举例:
<dependencies>
<!-- https://mvnrepository.com/artifact/net.portswigger.burp.extender/burp-extender-api -->
<dependency>
<groupId>net.portswigger.burp.extender</groupId>
<artifactId>burp-extender-api</artifactId>
<version>1.7.22</version>
</dependency>
</dependencies>
- 开发功能模块
- 编译打包
<build>
<plugins>
<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>
</plugins>
</build>
打开终端,输入打包jar包命令:
mvn clean install
- Burp Suite导入刚编译好的jar包进行测试、使用。
案例1 —— 对HTTP\HTTPS数据流处理
如果想要实现对HTTP\HTTPS数据的操作,那么就需要了解IHttpListener接口中的processHttpMessage方法,
Burp的IHttpListener接口用于扩展Burp Suite的HTTP拦截器,通过实现该接口可以在HTTP请求和响应被拦截时执行一些自定义的操作。
IHttpListener接口中的processHttpMessage方法用于处理拦截到的HTTP请求和响应,其方法签名如下:
void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo);
其中:
toolFlag 参数表示触发拦截的工具,可以是 Burp Suite 中的 Proxy、Scanner、Spider 等工具;messageIsRequest 参数表示拦截到的消息是请求还是响应;- 当 messageIsRequest 参数为
true时,表示拦截的是请求内容; - 当 messageIsRequest 参数为
false时,表示拦截的是响应内容;
- 当 messageIsRequest 参数为
messageInfo 参数表示拦截到的HTTP请求/响应的详细信息,包括请求/响应头、请求/响应体、请求/响应的地址、协议版本等等。
在实现IHttpListener接口时,通常会在processHttpMessage方法中编写自定义的处理逻辑,比如对请求/响应进行修改、分析请求/响应的参数等,从而实现自定义的HTTP拦截功能。
总之,通过实现IHttpListener接口,并在其中实现processHttpMessage方法,可以为Burp Suite的HTTP拦截器添加自定义的处理逻辑,从而提高渗透测试的效率和精度。
下面主要讲解一个通过对HTTP\HTTPS数据流的拦截、处理,在head添加 X-forwarded-for 一个请求头,伪造客户端IP测试的案例。
可以配合在线工具,进行测试:
https://uutool.cn/mock/
主要用来模拟服务端收到请求后,查看请求内容。

code:
package burp;
import burp.IBurpExtender;
import burp.IBurpExtenderCallbacks;
import burp.IExtensionHelpers;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.List;
public class BurpExtender implements IBurpExtender, IHttpListener, IExtensionStateListener {
private IExtensionHelpers helpers;
private IBurpExtenderCallbacks callbacks;
private PrintWriter stdout;
private PrintWriter stderr;
@Override
public void registerExtenderCallbacks(IBurpExtenderCallbacks iBurpExtenderCallbacks) {
this.callbacks = iBurpExtenderCallbacks;
//设置插件名字
callbacks.setExtensionName("Demo1");
this.helpers = callbacks.getHelpers();
// 一定要注册监听器,不然下面的函数无法生效
callbacks.registerHttpListener(this);
callbacks.registerExtensionStateListener(this);
this.stdout = new PrintWriter(callbacks.getStdout(), true);
this.stderr = new PrintWriter(callbacks.getStderr(), true);
// 打印信息在UI控制台页面 Output and Errors
stdout.println("Hello Demo1 Extender !");
stderr.println("Error Info Show.");
}
@Override
public void processHttpMessage(int i, boolean b, IHttpRequestResponse iHttpRequestResponse) {
//设置http监听模块为Burpsuiteproxy模块
if (i == IBurpExtenderCallbacks.TOOL_PROXY) {
if (b) { //对请求包进行处理
//获取协议 端口 和主机名
IHttpService service = iHttpRequestResponse.getHttpService();
stdout.println("=============***============= Protocol host port :" + service.getProtocol() + " " + service.getHost() + " " + service.getPort());
//对消息体进行解析,messageInfo是整个HTTP请求和响应消息体的总和,各种HTTP相关信息的获取都来自于它,HTTP流量的修改都是围绕它进行的。
IRequestInfo analyzeRequest = helpers.analyzeRequest(iHttpRequestResponse);
// 获取参数
List<IParameter> parameList = analyzeRequest.getParameters();
//获取参数 、遍历参数
for (IParameter para : parameList) {
//获取参数
String key = para.getName();
//获取参数值(value)
String value = para.getValue();
int type = para.getType();
stdout.println("parameters key value type :" + key + " " + value + " " + type);
}
// 更新拦截处理后的数据 +
IRequestInfo analyIRequestInfo = helpers.analyzeRequest(iHttpRequestResponse);
//获取整个请求数据内容
String request = null;
try {
request = new String(iHttpRequestResponse.getRequest(), "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
//通过上面的analyIRequestInfo得到请求数据包体(body)的起始偏移
int bodyOffset = analyIRequestInfo.getBodyOffset();
//通过起始偏移点得到请求数据包体(body)的内容
byte[] body = null;
try {
body = request.substring(bodyOffset).getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
//通过上面的analyIRequestInfo得到请求数据的请求头列表
List<String> headers = analyIRequestInfo.getHeaders();//获取http请求头的信息
//生成X-Forwarded-For请求头 包括请求头的key(X-Forwarded-For)及随机生成的IP
String xForwardFor = "X-Forwarded-For: " + RandomIP.getRandomIP();
//新增header头, 添加x-forwarded-for请求头,伪造客户端IP测试
headers.add(xForwardFor);
headers.add("Test-Head: I am a test data!!!");
//遍历请求头
for (String header : headers) {
stdout.println("header : " + header);
}
//重新构造了请求数据
byte[] newRequest = helpers.buildHttpMessage(headers, body);
//打印出重新构造的请求数据测试
stdout.println(helpers.analyzeRequest(newRequest).getHeaders());
//重新构造的新请求数据, 因为里面已经包含有我们添加的X-Forward-For
iHttpRequestResponse.setRequest(newRequest);
} else {//对响应包进行处理
// Response
IResponseInfo analyzeResponse = helpers.analyzeResponse(iHttpRequestResponse.getResponse());
//获取响应码信息
short statusCode = analyzeResponse.getStatusCode();
stdout.println("status= " + statusCode);
//获取响应头信息
List<String> headers = analyzeResponse.getHeaders();
for (String header : headers) {
stdout.println("header:" + header);
}
// 获取响应信息
String resp = new String(iHttpRequestResponse.getResponse());
int bodyOffset = analyzeResponse.getBodyOffset();
String body = resp.substring(bodyOffset);
stdout.println("response body=" + body);
}
}
}
// 用于注册插件状态监听,在卸载插件时会执行
public void extensionUnloaded() {
String fileName = "D:\\testData\\example.txt";
String fileContent = "The Demo1 extension removed!";
try {
FileWriter fileWriter = new FileWriter(fileName);
fileWriter.write(fileContent);
fileWriter.close();
System.out.println("Successfully wrote to the file.");
} catch (IOException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
}
}
案例2 —— 高亮、新标签界面
高亮非常简单:
iHttpRequestResponse.setHighlight("red");
iHttpRequestResponse.setHighlight("yellow");
iHttpRequestResponse.setHighlight("blue");
// ...
新标签界面:
如果想要实现在请求和响应界面加一个新标签页来展示自定义信息,那么就需要了解IMessageEditorTab接口及setMessage方法,
Burp的IMessageEditorTab接口是用于扩展 Burp Suite 的请求/响应编辑器的一种方式,通过实现该接口可以向编辑器中添加自定义的标签页,实现自定义的请求/响应内容编辑功能。
IMessageEditorTab 接口中的setMessage方法用于设置当前编辑器中显示的请求/响应内容。该方法的签名如下:
void setMessage(byte[] message, boolean isRequest);
其中:
message 参数表示要设置的请求/响应内容的字节数组;isRequest 参数表示设置的内容是请求还是响应,- 当 isRequest 参数为
true时,表示设置的是请求内容; - 当 isRequest 参数为
false时,表示设置的是响应内容。
- 当 isRequest 参数为
在实现 IMessageEditorTab 接口时,通常会在自定义的标签页中添加一个编辑器组件(如 TextArea),并在 setMessage 方法中将请求/响应内容设置到该组件中,从而在标签页中显示请求/响应内容。同时,还可以在自定义的标签页中添加一些其他的组件,比如按钮、复选框等,实现一些自定义的功能,如发送请求、解析响应等。
总之,通过实现 IMessageEditorTab 接口,并在其中实现 setMessage 方法,可以为 Burp Suite 的请求/响应编辑器添加自定义的标签页及编辑功能,从而提高渗透测试的效率和精度。
插件的断点调试
- 通过命令打开Burp Suite;
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar [You path]\burpsuite_community.jar
在代码里面打上断点;
配置一个
Remote JVM Debug;


- 加载上插件,开始调试。
UI界面
感觉UI这块内容不少,我后期单独写一篇新博客吧。可以点赞支持我加速。
Reference
- https://portswigger.net/burp/extender/api/allclasses-noframe.html
- https://www.cnblogs.com/piaomiaohongchen/p/16869829.html
- https://github.com/ScriptKid-Beta/Unexpected_information
- https://cloud.tencent.com/developer/article/2007405
- https://www.cnblogs.com/olivexiao/p/15194467.html
- https://cloud.tencent.com/developer/article/2007403
- https://gv7.me/articles/2017/classification-of-burp-apis/
- https://github.com/bit4woo/burp-api-drops
Burp Suite Extension Development Guide的更多相关文章
- Burp Suite Extension tools
1.Setting up the envrionment for burp Extensions before we can write extensions we need to ensure ...
- Burp Suite使用介绍
Burp Suite使用介绍(一) 22人收藏 收藏 2014/05/01 19:54 | 小乐天 | 工具收集 | 占个座先 Getting Started Burp Suite 是用于攻击web ...
- Burp Suite之Intruder模块(四)
Burp Suite之Intruder模块(三) Intruder介绍: Burp intruder是一个强大的工具,用于自动对Web应用程序自定义的攻击.它可以用来自动执行所有类型的任务您的测试过程 ...
- Burp Suite使用介绍总结
Burp Suite使用介绍(一) 小乐天 · 2014/05/01 19:54 Getting Started Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些 ...
- Burp Suite初探
Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程. 一.安装部署 需要配置java环境,首先安装java,然后配置 ...
- Burp Suite安装&环境配置&启动&浏览器设置代理
一.简述 Burp Suite是一款使用Java编写的,用于Web安全审计与扫描套件.它集成了诸多实用的小工具以完成http请求的转发/修改/扫描等,同时这些小工具之间还可以 互相协作,在BurpSu ...
- 基于实战的Burp Suite插件使用Tips
基于实战的Burp Suite插件使用技巧 本篇文章首发于奇安信攻防社区 目录 基于实战的Burp Suite插件使用技巧 免责声明: 0×00前言 0×01专业版激活 0×02插件的环境安装 0×0 ...
- Burp Suite新手指南
Burp Suite想必大家都用过,但是大家未必知道它的所有功能.因此,本文的主要目的就是尽量深入介绍各种功能.BurpSuite有以下这些功能: 截获代理– 让你审查修改浏览器和目标应用间的流量. ...
- Burp Suite使用详解一
本文由阿德马翻译自国外网站,请尊重劳动成果,转载注明出处 Burp Suite是Web应用程序测试的最佳工具之一,其多种功能可以帮我们执行各种任务.请求的拦截和修改,扫描web应用程序漏洞,以暴力破解 ...
- Burp Suite 使用教程(上传突破利器)
Burp Suite是一个免费的网站攻击工具. 它包括proxy.spider.intruder.repeater四项功能.该程序使用Java写成,需要 JRE 1.4 以上版本 下载该程序的源代码, ...
随机推荐
- 泰裤辣!!!手摸手教学,如何训练一个你的专属AI歌姬~
最近在做AIGC的项目,不过是与图片相关的,现在的模型效果可比前几年图片替换效果好多了.之前尝试过用 faceswap 工具来进行人脸替换的,具体可以参看下我之前的这篇文章:https://blog. ...
- 文心一言 VS 讯飞星火 VS chatgpt (28)-- 算法导论5.1 3题
三.假设你希望以1/2的概率输出0与 1.你可以自由使用一个输出0或1的过程 BIASED-RANDOM.它以某概率 p 输出1,概率 1-p 输出0,其中 0<p<1 ,但是 p 的值未 ...
- 如何在.net6webapi中配置Jwt实现鉴权验证
JWT(Json Web Token) jwt是一种用于身份验证的开放标准,他可以在网络之间传递信息,jwt由三部分组成:头部,载荷,签名.头部包含了令牌的类型和加密算法,载荷包含了用户的信息,签名则 ...
- 2023-06-10:给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示 在节点网络中,只有当 graph[i][j] = 1 时,节点 i 能够直接连接到另一个节点 j。
2023-06-10:给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示 在节点网络中,只有当 graph[i][j] = 1 时,节点 i 能够直接连接到另一个节点 j. ...
- SpringBoot定义优雅全局统一Restful API 响应框架六
闲话不多说,继续优化 全局统一Restful API 响应框架 做到项目通用 接口可扩展. 如果没有看前面几篇文章请先看前面几篇 SpringBoot定义优雅全局统一Restful API 响应框架 ...
- C/S架构和B/S架构两种数字孪生技术路线的区别是什么?
山海鲸创造了一种CS和BS热切换的编辑模式,即CSaaS架构,可以在安装软件之后一键从软件的CS状态切换为一个BS服务器,让私有化部署变得十分轻松.具体效果可以参照下面的视频: (https://ww ...
- substrate 编译出错unresolved import `sp_runtime::testing` failed to resolve: could not find `GenesisConfig` in `system`
error[E0432]: unresolved import `sp_runtime::testing` --> /Users/suyinrong/bitcoin-proj/substrate ...
- 基于瑞芯微camera文章汇总pdf分享给大家
前面一段时间基于瑞芯微3568平台编写了camera系列文章, 一共12篇,目前更新完毕. <瑞芯微文章合集> camera系列文章编写前后一共花费2个月时间, 期间查阅了很多资料,做了很 ...
- 【Oracle】使用PL/SQL实现冒泡排序
[Oracle]使用PL/SQL实现冒泡排序 一般来说,SQL要排序的话直接使用order by即可 不一般来说,就是瞎搞,正好也可以巩固自己的数据结构基础 存储包内容如下 规范: create or ...
- Collection 接口及其常用方法
Collection 接口的特点 Collection接口没有直接实现类,提供了更具体的子接口(如Set和List)的实现.Collection实现类(通常通过其中一个子接口间接实现Collectio ...