一个从「Nuclei CLI 封装」起步,演进为「Web 可视化 + MySQL 存储 + Celery 异步调度 + 自定义 POC 模板 + sqlmap 注入检测 + HTML 报告」的完整漏洞扫描平台。 本项目 不保留本机路径 / 数据库口令:所有敏感值通过环境变量注入,本地演示由
run.bat自动从.env.local加载。 README 汇总 Phase 1 – Phase 5 全部成果、启动方式与常用命令。
# 1. 首次:复制示例配置为本地配置,按本机填写真实路径/口令
copy .env.local.example .env.local
# 2. 一键启动(自动加载 .env.local,同窗口同步扫描,无需 Docker/Celery/Redis)
run.bat
# 或手动两步: python init_db.py && python app.py
# 3. 打开 http://127.0.0.1:5000说明:
run.bat用同步扫描完成核心演示(建目标 → 扫 → 看漏洞), 不依赖 Redis / Celery / Docker。若需全功能版(异步 + 注入检测 + 靶场)见「八、一键启动流程」。
浏览器(Web 面板 127.0.0.1:5000)
│
▼
┌───────────── Flask (app.py) ─────────────┐
│ dashboard / targets / tasks / findings |
│ templates / report │
└─────┬──────────────────────────────┬─────┘
│ 同步/异步投递 │ 查询
▼ ▼
Celery (Redis Broker) MySQL (vuln_scan)
│
▼
┌──────────────────────── 扫描引擎 ───────────────── by engine ────────┐
│ nuclei(官方模板) / custom(自定义 POC)/ sqlmap(注入检测) │
│ chain = nuclei 先探测 → sqlmap 对疑似注入点复检 │
└──────────────────────────────────────────────────────────────────────┘
| 组件 | 默认地址 |
|---|---|
| Flask Web 面板 | http://127.0.0.1:5000 |
| Redis(Celery Broker/Backend) | redis://127.0.0.1:6379/0 |
| MySQL(数据存储) | 127.0.0.1:3306/vuln_scan |
| sqlmapapi(注入检测服务) | http://127.0.0.1:8775 |
| Mock Lab(本地模拟靶场) | http://127.0.0.1:9088 |
用 Python 封装 Nuclei 命令行,对单目标 / 目标列表完成扫描,并把 JSON Lines 输出解析为结构化数据。
| 文件 | 作用 |
|---|---|
config.py |
集中配置:nuclei 二进制路径、模板目录、默认参数(环境变量可覆盖) |
nuclei_runner.py |
引擎层:subprocess 调用 + 流式解析 + 结构化模型(Finding/ScanOutcome)+ 并发/限速/重试/进度回调 |
run.py |
CLI 入口:目标导入、参数过滤、结构化 JSON 输出 + 终端摘要 |
test_nuclei_runner.py |
单元测试:JSON 解析 + 等级聚合(不依赖网络) |
targets.txt |
示例目标列表 |
# 单目标
python run.py -u http://your-target.com -tags cve -severity critical,high
# 目标列表 + 并发 5
python run.py -l targets.txt -tags tech -c 5 -o outputs\results.json
# 校验
python test_nuclei_runner.py把 Phase 1 的 ScanOutcome/Finding 持久化到 MySQL(Target/ScanTask/Finding 表),并用 Flask 面板可视化,完成从脚本到 Web 应用的第一步。
| 文件 | 作用 |
|---|---|
app.py |
Web 应用入口(--host/--port/--debug,默认 127.0.0.1:5000) |
app/__init__.py |
应用工厂:SQLAlchemy、SECRET_KEY、注册五个蓝图 |
app/db_config.py |
数据库连接(默认 MySQL,环境变量 SCN_DB_URI 覆盖) |
app/models.py |
ORM:Target / ScanTask / Finding / Template(Phase 4 预留) |
app/routes/ |
dashboard / targets / tasks / findings / templates 蓝图 |
templates/ |
对应 Web 页面 |
init_db.py |
创建表结构(--reset 先删后建) |
页面与路由
| 路由 | 功能 |
|---|---|
GET / |
概览:目标数、任务数、漏洞数、等级分布、状态分布、最新任务 |
GET /targets/ |
目标管理:新增、批量导入、删除 |
GET /tasks/ |
任务列表 + 详情 + 轮询 + 删除 + 重新扫描 |
GET /findings/ |
漏洞列表(按等级 / 生命周期状态过滤)+ 状态流转 new→confirmed→fixed |
GET /templates/ |
自定义模板管理 |
# 初始化数据库
python init_db.py # 建表
python init_db.py --reset # 清空重建(谨慎)
# 启动 Web 面板
python app.py引入 Celery,把扫描投递为异步任务(Redis 作 Broker/Backend),避免页面阻塞;同时搭建本地模拟靶场用于端到端验证。
| 文件 | 作用 |
|---|---|
celery_app.py |
Celery 应用:Redis 配置、任务模块注册、超时/重试/序列化 |
celery_tasks.py |
异步任务:run_scan(nuclei)/ run_sqlmap / run_chain |
app/services/scan_service.py |
业务编排:建任务→构造引擎→扫描→落库→投递异步 |
scripts/mock_lab.py |
本地模拟靶场(默认 9088):DVWA/Spring/PHP/注入等指纹响应 |
scripts/phase3_acceptance.py |
批量导入 50 目标并轮询异步任务状态 |
# 1) 确保 Redis 可用,然后启动 Worker(Windows 上推荐线程池,用 python -m 确保解析到 celery_app)
python -m celery -A celery_app worker --pool=threads --loglevel=info --concurrency=4
# 2) 启动本地模拟靶场
python scripts\mock_lab.py
# 3) 验收
python scripts\phase3_acceptance.py自主研发 Java / PHP 高危 POC 模板与条件化 workflow,新增模板管理页面(同步 / 查看 / 编辑 / 删除),并将引擎扩展为 nuclei / custom / sqlmap / chain。
| 文件 | 作用 |
|---|---|
custom_templates/java/ |
8 个 Java/Spring Boot 模板(Actuator 泄露、Spring4Shell、Log4Shell、Druid、SpEL 等) |
custom_templates/php/ |
6 个 PHP/CMS 模板(ThinkPHP、Laravel Debug、phpinfo、WordPress 枚举等) |
custom_templates/workflow/ |
2 个条件化 workflow(Java 暴露链、PHP 指纹链) |
app/services/template_service.py |
扫描目录、解析 YAML 元数据、查看/编辑/删除模板 |
app/routes/templates.py |
模板同步入库、列表、详情、编辑保存、删除 |
scripts/migrate_p4.py |
为 templates 表补充 template_id/severity/tags 列 |
scripts/phase4_acceptance.py |
端到端:模板同步→详情→编辑→删除→custom 引擎扫描 |
python scripts\migrate_p4.py # 表结构迁移(首次运行)
python scripts\phase4_acceptance.py # 推荐先启动 mock_lab
# CLI 指定自定义引擎
python run.py -u http://127.0.0.1:9088 --engine custom -o outputs\p4_mock_results.json通过 sqlmapapi REST 封装完成 SQL 注入深度检测(统一适配器输出),并生成独立的 HTML 漏洞报告(摘要 / 等级统计 / 明细 / 修复建议),报告在 /tasks/<id>/report 展示并落盘快照。
| 文件 | 作用 |
|---|---|
app/services/sqlmap_client.py |
sqlmapapi REST 客户端:SqlmapApi / ScanResult / 适配器 |
app/services/report_service.py |
生成报告上下文 + 落盘 HTML 快照 |
templates/report.html |
独立 HTML 报告模板 |
run.py |
--engine sqlmap 注入检测 CLI 入口 |
scripts/phase5_acceptance.py |
端到端:建目标→sqlmap 扫描→出报告 |
# 1) 启动 sqlmapapi(本机路径由环境变量 SQLMAP_API_BIN 注入;见 .env.local.example)
python %SQLMAP_API_BIN% -s -H 127.0.0.1 -p 8775
# 2) CLI 注入检测
python run.py -u http://127.0.0.1:9088/sqli.php?id=1 --engine sqlmap -o outputs\sqlmap_cli.json
# 3) Web 面板内:新建目标 → 引擎选 sqlmap/chain → 任务详情点「查看报告」
# 4) 验收(需先启动 mock_lab 与 sqlmapapi)
python scripts\phase5_acceptance.py注入检测特性:默认只测 boolean / error 两类(SQLMAP_TECHNIQUES = "BE"),避免时间盲注拖慢;单注入点最长等待 180s;命中按高危上报并使用约定模板 ID sqlmap-sql-injection。
# Phase 1:仅 Python 标准库
# Phase 2:
flask==3.1.*
flask-sqlalchemy==3.1.*
pymysql
requests
pyyaml
jinja2
# Phase 3:
celery==5.4.*
redis==5.0.*| 工具 | 说明 | 配置项(config.py) |
|---|---|---|
| Nuclei | 漏洞扫描引擎 | NUCLEI_BIN(真实路径从环境变量注入) |
| Nuclei 官方模板库 | 官方 POC 库 | NUCLEI_TEMPLATES(真实路径从环境变量注入) |
| sqlmap | 注入检测引擎(自带 REST-JSON API) | SQLMAP_API_BIN(真实路径从环境变量注入) |
| sqlmapapi 服务 | 注入检测后台服务 | SQLMAP_API_URL=http://127.0.0.1:8775 |
| 环境变量 | 默认值(脱敏占位) | 说明 |
|---|---|---|
NUCLEI_BIN |
nuclei(依赖 PATH) |
nuclei 二进制路径 |
NUCLEI_TEMPLATES |
nuclei-templates(相对目录) |
官方模板目录 |
NUCLEI_CUSTOM_TEMPLATES |
项目内 custom_templates |
自定义模板目录 |
SCN_DB_URI |
mysql+pymysql://root@127.0.0.1:3306/vuln_scan |
数据库连接串(无口令占位,可用 SQLite) |
SCN_REDIS_URL |
redis://127.0.0.1:6379/0 |
Redis 地址 |
SQLMAP_API_BIN |
sqlmapapi.py(依赖 PATH) |
sqlmapapi 服务端脚本路径 |
SQLMAP_API_URL |
http://127.0.0.1:8775 |
sqlmapapi 服务地址 |
本机 / 私有配置:真实路径与口令一律放在本地
.env.local(已被.gitignore忽略),由run.bat自动加载。
完整跑一套需要依次启动以下服务(均在项目根目录 vuln-scan-platform/ 下执行):
# ⓪ 启动 Redis(Celery Broker/Backend,本项目 Redis 由 Docker 容器 vuln-redis 提供;需先启动 Docker)
docker start vuln-redis
# ① 本地模拟靶场(Phase 3/4/5 验收用)
python scripts\mock_lab.py
# ② 初始化数据库(首次)
python init_db.py
# ③ 启动 sqlmapapi(需要 sqlmap 注入功能时;脚本在 sqlmap 源码包内,本机路径由环境变量 SQLMAP_API_BIN 注入)
python %SQLMAP_API_BIN% -s -H 127.0.0.1 -p 8775
# ④ 启动 Celery Worker(异步任务;Windows 推荐线程池,用 python -m 确保在本目录解析到 celery_app)
python -m celery -A celery_app worker --pool=threads --loglevel=info --concurrency=4
# ⑤ 启动 Web 面板
python app.py
# ⑥ 浏览器访问 http://127.0.0.1:5000说明:以上 ⓪~⑤ 各需一个独立终端持续运行。Celery / Redis 仅在需要异步任务(异步目标扫描)时必需;完全手动同步扫描可不启动 ⓪④。sqlmapapi 仅在需要注入检测(sqlmap/chain 引擎)时启动,即 ③。
| 脚本 | 对应阶段 | 前置 |
|---|---|---|
test_nuclei_runner.py |
Phase 1 | 无 |
test_app.py |
Phase 2 | MySQL 就绪(--dry 可跳过联库) |
scripts/phase3_acceptance.py |
Phase 3 | mock_lab + Redis + Celery |
scripts/phase4_acceptance.py |
Phase 4 | mock_lab |
scripts/phase5_acceptance.py |
Phase 5 | mock_lab + sqlmapapi |
- 仅扫描自己拥有或已获书面授权的目标(DVWA / Vulhub / vulnweb 等靶场)。
- 扫描会在目标上产生请求流量,内网 / 生产环境请降低
-rl与-c。 - 数据库口令不写死在代码里,通过
SCN_DB_URI环境变量 /.env.local注入;生产环境务必禁用代码中的默认口令。 - sqlmap 的注入检测会对目标发送构造请求,仅在授权范围内使用。
vuln-scan-platform/
├── run.bat # 快速演示:自动加载 .env.local,同步两步启动
├── .gitignore # 忽略缓存 / 日志 / outputs / 本地密钥
├── .env.local.example # 环境变量模板(不含真实值;复制为 .env.local 填写)
├── app.py / run.py / celery_app.py / celery_tasks.py
├── nuclei_runner.py / config.py / init_db.py
├── requirements.txt / targets.txt / test_app.py / test_nuclei_runner.py
├── app/
│ ├── db_config.py / models.py
│ ├── routes/ dashboard target tasks findings templates
│ └── services/ scan_service sqlmap_client report_service template_service
├── scripts/ mock_lab migrate_p4 phase3/4/5_acceptance
├── templates/ base dashboard targets tasks task_detail findings
│ finding_detail report templates template_detail
├── custom_templates/ java/ php/ workflow/
└── outputs/ (运行产物 audit/ reports/ _nuclei_cache/ *.json *.log —— 已被 .gitignore 忽略)