MisbahSangi/VulneraX
GitHub: MisbahSangi/VulneraX
一个基于 FastAPI 的轻量级 Web 漏洞扫描器,通过浏览器仪表盘提供实时进度展示、多类安全检查和 PDF 报告生成。
Stars: 0 | Forks: 0
# VulneraX - Web 漏洞扫描器
VulneraX 是一个基于 FastAPI 的 Web 漏洞扫描器,配备浏览器仪表盘。它扫描目标 URL,运行多项安全检查,显示实时进度,存储扫描历史,并生成 PDF 报告。
## 本项目的作用
- 提供用于运行扫描和检查结果的 Web 仪表盘。
- 验证用户提供的目标 URL,并阻止对 localhost/私有 IP 的扫描。
- 发现内部链接并扫描已发现的页面。
- 运行多项漏洞检查(XSS、SQLi、Headers、CSRF、TLS 等)。
- 将扫描进度和日志流式传输到前端。
- 将发现的结果存储在文本日志中。
- 生成结构化的 PDF 报告。
- 通过过滤器、图表、趋势和导出选项对发现的结果进行可视化展示。
## 项目结构
```
project_root/
main.py
config/
settings.json
reports/
vulnerability_log.txt
vulnerability_report.pdf
scanner_core/
__init__.py
crawler.py
logger.py
payloads.py
pdf_exporter.py
remediation_advice.py
scanner.py
static/
main.js
templates/
index.html
```
## 端到端流程(从开始到结束)
1. 应用启动 (`main.py`)
- FastAPI 应用启动。
- 创建/确保 `reports/` 目录存在。
- 挂载静态文件和 Jinja 模板。
- 初始化内存中的扫描状态:
- 用于实时进度和日志的 `SCAN_STATE`。
- 用于最新发现和摘要的 `LATEST_RESULT`。
2. 用户打开仪表盘 (`GET /`)
- 渲染 `templates/index.html`。
- 从配置中注入默认启用的检查项。
- 从文本日志中注入最近的扫描历史。
- 从内存中注入上一次已知的扫描结果。
3. 用户开始扫描 (`POST /scan`)
- 前端发送 URL + 启用的检查项。
- 后端验证并规范化 URL。
- 拒绝 localhost/私有/内部主机。
- 重置扫描状态。
- 启动后台扫描任务。
4. 后台扫描器运行 (`scanner_core/scanner.py`)
- 加载启用的检查项。
- 从目标中发现内部链接。
- 按顺序扫描发现的链接。
- 发出进度消息和阶段更新。
- 汇总发现的结果并构建摘要。
- 将扫描摘要写入日志文件。
- 写入详细的漏洞条目。
- 生成 PDF 报告。
5. 前端轮询实时状态 (`GET /scan-status`)
- 进度条更新。
- 当前检查阶段可视化更新。
- 实时扫描日志出现在 UI 中。
- 显示估计的剩余时间。
6. 扫描完成
- 状态变为 `done`。
- 前端使用 `GET /last-results` 刷新结果。
- 发现结果表格、图表和历史记录更新。
- 触发可选的完成提示音/通知。
7. 报告下载 (`GET /download-report`)
- 如果可用,则提供 `reports/vulnerability_report.pdf`。
## 后端 API 端点
- `GET /`
- 返回仪表盘页面。
- `POST /scan`
- 启动后台扫描。
- Body 字段包括 `target_url` 以及用于检查项的复选框字段。
- `GET /scan-status`
- 返回 `{status, progress, phase, log_lines, target}`。
- `POST /cancel-scan`
- 将内存中的状态重置为空闲/已取消(UI 级别的取消)。
- `GET /last-results`
- 返回上一次的目标、发现结果、摘要和历史记录。
- `GET /download-report`
- 返回生成的 PDF 报告。
## 扫描器检查项及其工作原理
### 1) XSS
- 查找页面上的表单。
- 提交来自 `payloads.py` 的 payloads。
- 标记响应正文中出现的反射 payload。
### 2) SQL 注入
- 通过表单提交 SQLi payloads。
- 在响应中查找已知的 SQL 错误文本。
### 3) 安全 Headers
- 请求 headers 并检查:
- Content-Security-Policy
- X-Content-Type-Options
- X-Frame-Options
- Referrer-Policy
- Strict-Transport-Security
- 缺少 headers 将产生发现结果。
### 4) CSRF
- 扫描 POST 表单。
- 标记没有类似 token 输入名称的表单。
### 5) 目录列表
- 对于以斜杠结尾的路径,检查页面内容中是否存在目录索引标记。
### 6) 弱 TLS / 不安全传输
- HTTP scheme -> 不安全传输发现。
- 无 HSTS 的 HTTPS scheme -> 弱 TLS 发现。
### 7) 开放重定向 (基于模式)
- 检查发现的链接和查询字符串中是否存在类似重定向的参数模式。
### 8) 敏感信息泄露
- 扫描响应正文以查找危险关键字(password、token、private key、traceback 等)。
### 9) 点击劫持
- 标记缺少 `X-Frame-Options` 以及缺少 CSP `frame-ancestors` 的情况。
### 10) Cookie 安全
- 解析 `Set-Cookie` header。
- 标记缺少 `HttpOnly` 以及(在 HTTPS 上)缺少 `Secure` 的情况。
## 前端功能
- 具有本地持久性的浅色/深色主题切换。
- 扫描控制和检查项选择 UI。
- 实时进度、阶段网格和日志。
- 严重性摘要卡片。
- 发现结果表格包含:
- 排序
- 过滤
- 搜索
- 分页
- 证据展开
- 修复建议
- 行选择和 JSON 导出
- 图表:
- 按类型的圆环图
- 按类型堆叠的严重性图
- 扫描历史的趋势图
- 最近扫描面板。
## 日志记录和报告
- `scanner_core/logger.py`
- 写入详细的漏洞块。
- 写入用于历史记录的单行扫描摘要。
- `scanner_core/pdf_exporter.py`
- 构建包含摘要、详细信息和可选原始日志的 PDF。
- `scanner_core/remediation_advice.py`
- 为每种漏洞类型提供描述、修复步骤和默认严重级别。
## 配置
在 `config/settings.json` 中定义:
- `crawler.max_pages`
- `crawler.max_depth`
- `crawler.request_timeout`
- `scan.max_scan_time_seconds`
- `checks.*` 默认检查项开关
## 当前缺陷(重要)以及如何完善它们
### 1) 取消仅限于 UI 层面,并非真正的任务取消
缺陷:
- `POST /cancel-scan` 会重置状态,但正在运行的后台扫描可以在服务器端继续执行。
如何完善:
- 添加在每个扫描循环和请求调用边界内检查的协作取消 token/event。
- 通过 ID 跟踪扫描作业并安全停止活动作业。
- 更新 API 以返回作业 ID 并允许定向取消。
### 2) 开放重定向检查较弱,可能会遗漏或过度标记
缺陷:
- 当前逻辑使用简单的 URL/查询模式启发式方法。
如何完善:
- 从内部端点解析已知的重定向参数。
- 使用受控的外部 URL 主动测试重定向行为。
- 验证实际的 Location header/domain 转换。
- 添加误报抑制逻辑。
### 3) XSS 和 SQLi 检查属于基本的启发式检查
缺陷:
- 反射/错误字符串检测较为浅显,可能会遗漏真实问题或标记无害情况。
如何完善:
- 添加上下文感知 payloads (HTML、attribute、JS context)。
- 添加响应差异和编码分析。
- 添加时间分析和特定于 DB 的 SQLi 特征。
- 添加置信度评分 (高/中/低置信度)。
### 4) 爬取深度有限且无 JS 渲染
缺陷:
- 扫描器基于 requests/BeautifulSoup;会遗漏 JS 渲染的路由和动态表单。
如何完善:
- 集成可选的无头浏览器爬取模式 (Playwright)。
- 合并静态和动态路由发现。
- 添加 robots/sitemap 解析。
### 5) 内存中的运行时状态对多 worker 并不安全
缺陷:
- `SCAN_STATE` 和 `LATEST_RESULT` 是进程内存全局变量。
如何完善:
- 将状态移至 Redis 或 DB。
- 添加按用户/按作业的状态隔离。
- 支持并发扫描和持久化进度跟踪。
### 6) 日志格式混杂且难以可靠解析
缺陷:
- 同一个文本文件中包含摘要行和详细块。
如何完善:
- 将规范化的发现结果存储在结构化的 JSON/DB 表中。
- 将人类可读的日志作为派生输出保留。
- 添加报告版本控制和 schema。
### 7) 扫描端点没有身份验证/速率限制
缺陷:
- 任何可以访问应用的人都可以触发扫描。
如何完善:
- 添加身份验证 (JWT/session)、RBAC 和 API key 支持。
- 添加请求节流和配额。
- 添加扫描器操作的审计日志。
### 8) 缺少依赖清单
缺陷:
- 工作区中没有 `requirements.txt` 或 `pyproject.toml`。
如何完善:
- 添加固定版本的依赖文件和安装说明。
- 添加可重现的环境 (venv + lockfile)。
### 9) 没有自动化测试
缺陷:
- 没有针对扫描器行为的单元/集成测试。
如何完善:
- 为每个检查模块添加测试。
- 为确定性扫描添加模拟的 HTTP fixtures。
- 为端点和扫描生命周期添加 API 测试。
### 10) 严重性模型是静态且简化的
缺陷:
- 严重性通常由漏洞类型固定,而非上下文感知。
如何完善:
- 添加类似 CVSS 的上下文评分。
- 包括可利用性、影响和置信度。
- 添加环境标签 (prod/stage/internal)。
## 最佳的未来计划和增强功能
## 阶段 1:稳定性和正确性(近期)
1. 添加真正可取消的扫描作业。
2. 添加结构化结果存储。
3. 引入依赖清单并锁定版本。
4. 添加健壮的异常遥测和错误分类。
5. 为端点和扫描器检查添加自动化测试。
交付物:
- 基于作业的扫描生命周期 (`queued`、`running`、`cancelling`、`cancelled`、`done`、`failed`)。
- 来源于 DB 的可靠历史 API。
- 运行测试和 linting 的 CI 流水线。
## 阶段 2:更好的检测质量
1. 重新设计开放重定向检测为主动验证。
2. 通过上下文感知的 payload 策略改进 XSS 和 SQLi 引擎。
3. 添加置信度评分和证据快照。
4. 添加去重和规范化的发现结果指纹识别。
交付物:
- 更低的误报率。
- 报告中更好的漏洞可追溯性。
- 通过置信度 + 严重性实现更好的优先级排序。
## 阶段 3:扩大覆盖范围
1. 为重度依赖 JS 的应用提供无头浏览器爬取模式。
2. 添加身份验证支持 (cookie/session 脚本)。
3. 添加可选的检查模块:
- SSRF 模式
- IDOR 启发式算法
- CORS 错误配置
- 暴露的 admin 端点
4. 添加 API/OpenAPI 端点扫描模式。
交付物:
- 更好地覆盖现代 SPA 和 API 驱动的系统。
- 更大的漏洞类别覆盖范围。
## 阶段 4:产品化和规模化
1. 多租户架构。
2. 用户账户、角色管理和审计追踪。
3. 分布式扫描 worker 和队列。
4. 导出集成 (JSON、SARIF、SIEM/webhooks)。
5. 定期扫描和运行间的差异报告。
交付物:
- 可扩展的扫描平台。
- 对团队友好的工作流和合规性报告。
## 展望未来的建议工程标准
- 添加类型注解和静态检查 (`mypy`、`ruff`、`black`)。
- 添加 API schema 文档和端点契约测试。
- 使用模块化的检查器接口 (插件架构)。
- 保持漏洞证据的确定性和可重现性。
- 在 UI/API 中添加安全默认设置和法律护栏。
## 快速开始(建议)
1. 创建并激活虚拟环境。
2. 安装依赖项。
3. 使用 Uvicorn 运行应用。
4. 打开仪表盘并开始扫描。
示例运行命令:
```
uvicorn main:app --reload
```
## 教育与法律声明
本扫描器仅用于教育和授权的安全测试。
请仅扫描您拥有或已获得明确测试许可的系统。
标签:AV绕过, CISA项目, CSRF检测, FastAPI, HTTP/HTTPS抓包, HTTP安全头检测, PDF导出, Python, Splunk, SQL注入检测, TLS/SSL检查, Web安全, Web漏洞扫描器, XSS检测, 代码生成, 安全可视化, 安全基线检查, 安全报告生成, 安全测试, 安全防守工具, 态势感知, 攻击性安全, 攻击面梳理, 无后门, 渗透测试工具, 网站安全, 网络安全, 蓝队分析, 逆向工具, 隐私保护