mohdtarique909/Web-Vulnerability-Scanner

GitHub: mohdtarique909/Web-Vulnerability-Scanner

一款低误报的自动化 Web 漏洞扫描器,通过异步爬取和主动确认检测机制覆盖 XSS、SQLi 等五大类漏洞并生成专业报告。

Stars: 1 | Forks: 0

# webscanner — Web 应用漏洞扫描器 一款自动化的 Web 应用漏洞扫描器,专为**低误报**、**清晰的架构**和**专业的报告**而构建。它会爬取目标,发现其攻击面(URL、表单、参数),并运行一组专注的检测模块——每个模块都带有主动**确认步骤**——然后生成映射到 **OWASP Top 10 (2021)** 和 **CWE** 标识符的 JSON 和 HTML 报告。 ## 目录 - [功能](#features) - [支持的漏洞类型](#supported-vulnerability-classes) - [架构](#architecture) - [安装](#installation) - [使用方法](#usage) - [认证扫描](#authenticated-scanning) - [报告](#reports) - [演示](#demo) - [如何降低误报](#how-false-positives-are-reduced) - [局限性](#limitations) ## 功能 - **异步爬虫**,可发现页面、表单和参数,同时严格保持在范围内主机的白名单中。 - **五大检测模块**(安全标头、反射型 XSS、SQL 注入、CSRF、开放重定向),每个模块在报告前都会执行主动确认。 - **上下文感知的 XSS** 检测,可对反射上下文进行分类,仅当符合上下文的突破在未经编码的情况下存活时,才会引发 HIGH 严重性警报。 - **三种 SQLi 技术**——基于错误、基于布尔的盲注和基于时间的盲注——对基于时间的检测具有抗抖动的确认机制。 - **专业报告**,提供机器可读的 JSON 和自包含的 HTML 仪表板,其中包含针对每项发现的证据、OWASP/CWE 标签和修复指南。 - **认证扫描**,支持通过 cookie、bearer/header token 或表单登录进行。 - **可扩展**:在 `scanner/modules/` 中放入一个新模块,它就会自动注册;payload 存放在运行时加载的 YAML 文件中。 - **可脚本化**:遇到任何 HIGH/CRITICAL 发现时会返回非零退出码,因此可以完美集成到 shell 脚本和自动化流程中。 ## 支持的漏洞类型 | 模块 | 漏洞 | OWASP 2021 | CWE | |-----------------|-------------------------------------|-----------------------------------------|------------------------------| | `headers` | 缺失/薄弱的安全标头 | A05:2021 – Security Misconfiguration | CWE-693, CWE-1021 | | `headers` | 不安全的 cookies (HttpOnly/Secure/SameSite) | A05:2021 – Security Misconfiguration | CWE-614, CWE-1004 | | `xss` | 反射型跨站脚本攻击 (XSS) | A03:2021 – Injection | CWE-79 | | `sqli` | SQL 注入 (错误/布尔/时间) | A03:2021 – Injection | CWE-89 | | `csrf` | 跨站请求伪造 (CSRF) | A01:2021 – Broken Access Control | CWE-352 | | `open_redirect` | 开放重定向 | A01:2021 – Broken Access Control | CWE-601 | ## 架构 该扫描器拥有一个小巧的异步核心,带有可自动注册、可独立测试的模块。可以在不触动引擎、爬虫、报告生成器或 CLI 的情况下添加新的检测模块。 ``` +-------------------+ | CLI (main.py) | typer + rich | --i-have-author. | +---------+---------+ | builds ScanConfig v +-------------------+ | Orchestrator | crawl -> scan -> aggregate +----+----------+---+ | | +----------------+ +----------------+ v v +---------------+ +-----------------+ | Crawler | BFS, forms/links | Detection modules| | + Scope | -> InjectablePoints | (registry) | +-------+-------+ +--------+--------+ | | | shared httpx.AsyncClient (cookies, | +-------------> Engine <----------------------+ | concurrency cap, retries, | 429 backoff, evidence capture +-----------+-----------+ | v +-----------------------+ | Reporter | JSON + Jinja2 HTML +-----------------------+ ``` **模块布局** ``` scanner/ ├── engine.py # async HTTP engine (concurrency, retries, evidence) ├── crawler.py # BFS spider -> InjectablePoints ├── scope.py # allowlist + URL normalization ├── models.py # pydantic models (Finding, InjectablePoint, ScanResult…) ├── config.py # ScanConfig + YAML payload loaders ├── orchestrator.py # the scan pipeline ├── reporter.py # JSON + HTML report generation ├── payloads/*.yaml # runtime-loaded payloads (no code change to extend) └── modules/ ├── base.py # BaseScanner ABC + registry ├── headers.py ├── xss.py ├── sqli.py ├── csrf.py └── open_redirect.py templates/report.html.j2 # HTML report template main.py # typer CLI entry point ``` ## 安装 要求 **Python 3.11+**。 ``` # 1. Clone git clone https://github.com/yourusername/Web-Vulnerability-Scanner.git cd Web-Vulnerability-Scanner # 2. 创建 virtual environment python -m venv .venv # Windows: .venv\Scripts\activate # macOS/Linux: source .venv/bin/activate # 3. 安装 dependencies pip install -r requirements.txt ``` 可选:用于 SPA/JS 密集型站点的 JavaScript 渲染 (`--render`): ``` pip install playwright playwright install chromium ``` 在没有 Playwright 的情况下,扫描器也能完全正常工作;如果未安装,`--render` 会回退到静态抓取模式。 ## 使用方法 ``` python main.py scan \ --url http://localhost:3000 \ --depth 3 \ --modules xss,sqli,headers \ --concurrency 10 \ --output reports/scan \ --format html,json \ --i-have-authorization ``` 列出可用模块: ``` python main.py modules ``` ### 关键标志 | 标志 | 描述 | |------|-------------| | `--url` | 目标种子 URL (http/https)。**必填。** | | `--depth` | 最大爬取深度 (默认 3)。 | | `--max-pages` | 最大爬取页面数 (默认 200)。 | | `--modules` | 要启用的模块的逗号分隔列表 (默认:所有)。 | | `--concurrency` | 最大并发请求数 (默认 10)。 | | `--timeout` | 每个请求的超时时间(秒)(默认 15)。 | | `--output` | 报告基本名,不带扩展名 (默认 `reports/scan`)。 | | `--format` | `html`、`json` 或 `html,json` (默认两者皆有)。 | | `--render` | 使用 Playwright 渲染页面 (如果已安装)。 | | `--proxy` | 上游代理,例如 `http://127.0.0.1:8080` 用于通过 Burp 进行路由。 | | `--header` | 额外的请求标头 `'Name: Value'` (可重复使用)。 | | `--auth-cookie` | 用于认证扫描的 cookie 标头值。 | | `--auth-header` | 认证标头,例如 `'Authorization: Bearer …'`。 | | `--scope` | 额外的范围内主机 (可重复使用)。 | | `--respect-robots` | 遵守 `robots.txt` 中的 Disallow 规则。 | | `--i-have-authorization` | **必填。** 确认您已获得授权进行扫描。 | | `--verbose / --quiet` | 输出详细程度。 | **退出码:** `0` = 无 HIGH/CRITICAL 发现,`1` = 存在 HIGH/CRITICAL 发现(对脚本/自动化很有用),`2` = 配置错误或缺少授权标志。 ## 认证扫描 在登录后进行扫描的三种方法。凭证在运行时提供,绝不会进行硬编码。 **会话 cookie:** ``` python main.py scan --url https://app.example.com \ --auth-cookie "session=eyJ...; theme=dark" --i-have-authorization ``` **Bearer / API token:** ``` python main.py scan --url https://app.example.com \ --auth-header "Authorization: Bearer eyJhbGci..." --i-have-authorization ``` **表单登录**(扫描器自行登录,然后重用已认证的会话): ``` python main.py scan --url https://app.example.com \ --login-url https://app.example.com/login \ --login-user-field username --login-pass-field password \ --login-user alice --login-pass 's3cret' \ --login-extra "Login=submit" \ --i-have-authorization ``` ## 报告 - **JSON** (`.json`) — 完整的 `ScanResult` 序列化结果,用于自动化处理、差异比对或被其他工具摄取。 - **HTML** (`.html`) — 一个自包含的仪表板:严重性计数、扫描元数据,以及带有证据(请求/响应片段)、OWASP + CWE 标签和修复指南的单项发现卡片。 ## 演示 扫描一个小型的、刻意设计包含漏洞的目标会产生: ``` webscanner starting scan of http://127.0.0.1:8765 modules: all | depth: 2 | max-pages: 20 | concurrency: 8 wrote HTML report -> reports\scan.html wrote JSON report -> reports\scan.json Scan summary +------------------+ | Severity | Count | |----------+-------| | CRITICAL | 0 | | HIGH | 3 | | MEDIUM | 10 | | LOW | 0 | | INFO | 0 | +------------------+ Crawled, sent 107 requests in 0.2s; 13 finding(s). HIGH/CRITICAL findings present — exiting non-zero. ``` 发现结果(节选)——每一个都经过了主动**确认 (CONFIRMED)**: ``` [HIGH ] CONFIRMED xss CWE-79 Reflected XSS in parameter 'q' (html) [HIGH ] CONFIRMED sqli CWE-89 Error-based SQL injection in 'id' (mysql) [MEDIUM] CONFIRMED open_redirect CWE-601 Open redirect in parameter 'next' [MEDIUM] CONFIRMED csrf CWE-352 POST form without anti-CSRF token [MEDIUM] CONFIRMED headers CWE-693 Missing Content-Security-Policy header ``` 在浏览器中打开 `reports/scan.html` 即可查看包含证据和修复指南的完整仪表板。(要在本地重现,请将扫描器指向您获授权扫描的任何测试目标,例如本地的 OWASP Juice Shop 容器。) ## 如何降低误报 每个模块在报告前都会进行确认,并且严重性/置信度反映了证据的强度(`CONFIRMED` > `FIRM` > `TENTATIVE`): - **XSS** — 仅仅存在反射是不够的。该模块会注入一个唯一的标记,对反射的*上下文*进行分类(HTML body / 属性 / `