Smit-RM/VulnScanPro

GitHub: Smit-RM/VulnScanPro

一款全栈 Web 应用漏洞扫描器,支持多用户认证、实时扫描进度、自动化报告生成与计划任务调度,覆盖 OWASP Top 10 多类漏洞。

Stars: 0 | Forks: 0

# VulnScan Pro — 智能 Web 应用漏洞扫描器 一款全栈 Web 应用安全扫描器,具备实时扫描进度、多用户认证项目以及自动化 PDF/JSON 报告功能。 ## 🚀 快速开始 ### 前置条件 - Python 3.11+ - Node.js 18+ *(可选 — 仅在运行 Playwright 端到端测试时需要)* ### 设置 ``` # 从 repository root pip install -r requirements.txt cp .env.example .env # then edit .env with your own secrets python backend_app.py ``` 服务器将在 `http://127.0.0.1:5000` 上启动。Flask 会直接在该 URL 提供前端服务(`vuln-scanner-app.html` + `static/app.js`)— 在任何现代浏览器中打开即可。首次运行时会创建一个默认的管理员账户(`admin` / `admin123`),并且**强制要求在首次登录时修改密码**。 在这种默认模式下,扫描将在进程内的后台线程中运行 — **不需要 Redis 或 Celery worker**。要将扫描扩展到专用 worker,请参阅下方的[异步扫描](#-async-scans-celery--redis)。 ### Docker 将运行完整的堆栈(Flask Web 应用 + Redis + Celery worker): ``` docker compose up --build ``` 随后即可通过 `http://127.0.0.1:5000` 访问该应用。在任何非本地使用之前,请设置强健的 `SECRET_KEY` / `JWT_SECRET_KEY`(例如在本地 `.env` 中)— compose 会从您的环境中读取它们。 ## 📋 功能 ### 核心扫描 以下每项检查都在 `VulnerabilityScanner` (`backend_app.py`) 中实现,旨在确认发现的问题(探测 + 证据),而不是仅凭名称进行标记: - **SQL 注入** — 基于错误检测,比对数据库错误特征库 - **反射型 XSS** — payload 反射测试,带有 HTML 实体编码的误报防护(经过转义的 `<script>` 反射*不会*被标记) - **CSRF** — 标记不包含 anti-CSRF token 字段的 POST 表单 - **安全 Headers** — 缺失 `X-Frame-Options`、`X-Content-Type-Options`、`Strict-Transport-Security`、`Content-Security-Policy`、`X-XSS-Protection` - **不安全的传输** — 标记通过纯 HTTP 而非 HTTPS 提供服务的目标 - **敏感文件 / 信息泄露** — 对内容进行确认探测,如 `/.git/HEAD`、`/.env`、`/phpinfo.php`、`/web.config`、swagger/openapi 等路径 - **开放重定向** — 通过 Canary 确认(仅在真实重定向至 Canary 时触发) - **CORS 配置错误** — 通配符源和反射源(± credentials) - **点击劫持** — 缺失 `X-Frame-Options` / CSP `frame-ancestors` - **SSRF** — 基于证据(元数据反射、重定向至内部,或可复现的时间特征);绝不会仅凭类似于 URL 的参数进行标记 - **IDOR** — 使用第二个凭据(扫描配置中的 `auth_secondary`)进行主动的跨身份对象访问测试;仅标记已确认的授权绕过(当非所有的 probe id 被拒绝时,B 读取了 A 的对象),绝不基于假设 ### 仪表板 - 风险评分仪表 - 严重程度分布甜甜圈图 - 近期活动 / 扫描动态 - 通过 `GET /api/dashboard/stats` 获取汇总统计数据(项目、目标、扫描、漏洞) ### 报告与调度 - **PDF** — 使用 ReportLab 生成的完整执行报告 - **JSON** — 机器可读的结构化输出 - **计划扫描** — 基于 cron 表达式的定期扫描(后台 worker) ### 安全强化(针对应用本身) - 带有 access/refresh token 的 JWT 认证 - bcrypt 密码哈希(工作因子 ≥ 12) - 账户锁定 + IP 速率限制 + `/api/auth/login` 上的渐进式延迟(锁定 / 密码错误 / 未知用户在响应体和时间消耗上无法区分) - 服务端输入验证与清理 (Pydantic v2) - 邮箱验证与密码重置流程 - 每个响应均包含安全响应 headers(参见 `add_security_headers`) - CORS 严格锁定于显式的源白名单 ## ⚡ 异步扫描 (Celery + Redis) 扫描执行具有两种可互换的后端,由 `REDIS_URL` 环境变量进行选择 — 单一的 `dispatch_scan()` 入口点隐藏了具体使用的是哪一种: | `REDIS_URL` | Backend | 基础设施 | |-------------|---------|----------------| | **未设置** (默认) | 进程内后台线程 | 无 — 仅需 `python backend_app.py` | | 已设置 (例如 `redis://localhost:6379/0`) | 基于 Redis 的 Celery worker | Redis + 一个 Celery worker 进程 | 配置了 Redis 后,扫描进度会通过基于 Redis 的 Socket.IO 消息队列从 worker 中继回浏览器客户端,因此跨进程的实时更新也能正常工作。使用以下命令运行 worker: ``` celery -A backend_app.celery_app worker --pool=threads --concurrency=4 ``` 或者使用 `docker compose up --build`,它会将 Redis、Web 应用和 worker 组合在一起运行。如果设置了 `REDIS_URL` 但无法导入 Celery/redis,应用将记录一条警告,并透明地回退到线程模式。 ## 🗺 路线图 计划中但**尚未**包含在代码库中的工作 — 在此处列出,而不是作为已发布的功能列出: - **CSV 报告导出** — 兼容电子表格的导出(目前仅支持 PDF + JSON) - **Postgres 后端** — 默认的 SQLite 仅能承受较轻的多写入者负载;在真实并发下运行 Celery worker 时,建议使用 Postgres ## 🔧 API 参考 | 方法 | Endpoint | 描述 | |--------|----------|-------------| | POST | /api/auth/register | 新用户注册 | | POST | /api/auth/login | 用户认证 | | POST | /api/auth/refresh | 使用 refresh token 换取新的 access token | | GET | /api/projects | 列出用户项目 | | POST | /api/projects | 创建项目 | | GET | /api/projects/:id/targets | 列出项目的目标 | | POST | /api/targets | 添加目标 | | POST | /api/scans | 启动漏洞扫描 | | GET | /api/scans/:id | 获取扫描状态 | | GET | /api/scans/:id/vulnerabilities | 获取一次扫描的所有发现 | | GET | /api/scans/:id/report/pdf | 下载 PDF 报告 | | GET | /api/scans/:id/report/json | 下载 JSON 报告 | | GET | /api/schedules | 列出计划扫描 | | GET | /api/dashboard/stats | 仪表板统计数据 | 实时扫描进度通过 Socket.IO 推送(`scan_progress` 事件;使用 `join_scan` 事件加入扫描房间)。 ## 🏗 架构 ``` ┌──────────────────┐ REST / WebSocket ┌──────────────────┐ SQL ┌──────────┐ │ Vanilla JS SPA │◄────────────────────►│ Flask API │◄────────►│ SQLite │ │ HTML/CSS/JS │ │ + Socket.IO │ │ │ │ (served by Flask)│ │ (Port 5000) │ └──────────┘ └──────────────────┘ └──────────────────┘ │ ┌───────▼────────┐ │ Scanner Engine │ │ + ReportLab │ └────────────────┘ ``` **技术栈:** Python 3.11+ · Flask · Flask-SocketIO (eventlet) · Flask-JWT-Extended · Flask-SQLAlchemy · Flask-Bcrypt · Pydantic v2 · SQLite · ReportLab · BeautifulSoup4 + requests (扫描器引擎) · 原生 JS / HTML / CSS 前端 · Playwright (端到端测试)。 ## 🧪 测试与 CI ``` pip install -r requirements-dev.txt pytest # hermetic unit/integration tests (Flask test client) python integration_smoke_test.py # live-server smoke test (requires a running server) ``` 每次推送和 pull request 都会运行 [`.github/workflows/ci.yml`](.github/workflows/ci.yml):它会安装依赖,运行 `pytest`(**任何测试失败都会导致构建失败**),然后运行 `pip-audit`(依赖项 CVE 扫描)和 `bandit`(静态安全 lint)作为**非阻塞**检查,其结果将显示在日志中。 ## 🔐 安全说明 - 在扫描任何目标之前,请务必获得明确的书面许可。 - 本工具仅供授权的安全测试使用。 - 严禁非法使用本工具。 - 默认的管理员凭据(`admin` / `admin123`)必须更改 — 应用会强制在首次登录时更改密码,并拒绝在生产环境中以默认的 `SECRET_KEY` / `JWT_SECRET_KEY` 值启动。 - 切勿提交真实的 `.env`。所需密钥请参见 `.env.example`。 ## 🎓 项目信息 **类型:** 作品集项目 — Web 应用安全 / VAPT **技术栈:** Python Flask、原生 JS 前端、SQLite、ReportLab **OWASP 覆盖范围:** A01–A03、A05–A07、A09
标签:CISA项目, DOE合作, Flask, Python, URL发现, Web应用漏洞扫描, 安全检测, 搜索引擎查询, 无后门, 特征检测, 自动化报告, 自定义脚本, 请求拦截, 逆向工具