Mapfoi/Web-vulnerability-scanner

GitHub: Mapfoi/Web-vulnerability-scanner

基于 Python asyncio 的高性能 Web 漏洞扫描器,提供七项内置安全检查并支持多来源目标导入与多格式报告导出。

Stars: 0 | Forks: 0

# 🕸️ Web 漏洞扫描器 [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/) [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) [![aiohttp](https://img.shields.io/badge/aiohttp-3.9+-orange.svg)](https://docs.aiohttp.org/) [![rich](https://img.shields.io/badge/rich-13.7+-red.svg)](https://github.com/Textualize/rich) **高性能异步 Web 漏洞扫描器**,专为教育目的设计。演示了 Python 中的高吞吐量网络编程原理、异步 HTTP 请求处理以及模块化架构。 ## 📌 功能 - ⚡ **异步扫描** — 使用 `asyncio` + `aiohttp` 实现数千个并发目标 - 🔍 **7 项内置安全检查**: - 暴露的 Git 仓库 (`.git/HEAD`) - 可访问且包含敏感信息的 `.env` 文件 - 备份文件 (`backup.zip`、`dump.sql` 等) - 默认管理面板 (`/wp-admin`、`/phpmyadmin`) - 缺失的安全标头 (XFO, CSP, XCTO) - 反射型 XSS (参数中的标记注入) - 响应中的 SQL 错误特征 - 🎛️ **目标来源**:文本文件、CSV、单个 URL、**crt.sh** (子域名)、**Shodan** - 📊 **速率限制** (Token Bucket):全局和单主机限制 - 🖥️ 基于 `argparse` 和 rich 彩色输出的 **CLI** - 🖱️ **TUI 菜单**:支持交互式控制、暂停/恢复以及实时配置更改 - 📄 **报告格式**:JSON、CSV、人类可读的 `.txt` - 🧩 **清晰的架构**:核心层 (`core/`) 完全独立于 UI 层 (`cli/`、`gui/`) ## 🚀 快速开始 ### 前置条件 - Python 3.11 或更高版本 - 建议使用虚拟环境 ### 安装 ``` git clone https://github.com/Mapfoi/Web-vulnerability-scanner.git cd web-vulnerability-scanner # 创建并激活 virtual environment python -m venv .venv source .venv/bin/activate # Linux/macOS .venv\Scripts\activate # Windows # 安装 dependencies pip install -r scanner/requirements.txt ``` ### 使用示例 ``` # 扫描单个 URL python scanner/scanner.py --url https://example.com --checks all # 从文件进行批量扫描 python scanner/scanner.py --targets urls.txt --concurrency 200 --rate 30 # 通过 crt.sh 收集 subdomains 并扫描它们 python scanner/scanner.py --domain example.com --crtsh-retries 6 # 交互式 TUI 菜单 python scanner/scanner.py ``` ## 🧠 架构 ``` web-vulnerability-scanner/ ├── scanner/ # Root package │ ├── core/ # 🔧 Core engine (UI-independent) │ │ ├── engine.py # ScannerEngine facade │ │ ├── events.py # EventEmitter + ScanEvent │ │ ├── http_client.py # HTTP client with retry & rate limiting │ │ ├── rate_limiter.py # Token Bucket (global + per-host) │ │ ├── targets.py # URL normalization, target loading │ │ ├── checks/ # Security check modules (7) │ │ ├── output.py # Streaming JSON/CSV/TXT writer │ │ └── dns_resolver.py # Async DNS resolver with cache │ ├── cli/ # 🖥️ Command-line interfaces │ │ ├── main.py # argparse + engine launcher │ │ ├── tui_menu.py # Interactive TUI (rich) │ │ └── console_handler.py # Event handler for console output │ ├── gui/ # 🖼️ PyQt stub (future extension) │ ├── scanner.py # Entry point │ └── requirements.txt # Dependencies ├── README.md # This file └── .gitignore # Git exclusions ``` ## ⚙️ 命令行参数 | 参数 | 描述 | 默认值 | |-----------|-------------|---------| | `--targets` | 包含 URL 列表的文件 | — | | `--url` | 单个待扫描 URL | — | | `--domain` | 用于通过 crt.sh 枚举子域名的域名 | — | | `--csv` | 包含目标的 CSV 文件 | — | | `--csv-column` | 包含 URL 的列名 | `url` | | `--shodan-query` | Shodan 搜索查询 | — | | `--shodan-key` | Shodan API 密钥 | — | | `--checks` | `all` 或逗号分隔的列表 | `all` | | `--concurrency` | 并行工作线程数 | `500` | | `--rate` | 全局速率限制 (req/s, 0 = 无限制) | `0` | | `--per-host-rate` | 单主机速率限制 (req/s) | `30` | | `--timeout` | HTTP 超时 (秒) | `3.0` | | `--retries` | 失败重试次数 | `1` | | `--output` | 结果文件的基本名称 | `results` | | `--format` | `json`, `csv`, `both`, `all` | `both` | | `--verbose` | 详细输出 | `False` | | `--quiet` | 最少输出 | `False` | | `--allow-private` | 允许扫描本地/私有地址 | `False` | | `--tui` | 强制打开 TUI 菜单 | `False` | ## 📊 报告示例 扫描完成后,将创建以下文件: - `results.txt` — 按严重程度分组的人类可读报告 - `results.json` — 用于机器处理的结构化 JSON - `results.csv` — 用于 Excel 的表格格式 控制台输出示例: ``` ▸ Missing Security Headers — http://example.com Missing or invalid: X-Frame-Options, Content-Security-Policy Scan finished: 150 URLs, 12 findings in 8.3s ``` ## 🧪 开发者指南:添加新检查 1. 在 `scanner/core/checks/` 中创建文件,例如 `new_check.py` 2. 继承 `BaseCheck` 并实现 `check()` 方法 3. 将该类添加到 `scanner/core/checks/__init__.py` 中的 `ALL_CHECKS` ``` from scanner.core.checks.base import BaseCheck, Severity, VulnerabilityResult from scanner.core.http_client import HttpClient class MyCheck(BaseCheck): name = "my_check" description = "Description of my check" severity = Severity.MEDIUM async def check(self, url: str, client: HttpClient): # your logic here if condition: return VulnerabilityResult( name="My Vulnerability", severity=self.severity, evidence="...", target=url, ) return None ``` ## 📚 演示的教育概念 | 概念 | 实现 | |---------|----------------| | OSI 模型 (传输层 + 应用层) | `http_client.py`, `rate_limiter.py` | | 异步 I/O (事件循环, 协程) | `engine.py`, 所有 `check` 模块 | | Token Bucket 速率限制 | `rate_limiter.py` | | TCP 连接、keep-alive、连接池 | `aiohttp.TCPConnector`, `ClientSession` | | HTTP 标头、状态码、超时 | `http_client.py` | | 带缓存的 DNS 解析 | `dns_resolver.py` | | 单个 URL 上的并行检查 | `engine.py` (`_run_checks_parallel`) | | 生产者-消费者模式 | `TargetQueue` + workers | | 事件驱动架构 | `events.py`, `EventEmitter` | | User-Agent 轮换 | `http_client.py` | ## ⚠️ 负责任地使用 **本工具仅供教育目的及测试您拥有书面许可的系统使用。** 未经授权的扫描可能会违反计算机安全法及目标服务的服务条款。 请始终遵守: - 扫描前获取许可 - 使用 `--rate` 参数以减轻负载 - 未经明确授权,切勿测试政府、银行或关键基础设施 ## 🤝 许可证 MIT 许可证 — 可自由使用、修改和分发,但需注明出处。 ## 📬 反馈 如果您发现 Bug 或有建议,请提交 Issue 或 Pull Request。也欢迎有关课程作业的问题。 ⭐ 如果您觉得有用,请为本仓库点个 Star!
标签:Python, Web漏洞扫描器, 主机安全, 实时处理, 密码管理, 异步IO, 数据泄露, 无后门, 计算机取证, 逆向工具