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** (`