AbbasAIWorks/web-vulnerability-scanner

GitHub: AbbasAIWorks/web-vulnerability-scanner

一个基于 Flask 的自托管 Web 漏洞扫描平台,通过十个被动只读模块对授权目标进行安全评估并自动生成报告。

Stars: 0 | Forks: 0

# VulnScan PRO — 专业 Web 漏洞扫描器 这是一个全栈 Flask Web 应用程序,用于对您拥有或获得明确授权的网站执行**安全的只读**安全评估。它将扫描器引擎(包含 10 个被动检查模块)、基于 SQLite 的仪表板以及自动化的 HTML/PDF 报告生成功能整合到一个可自托管的工具中。 ## 功能 **扫描器模块(均为被动 / 只读)** - 信息收集 — 域名、解析的 IP、反向 DNS 托管提示、HTTP 状态、响应时间 - 技术指纹识别 — 服务器软件、CMS 检测、JS 库、框架 Headers - 安全 Headers 分析器 — CSP、HSTS、X-Frame-Options、Referrer-Policy、Permissions-Policy、X-Content-Type-Options、Cache-Control - SSL/TLS 分析器 — 证书颁发者/subject、到期倒计时、协商的 TLS 版本 - Cookie 安全性 — 每个 Cookie 的 Secure、HttpOnly、SameSite 标志 - robots.txt / sitemap.xml 发现 - HTTP 响应分析器 — 重定向链、压缩、缓存 Headers - 表单发现 — GET/POST 表单、输入字段、密码字段、CSRF token 启发式检测 - 反射检查 — 基于标记的被动指示器,用于检测未转义的输入反射 - 基础 SQL 错误检测 — 针对泄露的数据库错误消息的良性输入启发式检测 **平台** - 基于 Session 的身份验证(Flask-Login + bcrypt 密码哈希) - Projects → Scans → Findings → Reports 数据模型 (SQLite) - 通过 `ThreadPoolExecutor` 并发执行扫描,每次扫描在后台线程中运行 - 实时扫描进度轮询(JSON endpoint + JS 轮询,无需重新加载页面) - 包含严重程度细分图表 (Chart.js)、最近活动流和主要风险的仪表板 - 一键生成 HTML 和 PDF 报告(Jinja2 + ReportLab) - 按关注点拆分的轮转文件日志:应用程序、错误、扫描、报告、身份验证 - 基于 Bootstrap 5 + Bootstrap Icons 构建的深色、响应式、带动画侧边栏的 UI ## 技术栈 Python 3.12 · Flask · Flask-Login · SQLite · Jinja2 · Bootstrap 5 · Chart.js · Requests · BeautifulSoup4 · `socket`/`ssl` (标准库) · ReportLab · bcrypt · python-dotenv · gunicorn ## 项目结构 ``` web-vulnerability-scanner/ ├── app.py # Flask application factory / entry point ├── config.py # Centralized typed configuration (reads .env) ├── database.py # SQLite connection management + schema init ├── models.py # Data-access layer (all SQL lives here) ├── requirements.txt ├── .env.example # Copy to .env and edit before running │ ├── scanner/ # Scanner engine │ ├── base.py # Finding dataclass, shared HTTP helpers │ ├── engine.py # Orchestrates all modules via ThreadPoolExecutor │ ├── info_gathering.py │ ├── tech_fingerprint.py │ ├── security_headers.py │ ├── ssl_analyzer.py │ ├── cookies.py │ ├── robots_sitemap.py │ ├── http_analyzer.py │ ├── forms.py │ ├── reflection.py │ └── sql_errors.py │ ├── routes/ # Flask blueprints │ ├── auth.py # login / logout / register │ ├── dashboard.py │ ├── projects.py │ ├── scan.py # start scan, status polling, history, delete │ ├── reports.py # generate + download HTML/PDF reports │ └── settings.py │ ├── utils/ │ ├── logger.py # Rotating file log configuration │ ├── validators.py # URL / username / email / password validation │ └── report_generator.py # HTML (Jinja2) + PDF (ReportLab) report builders │ ├── templates/ # Jinja2 templates (dark theme, Bootstrap 5) │ ├── base.html │ ├── login.html / register.html │ ├── dashboard.html │ ├── projects.html / new_project.html / project_detail.html │ ├── scan_results.html / scan_history.html │ ├── reports_list.html │ ├── settings.html │ └── errors/404.html / errors/500.html │ ├── static/ │ ├── css/style.css # Full dark cybersecurity theme │ └── js/sidebar.js, scan_status.js │ ├── database/ # SQLite .db file created here at runtime ├── reports/ # Generated HTML/PDF reports saved here ├── logs/ # Rotating log files saved here └── exports/ # Reserved for future export features ``` ## 安装 **环境要求:** Python 3.12+,pip ``` # 1. 克隆 / 复制项目,然后进入该项目 cd web-vulnerability-scanner # 2. 创建并激活虚拟环境 python3 -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate # 3. 安装依赖 pip install -r requirements.txt # 4. 创建你的环境文件 cp .env.example .env # 编辑 .env:设置真实的 SECRET_KEY 并更改 DEFAULT_ADMIN_PASSWORD # 5. 运行应用程序(开发环境) python app.py ``` 该应用程序将会: - 在首次运行时自动在 `database/scanner.db` 创建 SQLite 数据库 - 如果 `reports/`、`logs/` 和 `exports/` 目录缺失,则自动创建 - 使用 `.env` 中的 `DEFAULT_ADMIN_USERNAME` / `DEFAULT_ADMIN_PASSWORD` 初始化默认管理员账户 访问 **http://127.0.0.1:5000** 并使用您配置的管理员凭据登录。**首次登录后请立即修改默认管理员密码**(通过已注册账户的流程,或者注册一个新账户并停用初始化的账户)。 ### 生产环境部署 ``` gunicorn -w 4 -b 0.0.0.0:5000 app:app ``` 在 gunicorn 前端部署反向代理(nginx、Caddy)以进行 TLS 终止,并在通过 HTTPS 提供服务后在 `.env` 中设置 `SESSION_COOKIE_SECURE=True`(已经是默认值)。 ## 用法 1. **注册 / 登录。** 2. **创建 Project** — 给它命名并输入您获得授权测试的目标 URL。 3. 从项目页面**启动 Scan**。它将在后台运行;结果页面会进行实时轮询并自动更新。 4. **审查 Findings** — 按严重程度(High / Medium / Low / Info)分组并用颜色编码,每个发现都包含描述、建议和支持性证据。 5. **生成 Report** — 在已完成扫描的结果页面点击“Generate HTML”或“Generate PDF”,然后从同一页面或全局的 Reports 列表中下载。 6. **调整 Settings** — 公司名称(显示在报告中)、扫描器线程数和请求超时时间可以在 Settings 页面直接编辑,无需修改 `.env`。 ## 配置参考 所有设置均位于 `.env` 中(有关带有默认值的完整列表,请参见 `.env.example`): | 变量 | 用途 | |---|---| | `SECRET_KEY` | Flask session 签名密钥 — 在任何实际部署前**必须**更改 | | `DATABASE_PATH` | SQLite 文件位置,相对于项目根目录 | | `SCANNER_MAX_THREADS` | 每次扫描的并发扫描器模块(也可在应用内编辑) | | `SCANNER_REQUEST_TIMEOUT_SECONDS` | 所有扫描器模块的每次请求 HTTP 超时时间 | | `SCANNER_VERIFY_SSL` | 出站扫描请求是否验证 TLS 证书 | | `DEFAULT_ADMIN_USERNAME` / `DEFAULT_ADMIN_PASSWORD` | 初始化的管理员账户(仅限首次运行) | ## 已知局限与未来改进 - `routes/reports.py` 中用于报告下载的所有权查找是通过遍历用户的 scans/reports 进行的,而不是直接的索引查询 — 在典型规模下没问题,但对于大型部署,带有所有权 JOIN 的 `models.get_report_by_id()` 效率会更高。 - 反射和 SQL 错误检测模块是特意设计的保守启发式方法(单一良性测试输入,无 payload 链接) — 它们标记的是值得人工审查的*指示器*,而不是已确认的可利用漏洞。 - 目前除了 `SCANNER_MAX_THREADS` 之外,未对出站扫描请求应用任何速率限制/节流 — 如果扫描具有激进 WAF 的目标,请添加按主机延迟。 - 没有内置调度功能(定期/cron 扫描) — 扫描是针对每个项目手动触发的。 - 截图:*(在发布前在此处添加仪表板、扫描结果和 PDF 报告的截图)* ## 许可证 作为教育/作品集毕业项目提供。可自由使用、修改和扩展,仅用于授权的安全测试和学习目的。
标签:逆向工具