实现效果
创建鼠标右键菜单,点击后,出现几个功能:
- 获取History中最新的Cookie并弹窗显示
- 增加XFF头
涉及接口:
- IContextMenuFactory
实现代码
创建项目过程省略,直接从代码入手,使用旧版API开发。
package burp;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class BurpExtender implements IBurpExtender, IContextMenuFactory {
// 回调对象
private IBurpExtenderCallbacks callbacks;
// 辅助类,一般用于辅助分析数据包结构
private IExtensionHelpers helpers;
// 实现 IBurpExtender 接口函数
@Override
public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
// 设置插件名字
callbacks.setExtensionName("Demo");
// callbacks到处都要用,搞成类变量
this.callbacks = callbacks;
// 辅助类,一般用于辅助分析数据包结构,类变量方便其他函数调用
helpers = callbacks.getHelpers();
// 注册 ContextMenuFactory ,必须要注册了burp有新消息才会通知你
callbacks.registerContextMenuFactory(this);
}
@Override
public List<JMenuItem> createMenuItems(IContextMenuInvocation invocation) {
// 定义菜单对象
List<JMenuItem> menuItems = new ArrayList<>();
// 判断点击鼠标右键的地方是否为repeater中
if (invocation.getToolFlag() != IBurpExtenderCallbacks.TOOL_REPEATER){
return menuItems;
}
// 创建子菜单-一级菜单
JMenuItem getCookie = new JMenuItem("getCookie");
getCookie.addActionListener(new getCookieAction(callbacks)); // 添加动作
// 创建子菜单-多级菜单
JMenu addXFF = new JMenu("XFF");
JMenuItem addXFFItem = new JMenuItem("addXFF");
addXFF.add(addXFFItem); // 多级菜单
addXFFItem.addActionListener(new addXFFAction(invocation, helpers)); // 添加点击实现逻辑
// 添加到菜单对象中
menuItems.add(getCookie);
menuItems.add(addXFF);
return menuItems;
}
/**
* 点击getCookie后执行的操作
*/
private class getCookieAction implements ActionListener {
private IBurpExtenderCallbacks callbacks;
public getCookieAction(IBurpExtenderCallbacks callbacks) {
this.callbacks = callbacks;
}
@Override
public void actionPerformed(ActionEvent e) {
// 获取所有的history
IHttpRequestResponse[] proxyHistory = callbacks.getProxyHistory();
// 拿到最新的
IHttpRequestResponse newHistory = proxyHistory[proxyHistory.length - 1];
// 拿到最新的请求包
String httpRequest = new String(newHistory.getRequest());
String[] httpRequestSplit = httpRequest.split("\r\n");
// 匹配到Cookie
String cookie = "";
for (String data: httpRequestSplit) {
if (data.startsWith("Cookie")) {
cookie = data;
break;
}
}
// 如果Cookie不为空,弹窗显示Cookie
if (!cookie.equals("")){
JOptionPane.showMessageDialog(null, cookie, "new cookie", JOptionPane.INFORMATION_MESSAGE);
}
}
}
/**
* 点击addXFF后执行的操作
*/
private class addXFFAction implements ActionListener {
private IContextMenuInvocation invocation;
private IExtensionHelpers helpers;
public addXFFAction(IContextMenuInvocation invocation, IExtensionHelpers helpers) {
this.invocation = invocation;
this.helpers = helpers;
}
@Override
public void actionPerformed(ActionEvent e) {
// 可以弹出一个框,让用户输入增加的IP;但此处主要为了演示使用,故不深入。
// 获取选中的请求
IHttpRequestResponse message = invocation.getSelectedMessages()[0];
// 获取请求
IRequestInfo requestInfo = helpers.analyzeRequest(message.getRequest());
// 获取header
List<String> headers = requestInfo.getHeaders();
// 添加header
headers.add("X-Forwarded-For: 1.2.3.4");
// 生成请求数据包,后面是body
byte[] newReq = helpers.buildHttpMessage(headers, Arrays.copyOfRange(message.getRequest(), requestInfo.getBodyOffset(), message.getRequest().length));
// 设置到显示面板中
message.setRequest(newReq);
}
}
}
实现测试
如果不在repeater中,无法显示菜单。
在repeater中可以显示菜单
点击 getCookie
后获取到history中最新的cookie
点击addXFF
,则在header最后增加了对应的XFF头。
扩展总结
callbacks
对象提供了很多实用的方法,burp里面的大多数数据都可以从它获取到(issues、history、scope、sitemap...),大多数操作也可以由它创建(主动扫描、爬虫任务...)。- 只需要实现
IContextMenuFactory
接口,然后创建对应的菜单和实现方法即可 - 可以通过
invocation
这个对象获取到选中的内容,从而进行各种操作(增删改查数据包、颜色、comment等)