本文档面向架构师和高级开发者,深入剖析系统架构设计、并发模型、SQLMap 集成原理、插件架构和性能优化策略。
┌─────────────────────────────────────────────────────┐
│ 前端层 (Vue 3) │
│ ┌─────────┐ ┌──────────┐ ┌──────┐ ┌────────────┐ │
│ │ Home │ │ TaskList │ │Config│ │ AddTask │ │
│ └────┬────┘ └────┬─────┘ └──┬───┘ └──────┬─────┘ │
│ └───────────┴──────────┴─────────────┘ │
│ │ HTTP/WebSocket │
├────────────────────────┼────────────────────────────┤
│ 后端层 (FastAPI) │
│ ┌──────────────────────────────────────────────┐ │
│ │ API 路由层 (Router) │ │
│ │ ┌──────────┐ ┌──────────┐ ┌─────────────┐ │ │
│ │ │ webApi │ │burpExApi │ │ commonApi │ │ │
│ │ └────┬─────┘ └────┬─────┘ └──────┬──────┘ │ │
│ └───────┼─────────────┼──────────────┼─────────┘ │
│ ┌───────┴─────────────┴──────────────┴─────────┐ │
│ │ 服务层 (Service) │ │
│ │ ┌──────────┐ ┌───────────────┐ ┌─────────┐ │ │
│ │ │taskService│ │headerRuleSvc │ │scanPreset│ │ │
│ │ └────┬─────┘ └───────┬───────┘ └────┬─────┘ │ │
│ └───────┼───────────────┼──────────────┼────────┘ │
│ ┌───────┴───────────────┴──────────────┴────────┐ │
│ │ 模型层 (Model) │ │
│ │ ┌──────┐ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ Task │ │HeaderRule │ │SessionBody │ │ │
│ │ └──┬───┘ └──────┬───────┘ └──────┬───────┘ │ │
│ └─────┼────────────┼───────────────┼────────────┘ │
│ ┌─────┴────────────┴───────────────┴────────────┐ │
│ │ 数据存储 (DataStore) │ │
│ │ ┌──────────┐ ┌────────────────────────────┐ │ │
│ │ │ Memory │ │ SQLite (header_rules.db) │ │ │
│ │ └──────────┘ └────────────────────────────┘ │ │
│ └───────────────────────────────────────────────┘ │
├──────────────────────────────────────────────────────┤
│ SQLMap 引擎层 │
│ ┌──────────────────────────────────────────────┐ │
│ │ third_lib/sqlmap (Git Submodule) │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
用户操作 → Vue组件 → Pinia Store → API请求 → FastAPI路由
→ Service层 → DataStore/Model → SQLMap引擎 → 结果返回
→ WebSocket推送 → Pinia Store更新 → Vue组件响应
| 决策 | 方案 | 原因 |
|---|---|---|
| 前端框架 | Vue 3 + Composition API | 更好的 TypeScript 支持,组件逻辑复用 |
| 状态管理 | Pinia | Vue 3 官方推荐,模块化设计 |
| UI 组件库 | PrimeVue 4 | 企业级组件,暗色主题支持 |
| 后端框架 | FastAPI | 原生异步支持,自动 OpenAPI 文档 |
| 包管理 (Python) | uv | 比 pip 快 10-100 倍,依赖锁定 |
| 任务存储 | 内存 (DataStore) | 低延迟,简单可靠 |
| 规则存储 | SQLite | 持久化,支持复杂查询 |
后端使用 FastAPI (异步框架),但 DataStore 使用 threading.Lock(同步锁)。直接在 async 函数中使用同步锁会阻塞事件循环。
使用 run_in_executor 将同步操作移至线程池:
import asyncio
from concurrent.futures import ThreadPoolExecutor
# 错误做法(会阻塞事件循环)
async def bad_example():
with DataStore.tasks_lock:
tasks = list(DataStore.tasks.values())
return tasks
# 正确做法(在线程池中执行)
_executor = ThreadPoolExecutor(max_workers=4)
async def good_example():
loop = asyncio.get_event_loop()
tasks = await loop.run_in_executor(
_executor,
lambda: _get_tasks_sync()
)
return tasks
def _get_tasks_sync():
"""在线程池中执行,可以安全使用同步锁"""
with DataStore.tasks_lock:
return list(DataStore.tasks.values())# config.py
MAX_TASKS_COUNT = 3
MAX_TASKS_COUNT_LOCK = threading.Lock()最多同时运行 3 个扫描任务,通过 MAX_TASKS_COUNT_LOCK 控制。
| 锁名称 | 位置 | 保护对象 |
|---|---|---|
DataStore.tasks_lock |
model/DataStore.py |
任务字典 |
MAX_TASKS_COUNT_LOCK |
config.py |
并发任务计数 |
SessionBodyFieldManager._lock |
utils/session_body_field_manager.py |
会话 Body 字段 |
SessionHeaderManager._lock |
utils/session_header_manager.py |
会话 Header |
┌──────────┐ WebSocket ┌──────────────┐
│ 前端 │◄──────────────────►│ WebSocket │
│ Vue组件 │ ws://host:8775 │ Manager │
└──────────┘ │ │
│ ┌─────────┐ │
│ │ 轮询定时器│ │
│ └────┬────┘ │
│ │检查 │
│ ┌────┴────┐ │
│ │DataStore │ │
│ └─────────┘ │
└──────────────┘
utils/websocket_manager.py:
- 管理所有 WebSocket 连接
- 定时轮询 DataStore 检测状态变更
- 状态变更时向所有客户端推送通知
- 支持配置轮询间隔(通过
/api/commonApi/config/refresh-interval)
{
"type": "task_status_changed",
"data": {
"taskid": "abc123",
"old_status": "Running",
"new_status": "Completed"
},
"timestamp": "2026-07-18T10:30:00Z"
}# app.py - FastAPI 生命周期
@asynccontextmanager
async def lifespan(app: FastAPI):
# 启动:初始化 WebSocket 管理器
ws_manager.start(refresh_interval)
yield
# 关闭:停止 WebSocket 管理器
await ws_manager.stop()项目通过 Python 直接调用 SQLMap API(非命令行子进程):
# Task.py 中的关键集成点
from third_lib.sqlmap.lib.core.data import logger
from third_lib.sqlmap.lib.core.common import saveConfig
from third_lib.sqlmap.lib.core.optiondict import optDict1. 创建任务 (Task.__init__)
├── 生成临时请求文件(HTTP 原始格式)
├── 配置 SQLMap 选项 (optDict)
└── 设置任务状态: New
2. 启动扫描
├── 应用 Header 规则 (header_processor)
├── 应用 Body 字段规则 (body_field_processor)
├── 应用作用域匹配 (scope_matcher)
├── 启动 SQLMap 子进程
└── 设置任务状态: Running
3. 监控扫描
├── task_monitor 定时检查进程状态
├── 收集 stdout/stderr (StdDbOut)
├── 解析扫描结果
└── WebSocket 推送状态更新
4. 完成扫描
├── 设置任务状态: Completed/Failed/Terminated
├── 保存扫描结果到 DataStore
└── WebSocket 推送完成通知
-r 参数不通过命令行传递,而是由后端生成临时请求文件:
# Task.py - HTTP 请求临时文件
_DEFAULT_TEMP_DIR = os.path.join(os.getcwd(), "temp", "http_requests")
# 关键处理:
# 1. 去除 Content-Length(让 SQLMap 自动计算)
# 2. 二进制模式写入(避免 Windows 换行符转换)
# 3. 规范化换行符为标准 HTTP 格式
# 4. 清理尾部空行(避免 GET 误判为 POST)SQLMap RESTAPI 限制的参数(在 Burp 插件中置灰):
--sql-shell: 交互式 SQL shell--wizard: 向导模式
安全警告参数(UI 显示警告标识):
- 严重 (红色):
osCmd,osPwn,osSmb,osBof,regRead,regAdd,regDel - 高危 (橙色):
osShell,privEsc - 中危 (橙色):
fileRead,fileWrite,fileDest
utils/header_parser.py 支持自动检测和解析多种 HTTP 请求格式:
| 格式 | 识别特征 | 解析器 |
|---|---|---|
| cURL (Bash) | curl + 单引号 |
_parse_curl_bash() |
| cURL (CMD) | curl + 双引号, ^ 转义符 |
_parse_curl_cmd() |
| PowerShell | Invoke-WebRequest |
_parse_powershell() |
| fetch | fetch( |
_parse_fetch() |
| Raw HTTP | METHOD /path HTTP/1.1 |
_parse_raw_http() |
输入字符串
→ 格式检测 (detect_format)
→ 格式特定解析
→ 统一 HTTP 报文对象
{
method: "POST",
url: "http://...",
headers: {...},
body: "..."
}
→ 生成任务请求文件
- cURL (CMD) 中文字符前的
^转义符移除 - fetch 格式中的转义引号处理
- URL 解析时 host 排除端口
- 非默认端口保留在 Host header 中
两个 API 版本共享相同的分层结构:
src/burpEx/
├── montoya-api/src/main/java/com/sqlmapwebui/burp/
│ ├── api/ # API 客户端
│ ├── config/ # 配置管理
│ ├── core/ # 扩展入口点
│ ├── model/ # 数据模型
│ ├── service/ # 业务服务
│ ├── ui/ # 用户界面
│ │ ├── component/ # 可复用组件
│ │ ├── dialog/ # 对话框
│ │ ├── panel/ # 配置面板
│ │ └── tab/ # 主标签页
│ └── util/ # 工具类
└── legacy-api/ # 结构相同
| 特性 | Montoya API | Legacy API |
|---|---|---|
| Java 版本 | 17+ | 11+ |
| Burp 版本 | 2023.1+ | 任意版本 |
| HTTP 处理 | Montoya HttpRequestResponse | IHttpRequestResponse |
| UI 框架 | Swing (Montoya API) | Swing (Legacy API) |
| 事件模型 | Montoya Event System | IBurpExtenderCallbacks |
使用同步脚本保持两个版本的公共代码一致:
# 同步公共代码(如命令构建器、参数映射)
# 通过脚本从 montoya-api 同步到 legacy-api// stores/task.ts
const POLLING_STRATEGY = {
active: 5000, // 有运行中任务:5秒轮询
idle: 30000, // 无运行中任务:30秒轮询
hidden: 60000, // 页面隐藏:60秒轮询
paused: 0, // 暂停轮询
}// vite.config.ts
build: {
rollupOptions: {
output: {
manualChunks: {
vendor: ['vue', 'vue-router', 'pinia'],
primevue: ['primevue'],
utils: ['axios', 'dayjs'],
}
}
}
}代码分割策略:
vendor: Vue 核心库primevue: PrimeVue 组件库utils: 工具库
- 使用
computed代替模板内复杂表达式 - 大列表使用分页加载
- 过滤防抖 300ms
- 任务列表使用虚拟滚动(大数量时)
GitHub Actions 触发条件:
- 推送 tag:
release-v*,v*-release*,release/v*
构建产物:
sqlmapwebui-{version}.zip- 后端 + 集成前端sqlmap-webui-burp-montoya-{version}.jar- Burp Montoya 插件sqlmap-webui-burp-legacy-{version}.jar- Burp Legacy 插件vulnTestServer-{version}.zip- VulnShop 靶场
# src/backEnd/config.py
VERSION = "1.8.57"版本号一致性检查点:
config.py→ 后端版本package.json→ 前端版本pom.xml(x2) → Burp 插件版本CHANGELOG.md/CHANGELOG_EN.md→ 变更日志
- 更新
config.py中的VERSION - 更新
package.json中的version - 更新两个
pom.xml中的版本号 - 更新 CHANGELOG.md 和 CHANGELOG_EN.md
- 更新 README.md 的版本徽章和最新版本说明
- 运行
pnpm run build验证前端构建 - 运行
python -m pytest验证后端测试 - 提交并推送 tag
上一篇: 核心功能开发与调试技巧 | 返回: 开发维护指南首页