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 应用漏洞扫描器。** ![Python](https://img.shields.io/badge/Python-3.8%2B-3776AB?logo=python&logoColor=white) ![License](https://img.shields.io/badge/License-MIT-green) ![OWASP](https://img.shields.io/badge/OWASP-Top%2010-orange) ![Docker](https://img.shields.io/badge/Docker-Supported-2496ED?logo=docker&logoColor=white) 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跨站脚本攻击, 安全评分, 网站安全检测, 网络安全工具, 蓝队分析, 请求拦截, 身份验证缺陷