Burpsuit结合SQLMapAPI产生的批量注入插件(X10)
字数 1576 2025-08-18 11:37:19
Burpsuite结合SQLMapAPI批量注入插件(X10)使用教程
一、插件概述
本插件是Burpsuite与SQLMapAPI结合的批量SQL注入检测工具,主要功能特点:
- 实现了Burpsuite流量捕获与SQLMap自动化检测的无缝衔接
- 支持多任务并发检测(可配置线程数)
- 提供灵活的过滤配置选项
- 支持正则匹配目标域名
- 集成SQLMap全部参数配置能力
- 具备任务状态监控和结果展示功能
二、环境准备
1. 所需组件
- Burpsuite Professional版
- SQLMapAPI服务(需单独部署)
- 本插件jar文件
2. SQLMapAPI服务部署
需在服务器上启动SQLMapAPI服务:
python sqlmapapi.py -s -H <IP> -p <PORT>
三、插件安装
- 下载插件jar文件(下载地址见文末)
- 在Burpsuite中安装:
- 打开Burpsuite → Extender → Add → 选择下载的jar文件
四、插件界面详解
插件分为三个主要面板:
1. 任务面板(Server Panel)
- Server:SQLMapAPI服务的IP和端口(格式:IP:PORT)
- THREAD:并发检测的任务数量(建议根据服务器性能设置)
- Domain:目标域名(支持正则匹配)
- CLEAN:清除任务缓存列表
- TEST:测试SQLMapAPI连接
- START:开始检测
2. SQLMapAPI参数配置面板
- Tamper:SQLMap自带的tamper脚本,可输入多个(逗号分隔)
- LogFile:扫描日志文件路径(位于SQLMapAPI服务器上)
3. 过滤条件面板
- ExcludeSuffix:排除指定后缀的请求(正则表达式)
- 示例:
.jpg|.png|.ico|.css|.js
- 示例:
- IngoreCase:ExcludeSuffix是否区分大小写(默认不区分)
- IngoreParams:去重时忽略的参数(逗号分隔)
- 示例:
timeStamp,randomId
- 示例:
- ExcludeParams:包含这些参数的请求将被过滤
- 示例:
checkCode,verifyCode
- 示例:
五、核心功能实现原理
1. 请求监听处理
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
boolean addFlag = false;
// 判断是否为request请求且开关打开
if (messageIsRequest && sqlmapApiPanel.isStart()) {
String host = helpers.analyzeRequest(messageInfo).getUrl().getHost();
// 域名正则匹配
if (host.matches(targetDomian)) {
IRequestInfo iRequestInfo = helpers.analyzeRequest(messageInfo);
// 处理URL
String url = String.valueOf(iRequestInfo.getUrl());
url = url.indexOf("?") > 0 ? url.substring(0, url.indexOf("?")) : url;
// 排除指定后缀
if (!excludeSuffix.matcher(url).matches()) {
// 构造任务实体
TaskEntity entity = new TaskEntity(iRequestInfo.getUrl(),
iRequestInfo.getMethod(),
callbacks.saveBuffersToTempFiles(messageInfo),
iRequestInfo);
// 数据去重检测
String hash = bCrypt.hashpw(entity.getSignString(-1, ingoreParams), SALT);
Integer repeatCheckValue = 1;
if (String.valueOf(iRequestInfo.getHeaders()).indexOf("Chris-To-Sqlmap") != -1) {
if (repeatCheck.containsKey(hash)) {
repeatCheckValue = repeatCheck.get(hash) + 1;
hash = hash + repeatCheckValue;
}
addFlag = true;
}
// 参数过滤检测
else if (!repeatCheck.containsKey(hash) && !entity.hasParams(excludeParams)) {
if (!entity.getParamBody().isEmpty()) { // POST参数
addFlag = true;
} else if (!entity.getParamUrl().isEmpty()) { // GET参数
addFlag = true;
} else if (sqlmapApiOption.getLevel() >= 3 && !entity.getParamCookie().isEmpty()) { // Cookie参数
addFlag = true;
}
}
if (addFlag) {
int row = listTasks.size();
repeatCheck.put(hash, repeatCheckValue);
listTasks.add(entity);
fireTableRowsInserted(row, listTasks.size());
}
}
}
}
}
2. 任务执行处理
public void run() {
while (true) {
if (!threadFlag) {
try {
sqlmapApiPanel.setMessage("Waiting...");
sleep(3 * 1000);
} catch (InterruptedException e) {
stderr.print(e.getMessage());
}
continue;
}
// 添加新任务
if (runingTasks.size() < THREAD_NUMBER && listTasks_start < listTasks.size()) {
while (runingTasks.size() < THREAD_NUMBER && listTasks_start < listTasks.size()) {
TaskEntity entityNew = listTasks.get(listTasks_start);
entityNew.setTaskid(sqlmapapi.tastNew(sqlmapapiServer));
if (entityNew.getTaskid() != null) {
entityNew.setTaskEngineid(sqlmapapi.taskStart(sqlmapapiServer, entityNew, sqlmapApiOption));
runingTasks.put(entityNew.getTaskid(), entityNew);
sqlmapApiPanel.setMessage("New task "+entityNew.getTaskid()+" , URL :"+String.valueOf(entityNew.getUrl()));
listTasks_start++;
} else {
try {
sqlmapApiPanel.setMessage("New task failed! URL :"+String.valueOf(entityNew.getUrl()));
sleep(3 * 1000);
} catch (InterruptedException e) {
stderr.print(e.getMessage());
}
continue;
}
}
}
// 刷新任务状态
if (runingTasks.size() != 0) {
List<String> removeList = new ArrayList<>();
for (String key : runingTasks.keySet()) {
TaskEntity entityRuning = runingTasks.get(key);
String status = sqlmapapi.flushStatus(sqlmapapiServer, entityRuning);
sqlmapApiPanel.setMessage("Flash task [" + key + "] status : " + status);
if ("terminated".equals(status)) {
entityRuning.setTaskStatus(status);
entityRuning.setTaskScanData(sqlmapapi.flushScanData(sqlmapapiServer, entityRuning));
sqlmapApiPanel.setMessage("Task [" + key + "] finished .");
removeList.add(key);
} else if ("not running".equals(status)) {
stderr.println(entityRuning.getTaskid() + " not running");
} else {
entityRuning.setTaskStatus(status);
}
try {
sleep(3 * 1000);
} catch (InterruptedException e) {
stderr.print(e.getMessage());
}
}
if (!removeList.isEmpty()) {
for (String key : removeList) {
runingTasks.remove(key);
}
}
fireTableRowsInserted(0, listTasks.size());
} else {
try {
sleep(3 * 1000);
} catch (InterruptedException e) {
stderr.print(e.getMessage());
}
}
}
}
六、使用流程
-
配置SQLMapAPI服务
- 填写正确的Server地址和端口
- 点击TEST测试连接
-
设置过滤条件
- 根据目标网站特点设置ExcludeSuffix
- 设置需要忽略的参数(IngoreParams)
- 设置需要排除的参数(ExcludeParams)
-
配置SQLMap参数
- 选择需要的tamper脚本
- 设置日志文件路径
-
开始扫描
- 设置并发线程数(THREAD)
- 输入目标域名(支持正则)
- 点击START开始扫描
-
监控扫描进度
- 在任务列表中查看各任务状态
- 在信息提示区域查看实时日志
- 在扫描结果区域查看漏洞详情
七、最佳实践建议
-
性能调优
- 根据服务器性能设置合适的THREAD值
- 复杂的注入检测可适当减少并发数
-
过滤优化
- 精确设置ExcludeSuffix以减少无效请求
- 正确识别并设置动态参数(IngoreParams)
-
结果分析
- 重点关注高风险注入点
- 结合Burpsuite的Repeater模块验证漏洞
-
日志管理
- 定期清理SQLMapAPI服务器上的日志文件
- 重要扫描结果建议单独保存
八、注意事项
- 使用前确保已获得目标系统的合法授权
- 高并发扫描可能对目标系统造成影响,建议在非业务高峰期进行
- 复杂的正则匹配可能影响性能,建议先测试
- 自定义tamper脚本需放置在SQLMap的tamper目录下
九、下载地址
插件下载:https://pan.baidu.com/s/1YPU_1tujStp69Z9g51AN9g
(历史版本和后续更新也将存放于此)
本文基于Chris_D原创文章整理,仅供学习交流使用,请遵守相关法律法规