johnathanduque12/Web-Application-Vulnerability-Scanner
GitHub: johnathanduque12/Web-Application-Vulnerability-Scanner
一个面向学习OWASP Top 10的Python Web漏洞扫描器,覆盖SQL注入、XSS、目录扫描、认证缺陷等常见安全问题,支持ZAP集成并生成带安全评分的HTML报告。
Stars: 0 | Forks: 0
# WebVulnScan
**一款为学习 OWASP Top 10 而构建的初学者至中级 Web 应用漏洞扫描器。**




WebVulnScan 会对目标网站进行爬取,如果提供了凭据则进行身份验证,并使用安全、非破坏性的 payload 测试常见的安全配置错误和注入漏洞。它会生成结构化的 JSON 和样式化的 HTML 报告,其中包含基于百分比的安全评分、严重程度评级、OWASP 分类和修复指导。
## 目录
- [功能特性](#features)
- [OWASP Top 10 覆盖范围](#owasp-top-10-coverage)
- [快速开始](#quick-start)
- [使用方法](#usage)
- [认证扫描](#authentication-scanning)
- [Docker 设置](#docker-setup)
- [项目结构](#project-structure)
- [工作原理](#how-it-works)
- [报告示例](#sample-report)
- [工具对比](#tool-comparison)
- [扩展扫描器](#extending-the-scanner)
- [学习成果](#learning-outcomes)
## 功能特性
| 模块 | 描述 |
|--------|-------------|
| **URL Crawler** | 具有表单提取、参数发现和速率限制的多线程 BFS 爬虫 |
| **Header Analyzer** | 检测缺失的安全头(CSP, HSTS, X-Frame-Options)、服务器版本泄露、过时软件、不安全的 Cookie 和 CORS 配置错误 |
| **Directory Scanner** | 探测 60 多个常见路径,查找开放的目录列表、暴露的配置文件(`.env`, `.git`)、管理面板、备份和调试端点 |
| **SQLi Scanner** | 使用安全的 payload 测试 URL 参数和表单输入,检测基于错误和基于布尔的盲注 SQL injection |
| **XSS Scanner** | 注入金丝雀 payload 以检测跨多种上下文(HTML 正文、属性、内联 JS 和 SVG 处理程序)的反射型 XSS |
| **Tech Fingerprinter** | 根据 HTTP 头、Cookie 和 HTML 签名识别 Web 服务器、框架、CMS 平台、JS 库和分析工具 |
| **Auth Scanner** | 通过表单登录、Cookie 或 HTTP 头进行认证。检测会话固定、弱令牌、越权访问和认证绕过 |
| **ZAP Integration** | 连接到 OWASP ZAP REST API 进行自动化爬虫爬取、主动扫描和警报检索 |
| **Report Generator** | 输出 JSON 和样式化的 HTML 报告,包含基于百分比的安全评分、严重程度评级、OWASP 类别和修复建议 |
## OWASP Top 10 覆盖范围
| OWASP 类别 | 检测内容 |
|----------------|-----------------|
| **A01 -- Broken Access Control** | 开放目录、暴露的管理面板、敏感文件、受保护页面上的认证绕过、缺失的访问控制 |
| **A02 -- Cryptographic Failures** | 缺失 HSTS、Cookie 没有 `Secure` 标志 |
| **A03 -- Injection** | SQL injection(基于错误 + 布尔盲注)、反射型 XSS、服务端模板注入(SSTI) |
| **A05 -- Security Misconfiguration** | 缺失安全头、服务器版本泄露、通配符 CORS、已启用目录列表 |
| **A06 -- Vulnerable Components** | 针对已知 CVE 检测过时的 Apache、Nginx、IIS 和 OpenSSL 版本 |
| **A07 -- Auth Failures** | 会话固定、弱/低熵会话令牌、认证与未认证用户之间的越权访问 |
## 快速开始
### 前置条件
- Python 3.8+
- pip
### 安装
```
git clone https://github.com/yourusername/webvulnscan.git
cd webvulnscan
pip install -r requirements.txt
```
### 针对内置测试应用运行
该项目包含一个包含故意漏洞的 Flask 应用程序,用于安全测试。
```
# 为测试应用安装 Flask
pip install flask
# 终端 1 -- 启动易受攻击的测试应用
python test_app/test_app.py
# 终端 2 -- 运行扫描器
python scanner.py http://localhost:5000 --depth 2 --threads 5
```
在 `./reports/` 中打开生成的 HTML 报告以查看结果。
## 使用方法
```
python scanner.py [OPTIONS]
```
### 选项
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `-d`, `--depth` | `2` | 最大爬取深度 |
| `-p`, `--max-pages` | `50` | 最大爬取页面数 |
| `-t`, `--threads` | `5` | 并发线程数 |
| `-r`, `--rate-limit` | `10` | 每秒最大请求数 |
| `-o`, `--output` | `reports` | 报告输出目录 |
| `--zap` | off | 启用 OWASP ZAP 集成 |
| `--zap-api-key` | `""` | ZAP API 密钥 |
| `--zap-proxy` | `http://127.0.0.1:8080` | ZAP 代理地址 |
### 示例
```
# 基础扫描
python scanner.py https://example.com
# 具有高并发性的深度扫描
python scanner.py https://example.com -d 3 -p 100 -t 10
# 温和扫描(用于较慢或有速率限制的目标)
python scanner.py https://example.com -r 2 -t 2
# 结合 OWASP ZAP 集成进行扫描
python scanner.py https://example.com --zap --zap-api-key mykey
# 输出到自定义目录
python scanner.py https://example.com -o ./my-reports
```
## 认证扫描
扫描器可以在扫描前登录,以便测试登录墙后的页面并检测与认证相关的漏洞。
### 认证选项
| 标志 | 描述 |
|------|-------------|
| `--auth-method` | 认证方式:`form`(默认)、`basic` 或 `bearer` |
| `--auth-user` | 认证用户名 |
| `--auth-pass` | 密码(或 bearer auth 的令牌) |
| `--auth-login-url` | 登录页面 URL(如果未设置则自动检测) |
| `--auth-user-field` | 用户名表单字段名称(如果未设置则自动检测) |
| `--auth-pass-field` | 密码表单字段名称(如果未设置则自动检测) |
| `--auth-cookie` | 作为 `name=value` 对的认证 Cookie |
### 示例
```
# 基于表单的登录(自动检测登录页面和字段名称)
python scanner.py http://localhost:5000 --auth-user admin --auth-pass password123
# 具有显式 URL 和字段的表单登录
python scanner.py http://localhost:5000 \
--auth-user admin --auth-pass password123 \
--auth-login-url /login \
--auth-user-field username \
--auth-pass-field password
# 基于 Cookie 的认证(粘贴来自浏览器的 session tokens)
python scanner.py http://localhost:5000 --auth-cookie session_id=abc123 csrf_token=xyz789
# HTTP Basic 认证
python scanner.py http://localhost:5000 --auth-method basic --auth-user admin --auth-pass secret
# Bearer token 认证
python scanner.py http://localhost:5000 --auth-method bearer --auth-pass eyJhbGciOiJIUzI1NiJ9...
```
### 认证扫描检测什么
当提供凭据时,扫描器会:
1. **登录** 并在所有扫描模块(爬虫、SQLi、XSS)之间共享已认证的会话
2. **爬取登录墙后的页面**,这些是未认证扫描会遗漏的
3. **检查会话固定** —— 登录后会话 Cookie 是否重新生成
4. **分析会话令牌质量** —— 标记短令牌或低熵值
5. **测试越权访问** —— 比较已认证与未认证的响应
6. **检测认证绕过** —— 检查受保护外观的 URL(`/admin`, `/settings`, `/dashboard`)是否可以在未登录的情况下访问
### 测试一下
内置测试应用具有有效凭据 `admin` / `password123` 和故意存在漏洞的路由:
```
# 终端 1
python test_app/test_app.py
# 终端 2 -- 未认证(发现 22 个问题)
python scanner.py http://localhost:5000 --depth 2
# 终端 2 -- 已认证(发现 25 个问题,包括 auth bypass)
python scanner.py http://localhost:5000 --depth 2 --auth-user admin --auth-pass password123
```
## Docker 设置
### 仅扫描器
```
docker build -t webvulnscan .
docker run --rm -v $(pwd)/reports:/app/reports \
webvulnscan http://host.docker.internal:5000 --depth 2
```
### 完整堆栈(扫描器 + OWASP ZAP + DVWA)
包含的 `docker-compose.yml` 将扫描器与 OWASP ZAP 和 [DVWA](https://github.com/digininja/DVWA)(Damn Vulnerable Web Application)一起设置,以构建完整的测试环境。
```
# 启动 ZAP 和 DVWA
docker compose up -d zap dvwa
# 等待约 30 秒以便 ZAP 健康检查,然后扫描 DVWA
docker compose run scanner http://dvwa \
--zap \
--zap-proxy http://zap:8080 \
--zap-api-key vuln-scanner-key \
--depth 2
# 在浏览器中访问 http://localhost:8888 查看 DVWA
# 默认登录:admin / password
# 卸载
docker compose down
```
### 其他练习目标
这些故意存在漏洞的应用程序可以使用 Docker 在本地运行:
| 应用 | 命令 | 扫描 URL |
|-----|---------|----------|
| **DVWA** | 包含在 `docker-compose.yml` 中 | `http://localhost:8888` |
| **OWASP Juice Shop** | `docker run -p 3000:3000 bkimminich/juice-shop` | `http://localhost:3000` |
| **WebGoat** | `docker run -p 8080:8080 webgoat/webgoat` | `http://localhost:8080/WebGoat` |
## 项目结构
```
webvulnscan/
├── scanner.py # Main entry point and scan orchestrator
├── modules/
│ ├── crawler.py # BFS web crawler with ThreadPoolExecutor
│ ├── header_analyzer.py # Security header and server version checks
│ ├── directory_scanner.py # Open directory and sensitive file probing
│ ├── sqli_scanner.py # SQL injection detection (safe payloads)
│ ├── xss_scanner.py # Reflected XSS detection (canary-based)
│ ├── tech_fingerprint.py # Technology identification from signatures
│ ├── auth_scanner.py # Authentication and access control scanning
│ ├── zap_integration.py # OWASP ZAP REST API client
│ └── report_generator.py # JSON and HTML report output
├── test_app/
│ └── test_app.py # Intentionally vulnerable Flask app
├── reports/ # Generated scan reports
├── requirements.txt
├── Dockerfile
└── docker-compose.yml # Full stack: scanner + ZAP + DVWA
```
## 工作原理
扫描器运行一个 7 步流水线,包含可选的认证和 ZAP 步骤:
```
0. AUTH (opt.) -> Log in via form, cookie, or HTTP header
1. CRAWL -> BFS discovery of URLs, forms, and query parameters
2. FINGERPRINT -> Identify technologies from headers, cookies, and HTML
3. HEADERS -> Audit security headers, server versions, and cookies
4. DIRECTORIES -> Probe 60+ common paths for exposed resources
5. SQLi -> Test each parameter with error-based and boolean payloads
6. XSS -> Test each parameter with context-aware canary payloads
7. AUTH SCAN -> Check session fixation, token quality, access control, auth bypass
8. ZAP (opt.) -> Spider + active scan via the ZAP REST API
9. REPORT -> Generate JSON + HTML reports with security score
```
### 安全 Payload
所有注入 payload 均设计为非破坏性的:
- **SQLi payload** 触发可检测的数据库错误或布尔响应差异,而不修改数据。示例:`' OR '1'='1`, `1' ORDER BY 1--`
- **XSS payload** 使用唯一的金丝雀字符串(例如 `XSS_CANARY_7291`),可以在响应中检测到而无需执行有害代码
- **SSTI 探针** 使用算术(`{{7*7191}}`)通过检查响应中的计算结果(`50337`)来检测模板求值
## 报告示例
针对内置测试应用运行认证扫描:
```
[0/7] Authenticating...
Login URL: http://localhost:5000/login
Fields detected: username='username', password='password'
[+] Login successful!
[*] Scanning as authenticated user
[1/7] Crawling target for URLs and forms...
Found 12 URLs, 5 forms, 2 parameterized URLs
[2/7] Fingerprinting technologies...
Detected: Apache 2.4.29
Detected: PHP 7.2.10
[3/7] Analyzing server headers...
Found 10 header-related issues
[4/7] Scanning for open directories...
Found 4 open directories/files
[5/7] Testing for SQL injection points...
Found 2 potential SQLi points
[6/7] Testing for reflected XSS...
Found 5 potential XSS reflections
[7/7] Scanning for authentication issues...
Found 4 authentication issues
=======================================================
SCAN SUMMARY
=======================================================
Total findings: 25
CRITICAL 3
HIGH 8
MEDIUM 8
LOW 6
=======================================================
```
### 安全评分
HTML 报告包含基于百分比的安全评分:
| 分数 | 含义 |
|-------|---------|
| 100% | 未发现问题 |
| 75%+ | 仅轻微问题 |
| 50-74% | 中等风险,一些重要发现 |
| 25-49% | 高风险,多个严重漏洞 |
| 0-24% | 严重风险,需要立即关注 |
评分采用边际递减原则,因此每个严重程度的首次发现影响最大,后续发现的影响逐渐减小。
### HTML 报告内容
- 带有颜色编码百分比的**安全评分**
- 按严重程度级别统计发现数量的**摘要卡片**
- 检测到的服务器软件、框架和库的**技术列表**
- 按类别分组显示发现的 **OWASP 分布图**
- **详细发现**,每个都包含严重程度徽章、描述、证据、修复建议和 OWASP 映射
- 所有已发现页面的**已爬取 URL 列表**
## 工具对比
| 特性 | WebVulnScan | Burp Suite | OWASP ZAP |
|---------|-------------|------------|-----------|
| 开源 | 是 | 否 | 是 |
| 自定义 payload | 易于修改 | 是 | 是 |
| GUI | HTML 报告 | 完整 GUI | 完整 GUI |
| 主动扫描 | 基础 | 高级 | 高级 |
| 认证 | 表单、Cookie、头 | 完全支持 | 完全支持 |
| 可扩展性 | Python 模块 | BApp Store | 插件 |
| 学习价值 | 高 | 中 | 中 |
使用 **Burp Suite Community Edition** 配合此扫描器进行手动测试。使用 **ZAP 集成**(`--zap` 标志)来自动化对比发现结果。
## 扩展扫描器
### 添加自定义目录路径
```
from modules.directory_scanner import DirectoryScanner
scanner = DirectoryScanner(
target,
extra_paths=["/api/internal", "/debug/vars", "/.dockerenv"]
)
```
### 添加自定义 SQLi Payload
```
# 追加到 SQLiScanner.ERROR_BASED_PAYLOADS:
("' UNION SELECT NULL,NULL,NULL--", "UNION column enumeration")
```
### 添加新的检测模块
在 `modules/` 中按照此模式创建一个新文件:
```
class MyScanner:
def __init__(self, rate_limit=10.0):
# setup
pass
def scan(self, crawl_data):
findings = []
# your detection logic
findings.append({
"type": "my_finding",
"severity": "medium", # critical, high, medium, low, info
"title": "Description",
"url": "http://...",
"detail": "What was found",
"remediation": "How to fix it",
"owasp_category": "A01:2021 - Broken Access Control",
})
return findings
```
然后将其连接到 `scanner.py` 中的 `run_scan()` 函数。
## 学习成果
构建和使用此项目可以学到:
| 主题 | 你将学到什么 |
|-------|-------------------|
| **Web 漏洞** | SQL injection、XSS 和配置错误在 HTTP 层面是如何工作的 |
| **输入验证** | 为什么参数化查询和输出编码是必不可少的防御手段 |
| **HTTP 安全** | CSP、HSTS、X-Frame-Options 等头以及 Cookie 标志的作用 |
| **认证** | 会话管理、令牌安全和访问控制模式 |
| **OWASP Top 10** | 将实际发现映射到行业标准的漏洞分类法 |
| **负责任的披露** | 如何以道德的方式报告发现,并提供适当的证据和修复建议 |
| **报告撰写** | 为技术和非技术受众构建漏洞报告结构 |
| **工具集成** | 通过编程方式使用 OWASP ZAP 的 REST API |
| **并发编程** | Python 中的线程池、速率限制和安全共享状态 |
为学习而构建。请负责任地使用。
由 Johnathan Duque 创建
标签:CISA项目, DNS枚举, Docker容器化, DOE合作, HTML报告生成, OWASP Top 10, OWASP ZAP集成, Python安全开发, SQL注入检测, Web安全, Web漏洞扫描器, XSS跨站脚本攻击, 安全评分, 网站安全检测, 网络安全工具, 蓝队分析, 请求拦截, 身份验证缺陷