forked from API-Security/APIKit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPassiveScanner.java
More file actions
114 lines (92 loc) · 4.97 KB
/
PassiveScanner.java
File metadata and controls
114 lines (92 loc) · 4.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package burp;
import burp.application.ApiScanner;
import burp.application.apitypes.ApiEndpoint;
import burp.application.apitypes.ApiType;
import burp.ui.ApiDocumentListTree;
import burp.ui.ExtensionTab;
import burp.utils.CommonUtils;
import burp.utils.Constants;
import burp.utils.UrlScanCount;
import java.net.URL;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
public class PassiveScanner implements IScannerCheck {
private final UrlScanCount scanedUrl = new UrlScanCount();
private final ApiScanner apiScanner;
private int scannedCount = 1;
public PassiveScanner() {
this.apiScanner = new ApiScanner();
}
public ApiScanner getApiScanner() {
return apiScanner;
}
@Override
public List<IScanIssue> doPassiveScan(IHttpRequestResponse httpRequestResponse) {
URL httpRequestURL = BurpExtender.getHelpers().analyzeRequest(httpRequestResponse).getUrl();
String requestUrl = CommonUtils.getUrlWithoutFilename(httpRequestURL);
// 目前检测的查重是将 http://user:pass@host:port/deep/path/filename?query#fragment
// 归一化为 http://host:port/deep/path 后检测是否扫描过, 如果未来有对 query 有相关检测需求, 可以在修改 Common.getUrlWithoutFilename
if (this.scanedUrl.get(requestUrl) <= 0) {
this.scanedUrl.add(requestUrl);
} else {
return null; // 检测到重复, 直接返回
}
ArrayList<ApiType> apiTypes = this.apiScanner.detect(httpRequestResponse, true);
return this.parseApiDocument(apiTypes);
}
public List<IScanIssue> parseApiDocument(ArrayList<ApiType> apiTypes) {
List<IScanIssue> issues = new ArrayList<>();
ExtensionTab extensionTab = BurpExtender.getExtensionTab();
//遍历扫到的ApiType
for (ApiType apiType : apiTypes) {
Map<String, IHttpRequestResponse> apiDocuments = apiType.getApiDocuments();
//遍历ApiType中的接口文档
for (Map.Entry<String, IHttpRequestResponse> entry : apiDocuments.entrySet()) {
ApiDocumentListTree apiDocumentListTree = new ApiDocumentListTree(extensionTab);
ExtensionTab.ApiTableData mainApiData = new ExtensionTab.ApiTableData(false, apiDocumentListTree, String.valueOf(this.scannedCount), entry.getKey(), String.valueOf(BurpExtender.getHelpers().analyzeResponse(entry.getValue().getResponse()).getStatusCode()), apiType.getApiTypeName(), "true", entry.getValue(), CommonUtils.getCurrentDateTime());
ArrayList<ExtensionTab.ApiTableData> subApiData = new ArrayList<>();
mainApiData.setTreeStatus(Constants.TREE_STATUS_COLLAPSE);
apiDocumentListTree.setMainApiData(mainApiData);
apiDocumentListTree.setSubApiData(subApiData);
// 排序
List<ApiEndpoint> apiEndpoints = apiType.parseApiDocument(entry.getValue());
apiEndpoints.sort(Comparator.comparing(ApiEndpoint::getUrl));
// 遍历接口文档中的接口
for (ApiEndpoint apiEndpoint : apiEndpoints) {
IHttpRequestResponse apiParseRequestResponse = apiEndpoint.getHttpRequestResponse();
ExtensionTab.ApiTableData currentData = new ExtensionTab.ApiTableData(true,
apiDocumentListTree,
"",
apiEndpoint.getUrl(),
String.valueOf(BurpExtender.getHelpers().analyzeResponse(apiParseRequestResponse.getResponse()).getStatusCode()),
apiType.getApiTypeName(),
(BurpExtender.getHelpers().analyzeResponse(apiParseRequestResponse.getResponse()).getStatusCode() != 200 && BurpExtender.getHelpers().analyzeResponse(apiParseRequestResponse.getResponse()).getStatusCode() != 405 && BurpExtender.getHelpers().analyzeResponse(apiParseRequestResponse.getResponse()).getStatusCode() != 500 ? "false" : "true"),
apiParseRequestResponse,
CommonUtils.getCurrentDateTime());
subApiData.add(currentData);
}
extensionTab.add(apiDocumentListTree);
this.scannedCount++;
}
// API 指纹检测 - 报告输出
issues.addAll(apiType.exportIssues());
// API 指纹检测 - 控制台报告输出
BurpExtender.getStdout().print(apiType.exportConsole());
}
return issues;
}
@Override
public List<IScanIssue> doActiveScan(IHttpRequestResponse httpRequestResponse, IScannerInsertionPoint insertionPoint) {
return null;
}
@Override
public int consolidateDuplicateIssues(IScanIssue existingIssue, IScanIssue newIssue) {
if (existingIssue.getIssueName().equals(newIssue.getIssueName())) {
return -1;
} else {
return 0;
}
}
}