实现效果

从上一个实例可以看出,Burpsuite在主动扫描时,本身会提供一些Payload插入点,但实际场景中,一些参数可能是组合到一起的,比如 a=bb%253dcc,这种情况下就只能识别到参数a,而不能识别到两次URL解码后的bb,那这种情况下就需要我们手动设置Payload插入点。

  • 手动增加Payload插入点并完成自动的编码解码。

涉及接口:

  • IScannerInsertionPointProvider
  • IScannerInsertionPoint

实现代码

创建项目过程省略,直接从代码入手,使用旧版API开发。

package burp;

import java.util.ArrayList;
import java.util.List;

public class BurpExtender implements IBurpExtender, IScannerInsertionPointProvider {
    // 回调对象
    private IBurpExtenderCallbacks callbacks;
    // 辅助类,一般用于辅助分析数据包结构
    private IExtensionHelpers helpers;

    // 实现 IBurpExtender 接口函数
    @Override
    public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
        // 设置插件名字
        callbacks.setExtensionName("Demo");

        // callbacks到处都要用,搞成类变量
        this.callbacks = callbacks;

        // 辅助类,一般用于辅助分析数据包结构,类变量方便其他函数调用
        helpers = callbacks.getHelpers();

        // 注册 ScannerInsertionPointProvider ,必须要注册了burp有新消息才会通知你
        callbacks.registerScannerInsertionPointProvider(this);
    }

    /**
     * Burp主动扫描时,会调用这个函数来获取Payload插入点
     *
     * @param baseRequestResponse 被主动扫描的基础请求
     * @return 我们自定义的新插入点
     */
    @Override
    public List<IScannerInsertionPoint> getInsertionPoints(IHttpRequestResponse baseRequestResponse) {
        // 返回结果
        List<IScannerInsertionPoint> insertionPoints = new ArrayList<>();
        // 如果存在参数 a,就增加插入点
        if (helpers.getRequestParameter(baseRequestResponse.getRequest(), "a") != null){
            insertionPoints.add(new CustomInsertionPoint(baseRequestResponse));
        }
        return insertionPoints;
    }

    private class CustomInsertionPoint implements IScannerInsertionPoint {
        private IHttpRequestResponse baseRequestResponse;
        private String aDecodeValue;
        public CustomInsertionPoint(IHttpRequestResponse baseRequestResponse) {
            this.baseRequestResponse = baseRequestResponse;
            // 2次URL解码后的参数
            aDecodeValue = helpers.urlDecode(helpers.urlDecode(helpers.getRequestParameter(baseRequestResponse.getRequest(), "a").getValue()));

        }

        // 返回插入点的名字
        @Override
        public String getInsertionPointName() {
            return "URLEncode-two-times input";
        }

        // 返回插入点的初始参数值
        @Override
        public String getBaseValue() {
            // 解码后的参数中的参数值,如原来参数为 a=bb%253dcc,那么 aDecodeValue 就是 bb=cc,baseValue就是cc
            return aDecodeValue.split("=")[1];
        }

        // 构建插入payload后的请求
        @Override
        public byte[] buildRequest(byte[] payload) {
            // 给payload加到等号后面,如 a=bb%253dcc ,添加后就是 a=bb%253d<payload>cc
            String prefix = aDecodeValue.substring(0, aDecodeValue.indexOf("=") + 1); // 前缀 bb=
            String suffix = aDecodeValue.substring(aDecodeValue.indexOf("=") + 1); // 后缀 cc
            String pocParam = prefix + helpers.bytesToString(payload) + suffix; // 插入payload
            // 2次url编码回去,生成新的参数
            String urlencodePocParam =  helpers.urlEncode(helpers.urlEncode(pocParam));
            // 生成新的请求
            return helpers.updateParameter(baseRequestResponse.getRequest(), helpers.buildParameter("a", urlencodePocParam, IParameter.PARAM_URL));
        }

        @Override
        public int[] getPayloadOffsets(byte[] payload) {
            return null;
        }

        @Override
        public byte getInsertionPointType() {
            return INS_EXTENSION_PROVIDED;
        }
    }
}

实现测试

发起主动扫描,可见payload成功插入到我们设置的地方。

image-20240922下午121037007

扩展总结

  • 实现 IScannerInsertionPointProvider 接口即可
  • 对应的插入点类需要实现 IScannerInsertionPoint 接口

参考

Copyright © d4m1ts 2023 all right reserved,powered by Gitbook该文章修订时间: 2024-09-28 14:12:16

results matching ""

    No results matching ""