JAVA BP插件开发(一):基础插件开发

这篇具有很好参考价值的文章主要介绍了JAVA BP插件开发(一):基础插件开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文会包括BP插件开发流程及打包,API,javaswing(UI)部分的内容。阅读完本文后,读者将初步具有开发BP插件的能力。

1 开始开发

我们使用IDEA作为开发工具(使用其他IDE也绰绰有余)。

引入依赖包:net.portswigger.burp.extender:burp-extender-api

包的版本见:

https://mvnrepository.com/artifact/net.portswigger.burp.extender/burp-extender-api

如果使用Gradle管理包,可以这样书写(build.gradle):

plugins {
    id 'java'
}

group 'burp'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'net.portswigger.burp.extender:burp-extender-api:1.7.13' //重点部分
}

test {
    useJUnitPlatform()
}

也就是IDEA新建一个gradle项目然后将上文替换build.gradle文件,然后点击构建即可:

java插件化开发,Java,BurpSuite插件开发(Java),web安全,java,Powered by 金山文档

如果新建的gradle项目中没有类似这样的结构(就是放java文件的地方):

java插件化开发,Java,BurpSuite插件开发(Java),web安全,java,Powered by 金山文档

请参考:

https://blog.csdn.net/qq_40548227/article/details/124741311

2 API文档

首先,BP本身自带了一个API DOC,在这里:

java插件化开发,Java,BurpSuite插件开发(Java),web安全,java,Powered by 金山文档

它有几个缺点:

  • 全英文

  • 没有代码示例

其次,PortSwigger自己在github上有很多示例插件,如:

https://github.com/PortSwigger/example-hello-world

它也有缺点:

  • 全英文

所以最重要的还是英语要好- -。

3 代码规范与基础插件构建

首先BP插件有两个规范:

  • 插件的主类名为BurpExtender,实现接口IBurpExtender

  • 插件的包名为burp

一个基础的BP插件结构及代码如下所示:

java插件化开发,Java,BurpSuite插件开发(Java),web安全,java,Powered by 金山文档

在这个基础上,我们开始构建一个基础的插件。

3.1 插件注册时

指的即是插件的“入口函数”registerExtenderCallbacks执行时。一般可以在此函数执行时打印作者信息并获取IExtensionHelpers(用于分析请求和响应)。

这是一段示例代码:

package burp;

import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;

public class BurpExtender implements IBurpExtender{

    private static IExtensionHelpers helpers;
    private static PrintWriter so;

    @Override
    public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
        BurpExtender.helpers=callbacks.getHelpers(); //获取helpers
        BurpExtender.so=new PrintWriter(callbacks.getStdout(), true); //获取输出
        callbacks.setExtensionName("示例插件");
        BurpExtender.so.println("@name 示例插件");
        BurpExtender.so.println("@author AugustTheodor");
    }
}

将输入输出与扩展帮助对象(PrintWriter so与IExtensionHelpers helpers)存储为类变量,这样可以在其他类中直接进行调用。

3.2 监听请求与响应

负责监听请求与相应的监听器为IHttpListener,我们需要在主函数中注册监听器,如:

callbacks.registerHttpListener(new IHttpListener() {
    @Override
    public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
        
    }
}); //注册HTTP监听器

继承此接口后,需要实现方法processHttpMessage,这个方法在每个请求经过时被调用,传入int toolFlag(请求经过的组件对应的id,如proxy、repeater,其值定义在IBurpExtenderCallbacks)、boolean messageIsRequest(这个包是否是请求包(false则为响应))、IHttpRequestResponse messageInfo(包的具体信息,可用于分析)。

以下是一个processHttpMessage处理HTTP请求与相应的范例,它会将所有经过PROXY的请求与相应打印到输出界面(需要注意的是getRequest与getResponse返回的是byte[]而非String,需要进行处理才能够读取到字符串形式)

@Override
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
    if(messageIsRequest){
        //处理请求
        if(toolFlag==IBurpExtenderCallbacks.TOOL_PROXY){
            //过滤PROXY之外的请求,只处理经过PROXY的请求
            BurpExtender.so.println(new String(messageInfo.getRequest(), StandardCharsets.UTF_8).intern());
        }
    }else{
        //处理响应
        if(toolFlag==IBurpExtenderCallbacks.TOOL_PROXY){
            BurpExtender.so.println(new String(messageInfo.getResponse(), StandardCharsets.UTF_8).intern());
        }
    }
}

当然,我们不光可以监听请求与相应,还可以修改它们。我们使用以下的方法设置请求与响应(在处理响应时不可设置请求,并且这里设置的也是byte[]的形式)

messageInfo.setResponse();
messageInfo.setRequest();

#3.3 修改Content-Length

在修改修改请求与响应的body部分中,有一个非常容易被忽略的步骤:修改Content-Length。如果不修改此头部,就很容易导致服务器响应异常和浏览器解析异常。所以在更新完body内容后需要重新计算body长度并修改Content-Length头的内容。

以下是一段处理响应中body并更新Content-Length头的代码(对于请求的处理方式是相同的):

@Override
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
    if(messageIsRequest){
        //处理请求
        byte[] response=messageInfo.getResponse();
        //获取response的byte
        IResponseInfo info=BurpExtender.helpers.analyzeResponse(response);
        //获取响应相关信息
        String head=new String(Arrays.copyOfRange(response,0,info.getBodyOffset()),StandardCharsets.UTF_8).intern();
        String body=new String(Arrays.copyOfRange(response,info.getBodyOffset(),response.length), StandardCharsets.UTF_8).intern();
        //分别获取head与body的String内容
        body=do_sth_with_body(body);
        //处理body
        String ori_CL="";
        //用于保存原本的Content-Length
        List<String> headers=helpers.analyzeResponse(response).getHeaders();
        for (String h:headers) {
            if(h.contains("Content-Length")){
                ori_CL=h;
                break;
            }
        }
        //获取Content-Length的原值
        String new_CL="Content-Length: "+String.valueOf(body.getBytes().length);
        //新的Content-Length
        head=head.replace(ori_CL,new_CL);
        //替换头部
        byte[] new_response=(head+body).getBytes();
        messageInfo.setResponse(new_response);
    }
}

我们可以将这个过程简化成一个工具函数:

byte[] tool_update_content_length(String head,String body,String new_body){
    //此函数自动更新Content-Length
    String ori_CL="";
    String new_CL="";
    List<String> headers= List.of(head.split("\n"));
    for (String h:headers) {
        if(h.contains("Content-Length")){
            ori_CL=h;
            break;
        }
    }
    new_CL="Content-Length: "+new_body.getBytes().length;
    //新的Content-Length
    head=head.replace(ori_CL,new_CL);
    //替换头部
    return (head+body).getBytes();
}

3.4 打包

使用下图的命令即可:

./gradlew build

4 UI

这个部分没有什么详细说的必要,就跟大学大作业画面板差不多。需要提的也就是几个踩雷点。

4.1 如何创建插件自己的标签页

需要使用ITab接口,并在入口函数中添加标签页:

call.addSuiteTab(this);

示例:

public class BurpExtender implements IBurpExtender,ITab{

    private static IExtensionHelpers helpers;
    private static PrintWriter so;

    @Override
    public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
        BurpExtender.helpers=callbacks.getHelpers(); //获取helpers
        BurpExtender.so=new PrintWriter(callbacks.getStdout(), true); //获取输出
        callbacks.setExtensionName("示例插件");
        callbacks.addSuiteTab(this); //一个插件可以有好几个Tab,比如我这里使用两次就会有两个Tab
        BurpExtender.so.println("@name 示例插件");
        BurpExtender.so.println("@author AugustTheodor");
    }

    @Override
    public String getTabCaption() {
        return "标签页名字";
    }

    @Override
    public Component getUiComponent() {
        //返回的是一个JAVA UI 组件,作为标签页显示的内容
        return null;
    }
}

4.2 AWT与SWING

java有两个UI组件包,一个是awt,一个是swing。这两个组件包里的组件混用时可能会出现意想不到的BUG(比如说JComboBox的选项一直弹不出来)。

4.3 JTable

我们可能会使用JTable绘制表格实现类似Proxy中列表的效果,如:

java插件化开发,Java,BurpSuite插件开发(Java),web安全,java,Powered by 金山文档

但原始表格里的元素默认是表现为TextField的。下面给出在表格中插入选择框与复选框的一个方法:

4.3.1 复选框

这个东西:

java插件化开发,Java,BurpSuite插件开发(Java),web安全,java,Powered by 金山文档

继承JTableModel,将需要类型为复选框的列Class置为Boolean:

public class ATableModel extends DefaultTableModel{

    private final Class[] tableClass={Boolean.class,String.class,String.class,String.class,String.class,String.class};
    //需要表现为复选框的列类型为Boolean

    @Override
    public int getColumnCount() {
        return this.tableClass.length;
    }

    @Override
    public String getColumnName(int columnIndex) {
        return L18n.getInstance().columns[columnIndex];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return this.tableClass[columnIndex];
    }

}

然后在实例化JTable时传入此Model的实例:

JTable table=new JTable(new ATableModel());
4.3.2 选择框

这个:

java插件化开发,Java,BurpSuite插件开发(Java),web安全,java,Powered by 金山文档

使用此语句:文章来源地址https://www.toymoban.com/news/detail-721492.html

table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(new JComboBox<>(L18n.getInstance().operator)));

到了这里,关于JAVA BP插件开发(一):基础插件开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WEB攻防-JS应用&算法逆向&三重断点调试&调用堆栈&BP插件发包&安全结合

    1、JavaScript-作用域调用堆栈 2、JavaScript-断点调试全局搜索 3、JavaScript-Burp算法模块使用 简单来说就是运行后相关的数据值 简单来说就是代码的执行逻辑顺序 这四种方法针对不同对象(搜索一般用来对付简单的,复杂点的就得用断点了) -代码全局搜索 -文件流程断点(执行的代码

    2024年02月05日
    浏览(37)
  • web漏洞-java安全(41)

     这个重点是讲关于java的代码审计,看这些漏洞是怎么在java代码里面产生的。 #Javaweb 代码分析-目录遍历安全问题  这个漏洞原因前面文章有,这次我们看看这个漏洞如何在代码中产生的,打开靶场  解题思路就是通过文件上传,上传文件把它应该正常上传的路径进行修改,

    2024年02月15日
    浏览(20)
  • 【Java万花筒】Java安全卫士:从密码学到Web应用攻击

    在当今数字化时代,安全性至关重要,特别是对于Java开发者而言。本文将深入探讨Java安全与加密领域的关键库和技术,包括Bouncy Castle、Jasypt、Keycloak、Apache Shiro、Java Cryptography Extension (JCE)和OWASP Java Encoder。通过详细介绍各个库的功能、使用案例和实际代码示例,读者将获得

    2024年01月20日
    浏览(43)
  • 【Java 进阶篇】Java Web开发:实现验证码功能

    在Web应用程序中,验证码(CAPTCHA)是一种常见的安全工具,用于验证用户是否为人类而不是机器。验证码通常以图像形式呈现,要求用户在登录或注册时输入正确的字符。在这篇文章中,我们将详细介绍如何在Java Web应用程序中实现验证码功能。 验证码是“全自动区分计算机

    2024年02月03日
    浏览(29)
  • Java Web 安全实战:从登录到退出

    在当今互联网时代,用户信息安全至关重要。在Java Web开发中,Spring Security是一个强大且灵活的身份验证和访问控制框架,它可以帮助我们构建安全可靠的应用程序。本文将介绍如何使用Spring Security实现一个安全的Java Web应用,涵盖登录、记住我、授权、退出登录、验证码、

    2024年01月16日
    浏览(28)
  • Web安全--反序列化漏洞(java篇)

    序列化的意义就在于方便存储和传输,永久的保存到硬盘中,通常保存在一个文件中。 序列化:将java对象转换为字节序列的过程 反序列化:序列化的逆过程,从储存区读出字节序列还原成对象的过程 java应用在对用户的输入没有进行严格的检查时,即传入了不可信的数据做

    2024年02月09日
    浏览(41)
  • Java Web应用中的安全与防护

    Java Web应用是现代互联网应用的重要组成部分,它们为用户提供了丰富的功能和服务。然而,Java Web应用也面临着各种安全漏洞和攻击,这些漏洞和攻击可能导致数据泄露、信息盗用、系统破坏等严重后果。因此,Java Web应用的安全与防护是非常重要的。 在本文中,我们将从以

    2024年01月21日
    浏览(32)
  • Java web开发--springboot

    Java web开发--springboot Java有很多web框架 但是有的框架不是很好用:比如Java Servlets(个人感觉)不好调试,WEB-INF文件关联来关联去很烦躁,启动后 crtl+c还关闭不了(我一般习惯用ctrl+c命令来关闭服务).导致后面我调试springboot时一直报错,原来是Java Servlets的服务没关(我习惯性ctrl+c没关掉

    2024年02月13日
    浏览(27)
  • Java速成Web开发(二)

    前后端代码混合编写的技术 前端代码直接写 后端代码写在一对 % % 中 页面上动态展示的数据写在 % % 中 面试:jsp技术是前端技术还是后端技术 jsp的本质是一个servlet 所以一定是运行在服务器上,为后端技术 tomcat根据写的jsp自动生成了一一对应的servlet 面试:九大隐含对象 隐

    2024年02月11日
    浏览(27)
  • 基于docker的apisix网关的java插件开发

    java插件示例demo         将java插件示例demo拉取下来后,我们找到 DemoFilter.java 文件,在这个文件中可以修改过滤器的名称,为了方便测试,其他的文件暂时不需要修改。后期等过滤器调通后,可在过滤器中编写代码来实现自己的业务需求。过滤器名称为 AuthFilter ,后面在

    2024年01月19日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包