项目地址
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 + ".rn");
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 + ".rn");
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界面。
原文始发于微信公众号(here404):Burp插件之SpringSpider项目分析
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论