跳到主要内容

增加非预期Payload插入点

实现效果

从上一个实例可以看出,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 接口

参考