AkarshRaj150/Web-Vulnerability-Scanner

GitHub: AkarshRaj150/Web-Vulnerability-Scanner

一个轻量级的 Python Web 漏洞扫描器,通过爬取网站并注入 payload 来检测 SQL 注入、XSS 和缺失的安全标头,并生成带修复建议的报告。

Stars: 0 | Forks: 0

# 基础 Web 漏洞扫描器 这是一个轻量级的教育性 Web 漏洞扫描器,使用 Python 编写。它会爬取网站,然后测试它找到的每个页面/表单/参数, 检测是否存在 **SQL 注入**、**跨站脚本攻击 (XSS)** 以及 **缺失的安全标头**,并生成带有 严重性评级和修复建议的 HTML 或 JSON 报告。 ## 第 1 部分 — 这是什么! 把这个工具想象成一个机器人,它会: 1. **遍历网站**,就像一个人点击每个链接一样(即“爬虫”)。 2. 在每个页面上,它会**注意到任何表单**(登录框、搜索框、 评论框)以及 **URL 中的任何参数**(例如 `?id=5`)。 3. 然后,它会使用精心构造的文本(即“payload”)去**探测这些输入项中的每一个**, 这些文本已知会破坏存在漏洞的应用程序 —— 例如,发送 一个单引号 `'` 来看看它是否会破坏数据库查询,或者发送 `` 来看看网站是否会将其作为 实际代码而不是无害文本显示出来。 4. 它**监视网站的反应** —— 它是否显示了数据库 错误?恶意脚本是否未经转义就出现在页面中? 它的响应是否比平时慢(暗示执行了延时的数据库 命令)? 5. 最后,它**将其发现的所有内容写入报告**中供你 阅读,并按每个问题的严重程度进行排名,同时提供有关如何修复的建议。 ## 第 2 部分 — 安装所需内容 ### 第 1 步:安装 Python 你需要 Python 3.8 或更高版本。 - **Windows**:访问 https://www.python.org/downloads/,下载 安装程序并运行,确保在安装过程中勾选 **“Add Python to PATH”**。 - **Mac**:Python 通常是预装的。打开“Terminal”应用 并输入 `python3 --version`。如果缺失,请从 https://www.python.org/downloads/ 安装,或者如果你有 Homebrew,请运行 `brew install python3`。 - **Linux**:几乎总是预装的。在终端中使用 `python3 --version` 检查。如果缺失:`sudo apt install python3 python3-pip`。 打开终端(Windows 上的 Command Prompt/PowerShell, Mac/Linux 上的 Terminal)并输入以下命令来验证它是否有效: ``` python3 --version ``` 你应该会看到类似 `Python 3.12.3` 的输出。 ### 第 2 步:创建项目文件夹 ``` mkdir webvulnscanner cd webvulnscanner ``` 这将创建一个名为 `webvulnscanner` 的文件夹,并将你的终端移动 “进去”,以便你接下来创建的每个文件都能存放在正确的位置。 ### 第 3 步:获取项目文件 将该项目中的所有文件(如下面第 3 部分所列)复制到你的 `webvulnscanner` 文件夹中,并保持相同的文件夹结构 — 尤其是 `payloads/` 子文件夹。 ### 第 4 步:安装两个必需的库 此项目依赖于两个外部 Python 包: - **requests** — 允许 Python 发出 HTTP 请求(以编程方式访问网页) - **beautifulsoup4** — 允许 Python 解析 HTML 并提取链接/表单 使用以下命令安装它们: ``` pip3 install -r requirements.txt ``` (如果无法识别 `pip3`,请尝试 `pip install -r requirements.txt` 或 `python3 -m pip install -r requirements.txt`。) 你应该会看到它开始下载并以“Successfully installed ...”结束。 ## 第 3 部分 — 项目结构 ``` webvulnscanner/ ├── main.py # The script you actually run ├── config.py # All settings in one place ├── crawler.py # Discovers pages, forms, and parameters ├── sqli_scanner.py # SQL Injection detection logic ├── xss_scanner.py # XSS detection logic ├── header_checker.py # Security header checks ├── report_generator.py # Builds the HTML/JSON report ├── requirements.txt # List of required Python packages ├── test_vuln_app.py # A tiny fake vulnerable site, for safe practice └── payloads/ ├── sqli_payloads.json # SQLi test strings (editable!) └── xss_payloads.json # XSS test strings (editable!) ``` **为什么需要这么多文件而不是一个大文件?** 这被称为 “关注点分离” —— 每个文件只负责一项工作。这使得代码 更易于阅读、修复和扩展(例如,以后你可以添加一个新的 `command_injection_scanner.py`,而无需改动其他任何内容)。 ## 第 4 部分 — 各个部分的工作原理 ### `config.py` — 设置文件 包含一些配置,例如:最多爬取多少页面、请求之间 暂停多长时间(以免对服务器造成过大压力),以及我们检查哪些安全 标头。如果你想改变扫描器行为,这通常是 首选的查看之处。 ### `crawler.py` — 探索器 - 从你的目标 URL 开始。 - 首先读取 `robots.txt`(网站发布的一个文件,用于说明自动 化工具不应触碰哪些页面)并遵守它 —— 这是 “通过遵守 robots.txt 进行安全爬取”的交付成果。 - 下载每个页面的 HTML,使用 BeautifulSoup 查找: - 每个 `` 链接(以继续爬取) - 每个 `
` 及其 `` 字段(以了解要测试什么) - URL 中已存在的任何 `?key=value` 参数 - 在达到可配置的最大页面数后停止,因此它不会永远运行。 ### `sqli_scanner.py` — SQL 注入测试器 对于发现的每个参数/字段,它会尝试两种技术: 1. **基于错误**:发送类似 `' OR '1'='1` 的 payload 并检查 响应是否包含数据库错误消息(例如“you have an error in your SQL syntax”)。如果应用程序泄露了该错误,则它是 易受攻击的,并且存在暴露内部错误的不良做法。 2. **基于时间的盲注**:发送类似 `' OR SLEEP(5)-- ` 的 payload 并 计算响应时间。如果它突然比正常情况慢了约 5 秒, 数据库很可能执行了我们注入的命令,即使 页面上没有任何可见的变化 —— 这能捕获“盲” SQLi,即没有可见错误或输出差异的情况。 ### `xss_scanner.py` — 跨站脚本攻击测试器 - **反射型 XSS**:发送带有唯一随机标记的 payload(这样 我们可以 100% 确定任何匹配都来自于我们,而不是页面上 已有的内容),并检查它是否未经转义地出现在相同 响应中(这意味着浏览器实际上会执行它)。 - **存储型 XSS**:通过表单(例如评论框)提交 payload, 然后重新访问该页面,看看 payload 是否稍后会出现 — 这意味着它被保存在服务器上,并且会攻击任何 访问该页面的人,而不仅仅是你。 ### `header_checker.py` — 配置检查器 获取页面并检查 HTTP 响应标头是否包含: - `X-Frame-Options` — 阻止你的网站被嵌入恶意 iframe 中 - `Content-Security-Policy` — 限制可以运行的脚本/资源 - `Strict-Transport-Security` — 强制使用 HTTPS - `X-XSS-Protection` — 旧版浏览器 XSS 过滤器标志 - `X-Content-Type-Options` — 阻止 MIME 类型猜测攻击 - 还会检查 cookie 是否缺少 `Secure`/`HttpOnly` 标志 ### `report_generator.py` — 报告生成器 获取发现列表(每个都是一个包含类型、严重性、 URL、payload、证据和修复方法的字典),然后: - 写入一个干净、样式化的 **HTML** 文件,你可以在任何浏览器中打开它;或者 - 写入一个结构化的 **JSON** 文件,用于馈送到其他工具中。 发现结果按严重性排序(Critical → High → Medium → Low → Info)。 ### `main.py` — 将一切联系在一起 这是你运行的文件。它解析你的命令行选项,运行 爬虫,然后遍历每个发现的参数/表单 字段,并运行 SQLi + XSS 扫描器 + 标头检查,最后写入报告。 ### `payloads/*.json` — 可配置的 payload 列表 这是“可配置 payload 列表”的交付成果:与其 将测试字符串硬编码在 Python 代码中,不如将它们放在可编辑的 JSON 文件中。想要添加你自己的 SQLi payload 吗?只需打开 `payloads/sqli_payloads.json` 并在列表中添加一个新字符串 — 无需编写代码。 ## 第 5 部分 — 安全地运行扫描器(先进行练习!) 由于你绝不应该将此工具指向随机的真实网站,因此该 项目包含了 `test_vuln_app.py` —— 这是一个小型的、故意设计成存在漏洞的 虚假网站,你可以在自己的计算机上运行它以进行安全练习。 ### 第 1 步:启动练习目标 在你的项目文件夹中打开一个终端并运行: ``` python3 test_vuln_app.py ``` 你应该会看到: ``` * Running on http://127.0.0.1:5055 ``` 保持此终端窗口打开并运行 —— 它现在充当你自己机器上的一个 微型虚假网站,你计算机外部的人无法 访问它。 ### 第 2 步:对其运行扫描器 打开**第二个**终端窗口(也在项目文件夹内)并运行: ``` python3 main.py --url http://127.0.0.1:5055 --output report.html ``` 系统会要求你确认是否已获得扫描目标的许可 — 输入 `yes`(这是你自己的本地练习应用,所以没问题)。 你将在终端中看到实时进度,如下所示: ``` [+] Crawled (1/50): http://127.0.0.1:5055 [0 form(s), 0 GET param(s)] [+] Crawled (2/50): http://127.0.0.1:5055/search?q=hello [1 GET param(s)] [SQLi] Testing GET param 'q' on ... [XSS] Testing GET param 'q' on ... [*] Scan complete. 17 finding(s) detected. [*] Report saved to: report.html ``` ### 第 3 步:查看报告 在任何 Web 浏览器中打开 `report.html`(双击该文件,或将其 拖入浏览器窗口)。你将看到按 严重性分类的发现摘要,并且对于每一个发现:确切的 URL、参数、使用的 payload、 证据以及如何修复它。 ## 第 6 部分 — 命令行选项参考 | 选项 | 作用 | 默认值 | |---|---|---| | `--url` | 要扫描的目标基础 URL (**必需**) | — | | `--output` | 报告文件名;`.html` 或 `.json` | `report.html` | | `--max-pages` | 爬取超过这么多页面后停止 | `50` | | `--delay` | 请求之间暂停的秒数(请保持礼貌!) | `0.5` | | `--ignore-robots` | 忽略 robots.txt 规则(仅在你拥有的网站上使用) | off | | `--yes-i-have-permission` | 跳过交互式 yes/no 提示 | off | 示例 —— 生成 JSON 报告: ``` python3 main.py --url http://127.0.0.1:5055 --output report.json ``` ## 第 7 部分 — 自定义 payload 在任何文本编辑器中打开 `payloads/sqli_payloads.json` 或 `payloads/xss_payloads.json`。它们只是按类别分组的字符串列表。 要添加新的 SQLi payload,请在 `"error_based"` 列表中添加一个新条目: ``` "error_based": [ "'", "' OR '1'='1", "' OR SLEEP(0) AND '1'='1" ] ``` 保存文件 —— 无需更改代码,`main.py` 每次运行时都会重新 读取此文件。 ## 第 8 部分 — 理解报告中的发现 每个发现都会显示: - **类型** — 问题的种类(例如“SQL Injection (Error-based)”) - **严重性** — Critical / High / Medium / Low / Info - **URL** — 具体受影响的页面 - **参数** — 触发它的输入字段/URL 参数 - **方法** — GET 或 POST - **使用的 payload** — 触发该发现的确切测试字符串(以便你可以手动重新验证它) - **证据** — 扫描器将其标记出来的原因(例如它看到的数据库错误文本) - **修复方法** — 关于开发人员将如何修复它的通俗易懂的建议 ## 第 9 部分 — 已知局限性(毕竟它只是一个“基础”扫描器) 对于这个工具**做不到**什么(相比于 Burp Suite、 OWASP ZAP 或 sqlmap 等专业工具),请对自己(以及任何你向其展示此工具的人)保持坦诚: - 没有 JavaScript 渲染 —— 它无法看到由客户端 JS 框架(如在浏览器中构建 DOM 的 React/Vue/Angular 应用)动态创建的内容。 它只能看到初始 HTML 响应中的内容。 - 没有身份验证处理 —— 它无法先登录以测试 登录墙后面的页面,除非你对其进行扩展以实现此目的。 - 针对 SQLi 的基本错误签名匹配 —— 它无法捕获每个 数据库引擎的错误格式,只能捕获 `sqli_payloads.json` 中列出的常见格式。 - 没有基于布尔的盲注 SQLi 比较 —— 如果你想 扩展该项目,这是一个很好的“下一个功能”。 - 单线程 —— 一次只扫描一个请求,这速度较慢,但对目标服务器更加温和(并且作为一个初学者项目更容易推理)。 ## 第 10 部分 — 扩展此项目的想法 一旦你熟悉了基础知识,这里有一些自然的后续步骤: 1. 添加多线程以加快扫描速度(使用 Python 的 `concurrent.futures`)。 2. 添加基于布尔的盲注 SQLi 检测(比较带有 true 与 false 条件 payload 的两个响应)。 3. 添加身份验证支持(在爬取之前使用提供的凭据登录)。 4. 添加更多漏洞类别:开放重定向、CSRF token 检查、目录列表。 5. 添加 `--threads` 选项和基于域名的速率限制。 6. 将发现结果导出为 CSV 以及 HTML/JSON。 祝你好运,并请记住:**仅扫描你获得授权进行扫描的内容。**
标签:CISA项目, Homebrew安装, Python, Web安全, 字符串匹配, 无后门, 蓝队分析, 逆向工具