实现效果
从上一个实例可以看出,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成功插入到我们设置的地方。
扩展总结
- 实现
IScannerInsertionPointProvider
接口即可 - 对应的插入点类需要实现
IScannerInsertionPoint
接口