Skip to content

Commit cf6d228

Browse files
author
githubnull
committed
feat(burp): 增强批量注入点标记功能,支持多选报文(3-15个,默认10个),双栏布局UI
1 parent dfb5f87 commit cf6d228

10 files changed

Lines changed: 3568 additions & 40 deletions

File tree

src/burpEx/legacy-api/src/main/java/com/sqlmapwebui/burp/BurpExtender.java

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
116116
stdout.println("[+] " + EXTENSION_NAME + " v" + EXTENSION_VERSION + " (Legacy API) loaded successfully!");
117117
stdout.println("[+] Backend URL: " + configManager.getBackendUrl());
118118
stdout.println("[+] 功能: 提交扫描任务、配置管理");
119-
stdout.println("[+] 右键菜单: Send to SQLMap WebUI / Send to SQLMap WebUI (选择配置)...");
119+
stdout.println("[+] 右键菜单: Send to SQLMap WebUI / Send to SQLMap WebUI (配置扫描)...");
120120
}
121121

122122
/**
@@ -177,38 +177,45 @@ public List<JMenuItem> createMenuItems(IContextMenuInvocation invocation) {
177177
}
178178
menuItems.add(sendWithDefault);
179179

180-
// 选择配置发送
181-
JMenuItem sendWithOptions = new JMenuItem("Send to SQLMap WebUI (选择配置)..." + menuSuffix);
180+
// 标记注入点并扫描 - 支持多选报文
181+
int maxMarkCount = configManager.getMaxInjectionMarkCount();
182+
JMenuItem markInjectionPoints = new JMenuItem("标记注入点并扫描 (*)" + menuSuffix);
182183
if (filterResult.allBinary()) {
183-
sendWithOptions.setEnabled(false);
184-
sendWithOptions.setToolTipText("所有选中的报文都是二进制格式,无法发起扫描任务");
184+
markInjectionPoints.setEnabled(false);
185+
markInjectionPoints.setToolTipText("所有选中的报文都是二进制格式,无法发起扫描任务");
185186
} else {
186-
sendWithOptions.addActionListener(e -> {
187+
// 超过限制时显示警告但仍然可点击(对话框会处理超限情况)
188+
if (filterResult.textCount() > maxMarkCount) {
189+
markInjectionPoints.setToolTipText(
190+
String.format("选中的纯文本报文数量(%d)超过标记上限(%d),仅前%d个报文可进行注入点标记",
191+
filterResult.textCount(), maxMarkCount, maxMarkCount));
192+
}
193+
markInjectionPoints.addActionListener(e -> {
187194
if (filterResult.hasTextMessages()) {
188-
ConfigSelectionDialog dialog = new ConfigSelectionDialog(
189-
callbacks, apiClient, configManager, uiTab);
190-
dialog.show(filterResult.textMessages.get(0));
195+
BatchInjectionMarkDialog dialog = new BatchInjectionMarkDialog(
196+
callbacks, apiClient, configManager, uiTab, helpers);
197+
dialog.show(filterResult.textMessages, filterResult.binaryMessages);
191198
}
192199
});
193200
}
194-
menuItems.add(sendWithOptions);
201+
menuItems.add(markInjectionPoints);
195202

196-
// 标记注入点并扫描
197-
JMenuItem markInjectionPoints = new JMenuItem("标记注入点并扫描 (*)" +
198-
(filterResult.allBinary() ? " (二进制报文)" : ""));
203+
// 配置扫描发送(高级配置对话框)
204+
JMenuItem sendWithOptions = new JMenuItem("Send to SQLMap WebUI (配置扫描)..." + menuSuffix);
199205
if (filterResult.allBinary()) {
200-
markInjectionPoints.setEnabled(false);
201-
markInjectionPoints.setToolTipText("所有选中的报文都是二进制格式,无法发起扫描任务");
206+
sendWithOptions.setEnabled(false);
207+
sendWithOptions.setToolTipText("所有选中的报文都是二进制格式,无法发起扫描任务");
202208
} else {
203-
markInjectionPoints.addActionListener(e -> {
209+
sendWithOptions.addActionListener(e -> {
204210
if (filterResult.hasTextMessages()) {
205-
InjectionPointDialog dialog = new InjectionPointDialog(
206-
callbacks, apiClient, configManager, uiTab);
207-
dialog.show(filterResult.textMessages.get(0));
211+
// 使用新的高级配置对话框
212+
AdvancedScanConfigDialog dialog = new AdvancedScanConfigDialog(
213+
callbacks, apiClient, configManager, uiTab, helpers);
214+
dialog.show(filterResult.textMessages, filterResult.binaryMessages);
208215
}
209216
});
210217
}
211-
menuItems.add(markInjectionPoints);
218+
menuItems.add(sendWithOptions);
212219

213220
// 提交会话Header 和 Header规则 - 仅在选中单条请求时显示
214221
if (selectedMessages.length == 1 && filterResult.hasTextMessages()) {

src/burpEx/legacy-api/src/main/java/com/sqlmapwebui/burp/ConfigManager.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,28 @@ public class ConfigManager {
2121
private static final String KEY_HISTORY_CONFIGS = "historyConfigs";
2222
private static final String KEY_MAX_HISTORY_SIZE = "maxHistorySize";
2323
private static final String KEY_AUTO_DEDUPE = "autoDedupe";
24+
private static final String KEY_MAX_INJECTION_MARK_COUNT = "maxInjectionMarkCount";
25+
private static final String KEY_SHOW_BINARY_WARNING = "showBinaryWarning";
2426

2527
// 历史记录数量限制
2628
public static final int MIN_HISTORY_SIZE = 3;
2729
public static final int MAX_HISTORY_SIZE = 32;
2830
public static final int DEFAULT_HISTORY_SIZE = 20;
2931

32+
// 注入点标记数量限制(批量标记支持更多报文)
33+
public static final int MIN_INJECTION_MARK_COUNT = 3;
34+
public static final int MAX_INJECTION_MARK_COUNT = 15;
35+
public static final int DEFAULT_INJECTION_MARK_COUNT = 10;
36+
3037
private final IBurpExtenderCallbacks callbacks;
3138
private final Gson gson;
3239

3340
// 配置数据
3441
private String backendUrl = "http://localhost:5000";
3542
private int maxHistorySize = DEFAULT_HISTORY_SIZE;
3643
private boolean autoDedupe = true; // 默认开启自动去重
44+
private int maxInjectionMarkCount = DEFAULT_INJECTION_MARK_COUNT; // 多选报文时允许标记注入点的最大数量
45+
private boolean showBinaryWarning = false; // 是否显示二进制报文警告
3746
private ScanConfig defaultConfig;
3847
private List<ScanConfig> presetConfigs; // 常用配置
3948
private List<ScanConfig> historyConfigs; // 历史配置
@@ -77,6 +86,23 @@ private void loadConfigurations() {
7786
autoDedupe = Boolean.parseBoolean(savedAutoDedupe);
7887
}
7988

89+
// 加载注入点标记数量配置
90+
String savedMaxInjectionMarkCount = callbacks.loadExtensionSetting(KEY_MAX_INJECTION_MARK_COUNT);
91+
if (savedMaxInjectionMarkCount != null && !savedMaxInjectionMarkCount.isEmpty()) {
92+
try {
93+
int count = Integer.parseInt(savedMaxInjectionMarkCount);
94+
maxInjectionMarkCount = Math.max(MIN_INJECTION_MARK_COUNT, Math.min(MAX_INJECTION_MARK_COUNT, count));
95+
} catch (NumberFormatException e) {
96+
maxInjectionMarkCount = DEFAULT_INJECTION_MARK_COUNT;
97+
}
98+
}
99+
100+
// 加载二进制报文警告配置
101+
String savedShowBinaryWarning = callbacks.loadExtensionSetting(KEY_SHOW_BINARY_WARNING);
102+
if (savedShowBinaryWarning != null && !savedShowBinaryWarning.isEmpty()) {
103+
showBinaryWarning = Boolean.parseBoolean(savedShowBinaryWarning);
104+
}
105+
80106
// 加载默认配置
81107
String defaultConfigJson = callbacks.loadExtensionSetting(KEY_DEFAULT_CONFIG);
82108
if (defaultConfigJson != null && !defaultConfigJson.isEmpty()) {
@@ -163,6 +189,28 @@ public void setAutoDedupe(boolean enabled) {
163189
callbacks.saveExtensionSetting(KEY_AUTO_DEDUPE, String.valueOf(enabled));
164190
}
165191

192+
// ============ 注入点标记数量配置 ============
193+
194+
public int getMaxInjectionMarkCount() {
195+
return maxInjectionMarkCount;
196+
}
197+
198+
public void setMaxInjectionMarkCount(int count) {
199+
this.maxInjectionMarkCount = Math.max(MIN_INJECTION_MARK_COUNT, Math.min(MAX_INJECTION_MARK_COUNT, count));
200+
callbacks.saveExtensionSetting(KEY_MAX_INJECTION_MARK_COUNT, String.valueOf(this.maxInjectionMarkCount));
201+
}
202+
203+
// ============ 二进制报文警告配置 ============
204+
205+
public boolean isShowBinaryWarning() {
206+
return showBinaryWarning;
207+
}
208+
209+
public void setShowBinaryWarning(boolean show) {
210+
this.showBinaryWarning = show;
211+
callbacks.saveExtensionSetting(KEY_SHOW_BINARY_WARNING, String.valueOf(show));
212+
}
213+
166214
// ============ 连接状态管理 ============
167215

168216
public boolean isConnected() {

0 commit comments

Comments
 (0)