Burp插件之SpringSpider项目分析
2023-1-17 13:55:30 Author: Pa55w0rd(查看原文) 阅读量:13 收藏

项目地址

https://github.com/whwlsfb/SpringSpider

编译安装过程

执行mvn install 命令

编译之后生成的文件

针对项目结构的分析

在burpExtender.java中核心五行代码调用逻辑,代码功能依次为设置插件界面、定义扫描器、注册扫描器、注册监听器。

    this.uiHandler = new UIHandler(this);    callbacks.addSuiteTab(this.uiHandler);            scanner = new SpringScanner();            callbacks.registerScannerCheck(scanner);            callbacks.registerExtensionStateListener(this);

同时代码结构也非常清晰

在界面绘制相关类中,UIHandler继承了burp的插件类,之后调用initUI函数完成了一系列的界面工作。

    public UIHandler(BurpExtender parent) {
this.parent = parent;
this.initUI();
}

接下来看Scanner的相关操作,及如何操作数据。Scanner实现burp的IScannerCheck接口中的doPassiveScan方法,深入如下代码,发现继续调用了子扫描接口。

    public List<IScanIssue> doPassiveScan(IHttpRequestResponse baseRequestResponse) {
if (ConfigUtils.getBoolean(ConfigUtils.ENABLE, true)) {
URL originUrl = cleanURL(Utils.Helpers.analyzeRequest(baseRequestResponse).getUrl());
List<IScanIssue> result = new ArrayList<>();
URL[] urls = Utils.splitUrls(originUrl);
for (URL url : urls) {
if (!isChecked(url.toString()))
for (ISubScanner subScanner : subScanners) {
result.addAll(subScanner.check(url, baseRequestResponse));
}
}
return result;
} else {
return null;
}
}

子扫描接口中的check函数,该行代码处发送构造好的request请求包

HttpRequestResponse resp = scanner.doRequest(originHeaders, originRequestResponse, newUrl);

其中处理响应包,匹配规则这一部分,Java语法有点超纲了,语法细节上有点不太理解在干啥

private final List<Payload> payloads = new ArrayList<Payload>() {{
add(new Payload(new ArrayList<String[]>() {{
add(new String[]{"env"});
add(new String[]{"actuator", "env"});
}}, (baseRequestResponse, checkRequest, newUrl) -> {
IResponseKeywords founds = Utils.Helpers.analyzeResponseKeywords(new ArrayList<String>() {{
add("java.version");
add("os.arch");
}}, checkRequest.getResponse());
if (BypassPayloadUtils.hasFound(founds, 0) && Utils.Helpers.analyzeResponse(checkRequest.getResponse()).getStatusCode() == 200) {
Utils.Callback.printOutput("found " + newUrl + ".\r\n");
return new Issue(
baseRequestResponse.getHttpService(),
newUrl,
new IHttpRequestResponse[]{checkRequest},
"Spring Actuator-Env found.",
"URL: " + newUrl,
"Medium", true);
} else {
return null;
}
}));
add(new Payload(new ArrayList<String[]>() {{
add(new String[]{"actuator"});
}}, (baseRequestResponse, checkRequest, newUrl) -> {
IResponseKeywords founds = Utils.Helpers.analyzeResponseKeywords(new ArrayList<String>() {{
add("health");
add("{\"self\":{");
add("{\"_links\":{");
}}, checkRequest.getResponse());
if (BypassPayloadUtils.hasFound(founds, 0) && Utils.Helpers.analyzeResponse(checkRequest.getResponse()).getStatusCode() == 200) {
Utils.Callback.printOutput("found " + newUrl + ".\r\n");
return new Issue(
baseRequestResponse.getHttpService(),
newUrl,
new IHttpRequestResponse[]{checkRequest},
"Spring Actuator found.",
"URL: " + newUrl,
"Medium", false);
} else {
return null;
}
}));
}};

两个add函数,但大致意思就是泛型实现了该部分的处理逻辑,在返回包识别特征后,将结果保存到了issue中。最后保存到了扫描器check函数的result中。

public Payload(List<String[]> resources, IResponseChecker responseChecker) {
this.resources = resources;
this.responseChecker = responseChecker;
}

结果最终反馈到IScanIssue变量中,主干流程中已经注册了监听函数,最终结果反馈到burp的Issue activity界面。


文章来源: http://mp.weixin.qq.com/s?__biz=MzU4MTc5NjU4Ng==&mid=2247483942&idx=1&sn=691548e8e3f2158266f81bb44ede0462&chksm=fd4355a3ca34dcb5f843c72724bf5ea82a5eeafbb37314b5727bfab013f7f215f175b0da841d#rd
如有侵权请联系:admin#unsafe.sh