Skip to content

Repository files navigation

VulnScan 漏洞扫描平台

一个从「Nuclei CLI 封装」起步,演进为「Web 可视化 + MySQL 存储 + Celery 异步调度 + 自定义 POC 模板 + sqlmap 注入检测 + HTML 报告」的完整漏洞扫描平台。 本项目 不保留本机路径 / 数据库口令:所有敏感值通过环境变量注入,本地演示由 run.bat 自动从 .env.local 加载。 README 汇总 Phase 1 – Phase 5 全部成果、启动方式与常用命令。


〇、快速开始(最快 30 秒)

# 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

二、Phase 1:Nuclei CLI 封装

用 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 2:Web 面板 + MySQL 存储

把 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

四、Phase 3:Celery 异步调度 + Mock Lab 靶场

引入 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

五、Phase 4:自定义 POC 模板 + 多引擎

自主研发 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

六、Phase 5:sqlmap 注入检测 + HTML 报告

通过 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

十、安全注意事项

  1. 仅扫描自己拥有或已获书面授权的目标(DVWA / Vulhub / vulnweb 等靶场)。
  2. 扫描会在目标上产生请求流量,内网 / 生产环境请降低 -rl 与 -c。
  3. 数据库口令不写死在代码里,通过 SCN_DB_URI 环境变量 / .env.local 注入;生产环境务必禁用代码中的默认口令。
  4. 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 忽略)

About

一个Web 漏洞扫描平台

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages