Samagna-Pandiri/Web-vulnerability-scanner

GitHub: Samagna-Pandiri/Web-vulnerability-scanner

一个基于 Python 的轻量级 Web 漏洞扫描器,附带刻意设计漏洞的 Flask 靶场,帮助学习者和安全测试人员检测并理解常见的 OWASP Top 10 漏洞。

Stars: 0 | Forks: 0

# WebVulnScanner 一个基于 Python 的 Web 应用程序漏洞扫描器,用于检测常见的 OWASP Top 10 漏洞。专为教育目的和授权安全测试而构建。 ## 它能检测什么 | 漏洞 | 严重程度 | OWASP 类别 | |---|---|---| | 缺失安全标头 | 中 | A05: Security Misconfiguration | | 跨站脚本攻击 (XSS) | 高 | A03: Injection | | SQL 注入 | 严重 | A03: Injection | | 开放重定向 | 中 | A01: Broken Access Control | | 目录遍历 | 高 | A01: Broken Access Control | | 敏感文件暴露 | 高/低 | A05: Security Misconfiguration | ## 项目结构 ``` web-vuln-scanner/ ├── scanner/ │ └── scanner.py # Main scanner tool ├── target_app/ │ └── app.py # Deliberately vulnerable Flask app (test target) ├── reports/ # JSON scan reports saved here ├── requirements.txt └── README.md ``` ## 设置 ``` # 1. Clone 或下载项目 cd web-vuln-scanner # 2. 创建 virtual environment(良好习惯) python3 -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate # 3. 安装依赖 pip install -r requirements.txt ``` ## 如何测试(循序渐进) ### 第 1 步 — 启动存在漏洞的目标应用程序 打开终端并运行: ``` cd target_app python app.py ``` 你应该会看到: ``` VulnBank test app running → http://localhost:5000 ``` 在浏览器中访问 `http://localhost:5000` 查看目标应用程序。随便看看——它包含一个登录表单、一个搜索框、一个文件查看器等等。 ### 第 2 步 — 对其运行扫描器 打开**第二个**终端: ``` cd web-vuln-scanner # 运行所有检查 python scanner/scanner.py http://localhost:5000 # 或者仅运行特定检查 python scanner/scanner.py http://localhost:5000 --checks xss sqli # 选择报告的保存位置 python scanner/scanner.py http://localhost:5000 --output reports/my_scan.json ``` ### 第 3 步 — 查看输出 扫描器会在终端打印带有颜色编码的结果,并保存一份完整的 JSON 报告。你会看到类似以下的发现: ``` [Critical] SQL Injection └─ Field 'username' triggers SQL error with payload URL : http://localhost:5000/search Payload: ' OR 1=1-- [High] Cross-Site Scripting (XSS) └─ Field 'name' reflects payload unescaped URL : http://localhost:5000/feedback [Medium] Missing Security Header └─ Content-Security-Policy not present ``` ### 第 4 步 — 手动验证发现结果 **SQL 注入 —— 在浏览器中亲自尝试:** 1. 访问 `http://localhost:5000/search` 2. 输入 `' OR '1'='1` 作为用户名 3. 点击 Search —— 你会看到返回了所有用户,从而绕过了查询 **XSS —— 亲自尝试:** 1. 访问 `http://localhost:5000/feedback` 2. 输入 `` 作为你的名字 3. 提交 —— 脚本将在浏览器中执行 这个手动验证步骤很重要——它证明了扫描器没有给出误报。 ## 可用标志 ``` python scanner/scanner.py [target_url] [options] positional arguments: url Target URL (e.g. http://localhost:5000) optional arguments: --checks Checks to run: headers xss sqli redirect traversal files all --output Path to save JSON report (default: reports/scan_report.json) --delay Delay between requests in seconds (default: 0.3) ``` ## 示例命令 ``` # Full scan 并将报告保存到自定义路径 python scanner/scanner.py http://localhost:5000 --output reports/vulnbank_$(date +%Y%m%d).json # Headers-only scan(速度快,适合快速检查) python scanner/scanner.py http://localhost:5000 --checks headers # 带有 1s 延迟的 Slow scan(对服务器更友好) python scanner/scanner.py http://localhost:5000 --delay 1.0 # 仅运行 injection 测试 python scanner/scanner.py http://localhost:5000 --checks xss sqli ``` ## 扫描器工作原理(技术概述) ### XSS 检测 1. 获取目标页面并使用 BeautifulSoup 解析所有 HTML 表单 2. 对于每个文本/textarea 输入字段,使用已知的 XSS payload 提交表单 3. 检查 payload 是否以未转义的形式出现在 HTTP 响应体中 4. 如果是 → 确认存在反射型 XSS ### SQL 注入检测 1. 遍历表单输入并提交 SQL 元字符(`'`、`OR 1=1` 等) 2. 检查响应中是否包含已知的数据库错误字符串(MySQL、SQLite、PostgreSQL、MSSQL) 3. 基于错误的检测非常可靠,因为大多数配置不当的应用程序都会泄露数据库错误 ### 安全标头 1. 向目标发送一个 GET 请求 2. 对照推荐的安全标头列表检查 `response.headers` 3. 报告任何缺失的标头并解释其重要性 ### 开放重定向检测 1. 在 URL 后附加常见的重定向参数(`?redirect=`、`?next=`、`?url=`) 2. 将其值设置为攻击者控制的域 3. 检查服务器是否以 3xx 状态码响应,并且 `Location` 标头指向外部 ### 目录遍历 1. 在 URL 后附加常见的文件参数名(`?file=`、`?path=`、`?page=`) 2. 使用类似 `../../../../etc/passwd` 的遍历序列 3. 检查响应体是否包含已知的文件内容签名(`root:x:0:0`) ## 理解 JSON 报告 ``` { "scan_target": "http://localhost:5000", "scan_date": "2025-03-14T10:30:00", "total_findings": 8, "severity_summary": { "Critical": 1, "High": 3, "Medium": 3, "Low": 1 }, "findings": [ { "type": "SQL Injection", "severity": "Critical", "detail": "Field 'username' triggers SQL error with payload", "payload": "' OR 1=1--", "url": "http://localhost:5000/search" } ] } ``` 报告按严重程度排序。你可以在任何文本编辑器中打开 JSON 文件,或使用另一个脚本对其进行解析以供进一步分析。 ## 扩展项目(为你的简历加分的建议) 一旦你熟悉了该项目,这些添加项会使你的项目令人印象深刻得多: - **HTML 报告输出** —— 将发现结果渲染为样式化的 HTML 页面,而不仅仅是 JSON - **爬虫** —— 自动发现目标上的所有页面,而不仅仅是主页 - **CSRF 检测** —— 检查表单是否缺少 CSRF token - **速率限制** —— 检测服务器是否以 429 状态码响应快速请求 - **Cookie 标志** —— 检查会话 cookie 是否缺少 `HttpOnly` 和 `Secure` 标志 - **API 扫描** —— 将 payload 扩展到 JSON body 参数,用于 REST API 测试 - **CI/CD 集成** —— 添加一个 GitHub Actions 工作流,在每次推送时运行扫描器 ## 在面试中谈论此项目 **“你的扫描器能做什么?”** **“你的 XSS 检测是如何工作的?”** **“它有什么局限性?”** **“你为什么还要构建一个存在漏洞的目标应用程序?”** ## 漏洞解释(供你参考) **SQL 注入** —— 攻击者提供的输入被直接嵌入到 SQL 查询中。`' OR '1'='1` 绕过了 WHERE 子句,因为它始终评估为真。 **XSS(反射型)** —— 用户输入未经 HTML 编码就直接渲染回页面中。如果在反映你的查询的搜索框中输入 ``,它将在受害者的浏览器中执行。 **开放重定向** —— `?redirect=https://evil.com` 参数在没有验证的情况下被跟随。用于网络钓鱼——该 URL 看起来像一个受信任的域,但却将用户发送到其他地方。 **目录遍历** —— `?file=../../../../etc/passwd` 向上导航目录树,以读取 Web 根目录之外的文件。可通过 `os.path.basename()` 或白名单来修复。 **缺失安全标头** —— 像 `Content-Security-Policy` 和 `X-Frame-Options` 这样的 HTTP 标头告诉浏览器该如何表现。缺失它们会导致 XSS 和点击劫持缓解措施被禁用。 **敏感文件暴露** —— 公开可访问的 `.env` 文件、`.git/config` 和 debug 端点会暴露凭据、API 密钥和内部架构。
标签:CISA项目, DOE合作, Flask, JSON报告生成, meg, OWASP Top 10, Python3, Python安全工具, Splunk, SQL注入检测, Web安全, Web漏洞扫描器, XSS检测, 信息安全, 反取证, 安全头缺失检测, 安全教育, 安全评估, 开放重定向检测, 敏感文件暴露检测, 目录遍历检测, 网络安全, 网络安全扫描, 自动化扫描工具, 蓝队分析, 跨站脚本攻击, 逆向工具, 隐私保护