Skip to content

Commit bf66063

Browse files
committed
fix(burp): 修复Burp插件右键菜单扫描配置来源选择不生效的问题
- ConfigManager: 添加ScanConfigSource枚举和getSelectedScanConfig()方法 - ConfigManager: 添加配置来源状态的持久化存储 - DefaultConfigPanel: 单选按钮/下拉框选择变化时保存到ConfigManager - DefaultConfigPanel: 面板初始化时恢复之前的配置来源选择 - BurpExtender/SqlmapContextMenuProvider: 使用getSelectedScanConfig()替代getDefaultConfig() - SqlmapUITab: 传递PresetConfigDatabase给ConfigManager 同时修复Montoya API和Legacy API两个版本
1 parent 730ce84 commit bf66063

9 files changed

Lines changed: 423 additions & 11 deletions

File tree

src/backEnd/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
MAX_TASKS_COUNT_LOCK = threading.Lock()
55

66

7-
VERSION = "1.8.8"
7+
VERSION = "1.8.9"

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,14 +165,15 @@ public List<JMenuItem> createMenuItems(IContextMenuInvocation invocation) {
165165
FilterResult filterResult = filterBinaryRequests(selectedMessages);
166166
String menuSuffix = filterResult.getMenuSuffix();
167167

168-
// 使用默认配置发送
168+
// 使用用户选择的配置发送
169169
JMenuItem sendWithDefault = new JMenuItem("Send to SQLMap WebUI" + menuSuffix);
170170
if (filterResult.allBinary()) {
171171
sendWithDefault.setEnabled(false);
172172
sendWithDefault.setToolTipText("所有选中的报文都是二进制格式,无法发起扫描任务");
173173
} else {
174174
sendWithDefault.addActionListener(e -> {
175-
sendFilteredRequests(filterResult, configManager.getDefaultConfig());
175+
// 使用用户在"右键菜单扫描使用的配置"中选择的配置
176+
sendFilteredRequests(filterResult, configManager.getSelectedScanConfig());
176177
});
177178
}
178179
menuItems.add(sendWithDefault);

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

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public class ConfigManager {
2323
private static final String KEY_AUTO_DEDUPE = "autoDedupe";
2424
private static final String KEY_MAX_INJECTION_MARK_COUNT = "maxInjectionMarkCount";
2525
private static final String KEY_SHOW_BINARY_WARNING = "showBinaryWarning";
26+
private static final String KEY_SCAN_CONFIG_SOURCE = "scanConfigSource"; // 扫描配置来源
27+
private static final String KEY_SELECTED_PRESET_NAME = "selectedPresetName"; // 选中的常用配置名称
2628

2729
// 历史记录数量限制
2830
public static final int MIN_HISTORY_SIZE = 3;
@@ -47,9 +49,25 @@ public class ConfigManager {
4749
private List<ScanConfig> presetConfigs; // 常用配置
4850
private List<ScanConfig> historyConfigs; // 历史配置
4951

52+
// 扫描配置来源选择
53+
private ScanConfigSource scanConfigSource = ScanConfigSource.DEFAULT; // 默认使用默认配置
54+
private String selectedPresetName = null; // 选中的常用配置名称
55+
56+
// 常用配置数据库引用
57+
private PresetConfigDatabase presetDatabase;
58+
5059
// 连接状态
5160
private boolean connected = false;
5261

62+
/**
63+
* 扫描配置来源枚举
64+
*/
65+
public enum ScanConfigSource {
66+
DEFAULT, // 使用默认配置
67+
PRESET, // 使用常用配置
68+
HISTORY // 使用最近历史配置
69+
}
70+
5371
public ConfigManager(IBurpExtenderCallbacks callbacks) {
5472
this.callbacks = callbacks;
5573
this.gson = new GsonBuilder().setPrettyPrinting().create();
@@ -103,6 +121,22 @@ private void loadConfigurations() {
103121
showBinaryWarning = Boolean.parseBoolean(savedShowBinaryWarning);
104122
}
105123

124+
// 加载扫描配置来源
125+
String savedConfigSource = callbacks.loadExtensionSetting(KEY_SCAN_CONFIG_SOURCE);
126+
if (savedConfigSource != null && !savedConfigSource.isEmpty()) {
127+
try {
128+
scanConfigSource = ScanConfigSource.valueOf(savedConfigSource);
129+
} catch (IllegalArgumentException e) {
130+
scanConfigSource = ScanConfigSource.DEFAULT;
131+
}
132+
}
133+
134+
// 加载选中的常用配置名称
135+
String savedPresetName = callbacks.loadExtensionSetting(KEY_SELECTED_PRESET_NAME);
136+
if (savedPresetName != null && !savedPresetName.isEmpty()) {
137+
selectedPresetName = savedPresetName;
138+
}
139+
106140
// 加载默认配置
107141
String defaultConfigJson = callbacks.loadExtensionSetting(KEY_DEFAULT_CONFIG);
108142
if (defaultConfigJson != null && !defaultConfigJson.isEmpty()) {
@@ -211,6 +245,105 @@ public void setShowBinaryWarning(boolean show) {
211245
callbacks.saveExtensionSetting(KEY_SHOW_BINARY_WARNING, String.valueOf(show));
212246
}
213247

248+
// ============ 扫描配置来源管理 ============
249+
250+
public ScanConfigSource getScanConfigSource() {
251+
return scanConfigSource;
252+
}
253+
254+
public void setScanConfigSource(ScanConfigSource source) {
255+
this.scanConfigSource = source;
256+
callbacks.saveExtensionSetting(KEY_SCAN_CONFIG_SOURCE, source.name());
257+
}
258+
259+
public String getSelectedPresetName() {
260+
return selectedPresetName;
261+
}
262+
263+
public void setSelectedPresetName(String name) {
264+
this.selectedPresetName = name;
265+
if (name != null) {
266+
callbacks.saveExtensionSetting(KEY_SELECTED_PRESET_NAME, name);
267+
}
268+
}
269+
270+
/**
271+
* 设置常用配置数据库引用
272+
*/
273+
public void setPresetDatabase(PresetConfigDatabase database) {
274+
this.presetDatabase = database;
275+
}
276+
277+
/**
278+
* 根据用户选择的配置来源获取扫描配置
279+
* 这是右键菜单发送扫描时应该使用的方法
280+
*/
281+
public ScanConfig getSelectedScanConfig() {
282+
switch (scanConfigSource) {
283+
case PRESET:
284+
// 尝试从PresetConfigDatabase获取
285+
if (presetDatabase != null && selectedPresetName != null) {
286+
PresetConfig presetConfig = presetDatabase.getConfigByName(selectedPresetName);
287+
if (presetConfig != null) {
288+
ScanConfig config = ScanConfig.createDefault();
289+
config.setName(presetConfig.getName());
290+
parseArgsToConfig(presetConfig.getParameterString(), config);
291+
return config;
292+
}
293+
}
294+
// 如果数据库不可用,尝试从内存列表获取
295+
if (selectedPresetName != null) {
296+
ScanConfig presetConfig = getPresetConfig(selectedPresetName);
297+
if (presetConfig != null) {
298+
return presetConfig;
299+
}
300+
}
301+
// 回退到默认配置
302+
return defaultConfig;
303+
304+
case HISTORY:
305+
if (!historyConfigs.isEmpty()) {
306+
return historyConfigs.get(0);
307+
}
308+
// 回退到默认配置
309+
return defaultConfig;
310+
311+
case DEFAULT:
312+
default:
313+
return defaultConfig;
314+
}
315+
}
316+
317+
/**
318+
* 解析参数字符串到ScanConfig
319+
*/
320+
private void parseArgsToConfig(String argsStr, ScanConfig config) {
321+
if (argsStr == null || argsStr.isEmpty()) return;
322+
323+
String[] parts = argsStr.split("\\s+");
324+
for (String part : parts) {
325+
if (part.startsWith("--level=")) {
326+
try {
327+
config.setLevel(Integer.parseInt(part.substring(8)));
328+
} catch (NumberFormatException ignored) {}
329+
} else if (part.startsWith("--risk=")) {
330+
try {
331+
config.setRisk(Integer.parseInt(part.substring(7)));
332+
} catch (NumberFormatException ignored) {}
333+
} else if (part.startsWith("--dbms=")) {
334+
config.setDbms(part.substring(7));
335+
} else if (part.startsWith("--technique=")) {
336+
config.setTechnique(part.substring(12));
337+
} else if (part.startsWith("--proxy=")) {
338+
config.setProxy(part.substring(8));
339+
} else if (part.equals("--force-ssl")) {
340+
config.setForceSSL(true);
341+
} else if (part.equals("--batch")) {
342+
config.setBatch(true);
343+
}
344+
}
345+
}
346+
214347
// ============ 连接状态管理 ============
215348

216349
public boolean isConnected() {

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,10 @@ private void initializeUI() {
8383
presetConfigPanel = new PresetConfigPanel(configManager, apiClient, this::appendLog);
8484
tabbedPane.addTab("常用配置", presetConfigPanel);
8585

86-
// 将常用配置数据库传递给默认配置面板
87-
defaultConfigPanel.setPresetDatabase(presetConfigPanel.getDatabase());
86+
// 将常用配置数据库传递给默认配置面板和ConfigManager
87+
PresetConfigDatabase presetDatabase = presetConfigPanel.getDatabase();
88+
defaultConfigPanel.setPresetDatabase(presetDatabase);
89+
configManager.setPresetDatabase(presetDatabase);
8890

8991
// Tab 4: 历史配置管理
9092
historyConfigPanel = new HistoryConfigPanel(configManager, apiClient, this::appendLog);

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

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ private JPanel createConfigSourcePanel() {
310310
useDefaultConfigRadio = new JRadioButton("使用默认配置", true);
311311
useDefaultConfigRadio.setToolTipText("使用左侧配置的参数进行扫描");
312312
configSourceGroup.add(useDefaultConfigRadio);
313+
useDefaultConfigRadio.addItemListener(e -> saveConfigSourceSelection());
313314
panel.add(useDefaultConfigRadio, gbc);
314315
row++;
315316

@@ -328,7 +329,10 @@ private JPanel createConfigSourcePanel() {
328329
usePresetConfigRadio = new JRadioButton("使用常用配置");
329330
usePresetConfigRadio.setToolTipText("从常用配置列表中选择一个配置");
330331
configSourceGroup.add(usePresetConfigRadio);
331-
usePresetConfigRadio.addItemListener(e -> updatePresetComboState());
332+
usePresetConfigRadio.addItemListener(e -> {
333+
updatePresetComboState();
334+
saveConfigSourceSelection();
335+
});
332336
panel.add(usePresetConfigRadio, gbc);
333337
row++;
334338

@@ -337,6 +341,11 @@ private JPanel createConfigSourcePanel() {
337341
gbc.insets = new Insets(0, 30, 6, 10);
338342
presetConfigCombo = new JComboBox<>();
339343
presetConfigCombo.setEnabled(false);
344+
presetConfigCombo.addItemListener(e -> {
345+
if (e.getStateChange() == java.awt.event.ItemEvent.SELECTED) {
346+
saveConfigSourceSelection();
347+
}
348+
});
340349
refreshPresetConfigCombo();
341350
panel.add(presetConfigCombo, gbc);
342351
gbc.insets = new Insets(6, 10, 6, 10);
@@ -347,6 +356,7 @@ private JPanel createConfigSourcePanel() {
347356
useLastHistoryRadio = new JRadioButton("使用最近历史配置");
348357
useLastHistoryRadio.setToolTipText("使用最近一次扫描的参数配置");
349358
configSourceGroup.add(useLastHistoryRadio);
359+
useLastHistoryRadio.addItemListener(e -> saveConfigSourceSelection());
350360
panel.add(useLastHistoryRadio, gbc);
351361
row++;
352362

@@ -462,9 +472,69 @@ private JPanel createConfigSourcePanel() {
462472
// 初始化单选按钮状态
463473
updateRadioButtonStates();
464474

475+
// 从ConfigManager恢复之前的配置来源选择
476+
restoreConfigSourceSelection();
477+
465478
return panel;
466479
}
467480

481+
/**
482+
* 保存配置来源选择到ConfigManager
483+
*/
484+
private void saveConfigSourceSelection() {
485+
if (usePresetConfigRadio.isSelected()) {
486+
configManager.setScanConfigSource(ConfigManager.ScanConfigSource.PRESET);
487+
String selectedName = (String) presetConfigCombo.getSelectedItem();
488+
if (selectedName != null) {
489+
configManager.setSelectedPresetName(selectedName);
490+
}
491+
} else if (useLastHistoryRadio.isSelected()) {
492+
configManager.setScanConfigSource(ConfigManager.ScanConfigSource.HISTORY);
493+
} else {
494+
configManager.setScanConfigSource(ConfigManager.ScanConfigSource.DEFAULT);
495+
}
496+
}
497+
498+
/**
499+
* 从ConfigManager恢复配置来源选择
500+
*/
501+
private void restoreConfigSourceSelection() {
502+
ConfigManager.ScanConfigSource source = configManager.getScanConfigSource();
503+
switch (source) {
504+
case PRESET:
505+
if (presetConfigCombo.getItemCount() > 0) {
506+
usePresetConfigRadio.setSelected(true);
507+
// 恢复选中的常用配置
508+
String savedName = configManager.getSelectedPresetName();
509+
if (savedName != null) {
510+
for (int i = 0; i < presetConfigCombo.getItemCount(); i++) {
511+
if (savedName.equals(presetConfigCombo.getItemAt(i))) {
512+
presetConfigCombo.setSelectedIndex(i);
513+
break;
514+
}
515+
}
516+
}
517+
} else {
518+
// 常用配置为空,回退到默认
519+
useDefaultConfigRadio.setSelected(true);
520+
}
521+
break;
522+
case HISTORY:
523+
if (configManager.getHistoryConfigs().size() > 0) {
524+
useLastHistoryRadio.setSelected(true);
525+
} else {
526+
// 历史配置为空,回退到默认
527+
useDefaultConfigRadio.setSelected(true);
528+
}
529+
break;
530+
case DEFAULT:
531+
default:
532+
useDefaultConfigRadio.setSelected(true);
533+
break;
534+
}
535+
updatePresetComboState();
536+
}
537+
468538
/**
469539
* 刷新常用配置下拉框
470540
*/

0 commit comments

Comments
 (0)