Her0in · 2016/05/27 16:53

此文接着 《BurpSuite插件开发指南之 API 下篇》 。在此篇中将会介绍如何使用Java 开发 BurpSuite 的插件,重点会介绍利用 Java 的 Swing 包开发带有 GUI 的 Burp 插件。

《BurpSuite 插件开发指南》系列文章如下:

  • 《BurpSuite插件开发指南之 API 篇》
  • 《BurpSuite插件开发指南之 Java 篇》
  • 《BurpSuite插件开发指南之 Python 篇》

注:此系列文章是笔者利用业余时间所写,如有错误,望读者们及时指正,另外此系列文章属于入门级别的科普文,目的是普及Burp插件的编写技术。

0x00 Java 接口简介


知其然更要知其所以然。在真正动手编写 Burp 插件之前,有必要对Burp提供的各个接口有一定的了解,同时要有一定的编程经验和能力。那么,在此篇中读者则有必要了解 Java 的接口技术。

接口(英文:Interface)在 Java 编程语言中是一个比较抽象的东西。熟悉 OOP 的同学可以用“类”的思想来理解接口。但是,要明白的是,类与接口有相似的地方同时也有很多不同的地方。

接口的声明

接口的声明语法格式如下:

#!java
[可见度] interface 接口名称 [extends 其他的类名] {// 声明变量// 抽象方法
}
复制代码

例如,Burp 的 接口声明原型如下:

#!java
package burp;public interface IBurpExtender
{void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks);
}
复制代码

接口的实现

一个接口可以被另外一个接口继承,也可以被一个类实现。当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。不熟悉Java编程的读者要牢记这几点。

实现一个接口的语法如下:

#!java
... implements 接口名称[, 其他接口1, 其他接口2..., ...] ...
复制代码

例如,编写 Burp 插件必须编写的 BurpExtender 类实现 IBurpExtender 和 IProxyListener 接口代码如下:

#!java
package burp;public class BurpExtender implements IBurpExtender, IProxyListener{// 实现 IBurpExtender 接口的 registerExtenderCallbacks 方法@Overridepublic void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {// TODO here}// 实现 IProxyListener 接口的 processProxyMessage 方法@Overridepublic void processProxyMessage(boolean messageIsRequest,IInterceptedProxyMessage message) {// TODO here}
}
复制代码

需要注意的是,在Burp提供的接口文档中,并不是所有的接口都可以用类实现,只有在接口的描述中说明了“该接口可以被实现”时,所对应的接口才可以被你所编写的类实现其方法。

0x01 Java Swing 和 AWT 包简介


Java Swing 是 Java Foundation Classes(JFC)的一部分。在 Swing 中,包含了很多强大灵活的,跨平台的 GUI 控件。Swing 组件遵循(MVC)模型 - 视图 - 控制器架构,并提供了三个通用的顶层容器类 JFrame,JDialog 和 JApplet。在开发带有 GUI 的 BurpSuite 插件时,一般不会直接用到这三个顶层容器类,具体要看个人的设计和需求。

下面是一些最常用的控件:

  • JLabel 标签控件,JLabel 的对象是在容器中放置一个文本标签。
  • JButton 按钮控件。
  • JColorChooser 颜色选择控件,用于让用户操作和选择颜色。
  • JCheckBox 选择框控件,支持分组。
  • JRadioButton 单选框控件,支持分组。
  • JList 列表控件。
  • JComboBox 组合框控件。
  • JTextField 文本框控件。
  • JPasswordField 密码输入框控件。
  • JTextArea 多行文本控件。
  • ImageIcon 绘制图标的控件。
  • JScrollbar 滚动条控件,支持水平和垂直滚动。
  • JFileChooser 选择文件对话框。
  • JProgressBar 进度条控件。
  • JPanel 面板控件,此控件在开发插件时会经常用到。

Swing 是在 AWT 的基础上构建的一套新的图形界面系统,所以 AWT 是 Java 实现图形界面的基础,图形控件的事件监听和响应也是由 AWT 完成的。不过,编写 Burp 插件所用到的图形组件和事件并不多,很容易上手。

有关更多 GUI 组件的知识,请读者自行百度了解。在此不做过多阐述。

0x02 自定义 Burp UI 标签


编写 GUI 的 Burp 插件在实际使用时更加易于操作和表达信息。当然,编写起来也十分简单,只需遵循一定的“套路”,就可以了。

最终编写好的基本的样式如下图所示:

代码如下:

#!java
/**  BurpSuite 插件开发指南之 Java 篇*  writend by Her0in */
package burp;import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.PrintWriter;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;public class BurpExtender implements IBurpExtender, ITab{public PrintWriter stdout;public IExtensionHelpers hps;public IBurpExtenderCallbacks cbs;public JPanel jPanelMain;@Overridepublic void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks)         {callbacks.setExtensionName("BurpExtender");this.hps = callbacks.getHelpers();this.cbs = callbacks;this.stdout = new PrintWriter(callbacks.getStdout(), true);this.stdout.println("hello burp!");SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {jPanelMain = new JPanel();JButton jButton = new JButton("老司机,快点我!");jButton.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e){stdout.println("哔...");}});// 将按钮添加到 主面板 jPanelMain 中. jPanelMain.add(jButton);// 设置自定义组件并添加标签cbs.customizeUiComponent(jPanelMain);cbs.addSuiteTab(BurpExtender.this);}});}// 实现 ITab 接口的 getTabCaption 方法@Overridepublic String getTabCaption() {return "Burp 标签测试";}// 实现 ITab 接口的 getUiComponent 方法@Overridepublic Component getUiComponent() {return jPanelMain;}
}
复制代码

从上述代码中,读者也能够看到,Java 的 Swing 图形编程有点蛋疼,需要一层层的编写。首先需要添加一个 JPanel 上去,然后在这个 JPanel 中再添加图形组件,如果还有上层的图形组件,则需要再添加一个 Panel 类型的控件。

在这里有一个比较快速编写 Burp GUI插件的方法,先利用 NetBeans IDE 将图形界面拖拽式的写好,然后将上述显示控件的代码替换为显示这个 JFrame 的代码。之后编写相关的事件响应代码。

0x03 BurpSuite插件开发实例之 JSON 水坑 检测插件


本小节,笔者将会使用一个实例来“抛砖引玉”式的描述编写带有 GUI 的 Burp 插件。读者可以把关注点放在图形控件的放置顺序和事件处理上,可以无视 JSON 水坑检测的逻辑是否严谨以及误报率,准确率是否科学等问题。

最终编写好的插件如下图:

顶部的控件是一个表格列表控件,会放置检测到的结果。下面两个 ITextEditor 分别显示当前 HTTP 数据包的请求信息和响应信息。

代码就直接贴出来吧,如下:

#!java
/**  BurpSuite 插件开发指南之 Java 篇*  writend by Her0in */
package burp;import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Rectangle;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.io.PrintWriter;
import java.util.Vector;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;public class BurpExtender implements IBurpExtender, ITab, IHttpListener{public PrintWriter stdout;public IExtensionHelpers hps;public IBurpExtenderCallbacks cbs;public IRequestInfo iRequestInfo;public IResponseInfo iResponseInfo;public JPanel jPanel_top;public JTabbedPane jTabbedPane; public JScrollPane jScrollPane;public JSplitPane jSplitPaneV;// 自己封装一个 Table 控件private Her0inTable jsonTable;//请求,响应信息显示public JPanel jPanel_reqInfo_left;public JPanel jPanel_respInfo_right;public JSplitPane jSplitPaneInfo;public ITextEditor iRequestTextEditor;public ITextEditor iResponseTextEditor;Boolean bFind = false;String strTags = "";@Overridepublic void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {callbacks.setExtensionName("JSON 水坑检测");this.hps = callbacks.getHelpers();this.cbs = callbacks;this.stdout = new PrintWriter(callbacks.getStdout(), true);this.stdout.println("hello burp!");SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {// 初始化垂直分隔面板jSplitPaneV = new JSplitPane(JSplitPane.VERTICAL_SPLIT, true);jSplitPaneV.setDividerLocation(0.5);jSplitPaneV.setOneTouchExpandable(true);// 垂直分隔面板的顶部jPanel_top = new JPanel();// 设置垂直分隔面板顶部的子控件// 放置表格控件jTabbedPane = new JTabbedPane();// 初始化 Burp 提供的 ITextEditor 编辑器接口iRequestTextEditor = cbs.createTextEditor();iRequestTextEditor.setEditable(false);iResponseTextEditor = cbs.createTextEditor();iResponseTextEditor.setEditable(false);// 初始化 jsonTablejsonTable = new Her0inTable(iRequestTextEditor, iResponseTextEditor, stdout);// 最好放置一个 JScrollPaneJScrollPane jScrollPane1 = new JScrollPane(jsonTable.getTab());jScrollPane1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);jScrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);jTabbedPane.scrollRectToVisible(new Rectangle(500, 70));jTabbedPane.addTab("JSON 水坑检测", jScrollPane1);jScrollPane = new JScrollPane(jTabbedPane);jScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);jScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);jPanel_top.add(jScrollPane, BorderLayout.CENTER);jPanel_top.setLayout(null);// 添加componentResized事件 否则在改变Burp 主窗口大小时会错位jPanel_top.addComponentListener(new ComponentListener() {@Overridepublic void componentShown(ComponentEvent e) {}@Overridepublic void componentResized(ComponentEvent e) {if(e.getSource() == jPanel_top){jScrollPane.setSize(jPanel_top.getSize().width - 5,jPanel_top.getSize().height - 5);                           jScrollPane.setSize(jPanel_top.getSize().width - 10,jPanel_top.getSize().height - 10);}}@Overridepublic void componentMoved(ComponentEvent e) {// TODO Auto-generated method stub}@Overridepublic void componentHidden(ComponentEvent e) {// TODO Auto-generated method stub  }});// 设置垂直分隔面板底部的子控件// 显示请求/响应 信息的水平分隔面板初始化jSplitPaneInfo = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true);jSplitPaneInfo.setDividerLocation(0.5);jSplitPaneInfo.setOneTouchExpandable(true); // 初始化 请求,响应信息显示 面板                             jPanel_reqInfo_left = new JPanel();jPanel_respInfo_right = new JPanel();jPanel_reqInfo_left.setLayout(new BorderLayout());jPanel_respInfo_right.setLayout(new BorderLayout());// 将 Burp 提供的 ITextEditor 编辑器 添加到请求,响应信息显示 面板中jPanel_reqInfo_left.add(iRequestTextEditor.getComponent(),BorderLayout.CENTER);jPanel_respInfo_right.add(iResponseTextEditor.getComponent(),BorderLayout.CENTER);// 分别添加 请求,响应信息显示 面板 到 垂直分隔面板底部jSplitPaneInfo.add(jPanel_reqInfo_left, JSplitPane.LEFT);jSplitPaneInfo.add(jPanel_respInfo_right, JSplitPane.RIGHT);// 最后,为垂直分隔面板添加顶部面板和水平分隔面板jSplitPaneV.add(jPanel_top, JSplitPane.TOP);jSplitPaneV.add(jSplitPaneInfo, JSplitPane.BOTTOM);// 设置自定义组件并添加标签cbs.customizeUiComponent(jSplitPaneV);cbs.addSuiteTab(BurpExtender.this);}});callbacks.registerHttpListener(this);}// 实现 ITab 接口的 getTabCaption 方法@Overridepublic String getTabCaption() {return "JSON 水坑检测";}// 实现 ITab 接口的 getUiComponent 方法@Overridepublic Component getUiComponent() {return jSplitPaneV;}public void CheckJson(IHttpRequestResponse messageInfo) {try {this.iRequestInfo = this.hps.analyzeRequest(messageInfo);this.iResponseInfo = this.hps.analyzeResponse(messageInfo.getResponse());   } catch (Exception e) {return ;}//            stdout.println(messageInfo.getHttpService().getHost());this.bFind = false;java.util.List<IParameter> listIParameters = iRequestInfo.getParameters();  strTags = "";for (IParameter param : listIParameters) {String strName = param.getName().toLowerCase();if(strName.indexOf("callback") != -1 || strName.indexOf("_callback") !=-1 ||strName.indexOf("cb") !=-1 || strName.indexOf("_cb") != -1 ||strName.indexOf("huidiao") !=-1 ){strTags += "# find => " + strName;this.bFind = true;}}if(this.bFind){Vector<String> vectorRow = new Vector<String>();vectorRow.addElement(new String(Integer.toString(jsonTable.defaultTableModel.getRowCount())));vectorRow.addElement(new String(this.iRequestInfo.getUrl().getHost()));vectorRow.addElement(new String(this.iRequestInfo.getMethod()));if(this.iRequestInfo.getUrl().getQuery() != null){vectorRow.addElement(new String(this.iRequestInfo.getUrl().getPath() + "?" + this.iRequestInfo.getUrl().getQuery()));}else{vectorRow.addElement(new String(this.iRequestInfo.getUrl().getPath()));}vectorRow.addElement(new String(strTags));jsonTable.defaultTableModel.addRow(vectorRow);jsonTable.iHttpList.add(messageInfo);}}@Overridepublic void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {if (!messageIsRequest) {//JSON 检测this.CheckJson(messageInfo);}}
}
复制代码

BurpSuite插件开发指南之 Java 篇相关推荐

  1. Java工程师学习指南(中级篇)

    Java工程师学习指南 中级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我写的文章都是站 ...

  2. Cordova跨平台Web App开发指南(安卓篇)

    Cordova跨平台Web App开发指南(安卓篇) 打包ios包必须用苹果系统,没钱买IOS设备,这里只介绍Android平台打包 一.Cordova简介' 在进行Cordova开发之前, 先花点时 ...

  3. Spark性能优化指南:基础篇

    前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作 ...

  4. 奇舞周刊第 424 期:Sketch 插件开发指南

    记得点击文章末尾的" 阅读原文 "查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ Sketch 插件开发指南 众所周知,Sketch 是 UED 设计工具,大多 ...

  5. android 小插件开发,Android Gradle 插件开发指南

    原标题:Android Gradle 插件开发指南 2018安卓巴士全球开发者论坛-成都站 安卓巴士全球开发者论坛成都站即将开启! 作为Android开发者,你可能见过无数个apply plugin: ...

  6. map根据value值排序_凯哥带你从零学大数据系列之Java篇---第十九章:集合(Map+Collections)...

    温馨提示:如果想学扎实,一定要从头开始看凯哥的一系列文章(凯哥带你从零学大数据系列),千万不要从中间的某个部分开始看,知识前后是有很大关联,否则学习效果会打折扣. 系列文章第一篇是拥抱大数据:凯哥带你 ...

  7. 当NLPer爱上CV:后BERT时代生存指南之VL-BERT篇

    当NLPer爱上CV:后BERT时代生存指南之VL-BERT篇 小鹿鹿lulu 被数学/NLP/炼丹持续折磨的吃货一枚 前言 BERT的出现让NLP发展实现了一个大飞跃,甚至有大佬说NLP已经没有可以 ...

  8. amd860k能装黑苹果吗_黑苹果配置 篇六:黑苹果硬件选购指南之终篇--2019年8月

    黑苹果配置 篇六:黑苹果硬件选购指南之终篇--2019年8月 2019-08-17 17:31:38 26点赞 238收藏 33评论 你是AMD Yes党?还是intel和NVIDIA的忠实簇拥呢?最 ...

  9. Hyperic HQ HQU 插件开发指南

    推荐 由Hyperic HQ 国内独家代理商北京铸锐数码科技有限公司提供.适用于Hyperic HQ开发人员,不但讲述了什么是HQU,如何开发Hyperic HQU插件还提供了示例.是Hyperic ...

最新文章

  1. flutter中的生命周期
  2. windows系统中查看linux分区的三种方式
  3. linux 后台任务 运行 关闭 查看
  4. php删除文件指令,php – Symfony cache:清除命令更改文件夹所有者
  5. java 关闭语句_java.sql.SQLRecoverableException: 关闭的语句
  6. Java面向对象编程(高级)
  7. Oracle 进程 说明
  8. nginx安装nginx-vts实现监控并打包镜像
  9. c++将十进制存放在2个字节及多个字符中
  10. 微观经济学(第一课)笔记
  11. Activiti工作流画图工具介绍
  12. Excel怎么将两个表格数据合并为一个
  13. mysql中英混合排序+Java处理多音字
  14. 如何在PowerPoint中将自定义模板设置为默认模板
  15. 好课堂Scratch编程10 趣学篇(六)听题!格里芬的挑战
  16. opencv 实现的静态手势识别 进而玩剪刀石头布
  17. Matplotlib画图的复杂颜色设置(包括fig, ax, spines, tick)
  18. 华为交换机VLAN配置多个端口详细步骤
  19. 电影《绝望主夫》观后感
  20. java中实现同步的方法

热门文章

  1. oracle 作业 断开原因,解惑 | Oracle JOB 异常中断原因分析
  2. vetur插件_6款让开发效率“起飞的”VS code插件,哪个才是你的最爱
  3. css和js和html代码,网页代码中js和css指的是什么?
  4. Linux下的主辅DNS服务器同步
  5. 深入理解JVM虚拟机(四):Class类文件结构(一)
  6. linux系统硬盘数据恢复软件下载,Linux硬盘数据恢复软件
  7. unity调用普通java类_Unity中C#和Java的相互调用实例代码
  8. html获取text值_Python小程序2获取href的值
  9. IIS服务器下做301永久重定向设置方法[图解]
  10. BeanFactory笔记