hackops-academy/vuln99

GitHub: hackops-academy/vuln99

Vuln99 是一个集成了 24 种真实漏洞的 Flask 电商练习靶场,支持按漏洞逐个调整难度并与 Glacier 主动扫描器无缝配合,用于安全漏洞的实战化学习与扫描器验证。

Stars: 0 | Forks: 0

Vuln99 — The Live-Fire Range for Glacier, made by HackOps Academy

# Vuln99 — 整合版漏洞练习靶场店面 Vuln99 将 HackOps Academy 先前的两个项目合并为了一个应用: - **Glacier 的 `vulnerable_test_app.py`** — 一个精简的 Flask 测试平台,其检测特征专为匹配 [Glacier 的](https://github.com/hackops-academy/glacier)主动扫描器 (`active/scanner.py`) 而构建: 反射型 XSS、报错型 SQLi、布尔盲注、时间盲注、 路径遍历、命令注入(反射型 + 盲注)以及开放重定向 均使用与 Glacier 的 `check_*` 函数所查找的*完全相同的路由路径、参数名和错误信息格式*。 - **VulnMart** — 一个功能更全面的电商应用(包含用户、购物车、订单、评论、管理面板),带有逐页难度系统(low/medium/hard)。 Vuln99 保留了与 Glacier 扫描器兼容的特征,拥有 VulnMart 真实的店面广度,并将难度系统泛化为**按每个独立漏洞**(共 24 个)进行划分,而不是按页面划分,并且可以在应用内的管理员设置界面中进行实时配置。 **📖 像专业人士一样学习 Vuln99:** 完整课程已在 **[hackops-academy.github.io/vuln99](https://hackops-academy.github.io/vuln99/)** 上线 — 13 个模块将所有 24 个漏洞映射到具体的 Glacier 命令, 外加一套完整的 Glacier × Vuln99 组合方法论。它是 **[Glacier 自身课程](https://hackops-academy.github.io/glacier/)** 的配套内容 — 建议结合起来阅读。 ## ⚠️ 在您安装之前 本应用包含**真实可用的** SQL 注入、OS 命令注入、 XXE、SSRF、SSTI 以及不安全的反序列化漏洞。默认情况下它会绑定到 `127.0.0.1` (localhost),除非您处于完全隔离且无法 路由到互联网或共享/企业网络的实验 VM 中,否则请保持这一设置。在您做出任何更改之前,请参阅下方的 [网络绑定](#network-binding-for-scanners--packet-capture)。 ## 📥 下载与设置 ### 1. 环境要求 - **Python 3.9+** - `pip` 和 `venv`(两者均随标准的 Python 安装一起提供) - macOS、Linux 或 Windows (PowerShell) ### 2. 克隆仓库 ``` git clone https://github.com/hackops-academy/vuln99.git cd vuln99 ``` ### 3. 安装与运行 最快的方式是使用设置脚本 — 它会创建一个 venv,安装 依赖项,并使用一条命令启动应用: ``` ./setup.sh # macOS / Linux ``` ``` .\setup.ps1 # Windows PowerShell ``` 或者,如果您希望查看每一步的操作,也可以手动进行设置: ``` python3 -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate pip install -r requirements.txt python run.py ``` ### 4. 打开应用 在浏览器中访问 **http://127.0.0.1:5099**。 该应用使用 SQLite 数据库,并且**在每次进程启动时都会从头重新播种** — 每次启动都会进入相同的已知干净状态,因此您无需在练习期间 手动重置它。 ### 5. (可选) 验证安装 pytest 冒烟测试套件会启动应用,并访问每个 难度级别的所有路由,以便在您将糟糕的测试目标归咎于扫描器 之前,捕捉到损坏的安装: ``` ./setup.sh --test # macOS/Linux .\setup.ps1 -Test # Windows # 或者,在已激活的 venv 下: pip install -r requirements-dev.txt pytest -q ``` 这**并不能**验证漏洞本身 — 因为漏洞的存在正是 该应用的核心目的 — 它只能验证没有出现 500 错误。 ## 测试账户 | 用户名 | 密码 | 角色 | |--------------|---------------|-------| | admin | admin123 | admin | | john_doe | password123 | user | | alice_smith | password123 | user | | bob_jones | password123 | user | ## 难度级别 每个漏洞都可以通过 **Admin → Difficulty** settings** (`/admin/settings`) 独立设置 — 包括批量“将所有设置为 low/medium/hard” 按钮 — 也可以通过直接编辑 `settings` 表中的行来设置: - **low** — 完全存在漏洞,没有任何缓解措施(Glacier 的扫描器已调整 为可检测这些漏洞)。 - **medium** — 部分缓解措施,这些措施在真实场景中很常见,但仍然可以被绕过(黑名单过滤、简单的转义、将速率限制 误认为是访问控制等) — 非常适合练习绕过 filter/WAF 的技术。这 24 个漏洞中的每一个都有一个*真正* 可被绕过的 medium 级别 — 具体的 payload 请参阅 `VULNERABILITIES.md`。 - **hard** — 经过正确修复的版本(参数化查询、 白名单、真正的基于 session 的身份验证检查、CSP 安全的输出编码)。 要在没有有效登录且 `broken_admin` 设置为 **low** 时访问 管理面板/设置界面,请访问 `/admin/become-admin-demo`(它会设置一个 low 难度检查所信任的可伪造的 `is_admin` cookie)。 ## 漏洞目录 (24 个) 有关下表中每一行的攻击 payload 和分步演练,请参阅 **[`VULNERABILITIES.md`](VULNERABILITIES.md)**。 | Key | 漏洞 | 位置 | |---|---|---| | `login_sqli` | SQL 注入身份验证绕过 | `/login` | | `search_sqli` | 基于 UNION 的 SQL 注入 | `/search` | | `product_sqli` | 报错型 SQL 注入 | `/product` | | `blind_sqli_bool` | 布尔盲注 | `/blind-product` | | `blind_sqli_time` | 时间盲注 | `/slow-product` | | `recommend_sqli` | 基于 Cookie 的 SQL 注入 | `/recommend` | | `header_sqli` | HTTP header SQL 注入 | `/category` (汇聚点: `/admin/logs`) | | `reflected_xss` | 反射型 XSS | `/search` | | `stored_xss` | 存储型 XSS | 产品评论 (`/product`, `/reviews`) | | `csrf` | CSRF | `/checkout` | | `idor_orders` | IDOR | `/orders`, `/account?id=` | | `broken_admin` | 访问控制失效 | `/admin`, `/admin/settings` | | `mass_assignment` | Mass assignment | `/account` (POST) | | `price_tamper` | 业务逻辑 / 客户端信任价格 | `/cart` | | `path_traversal` | 路径遍历 / LFI | `/read-file` | | `file_upload` | 无限制文件上传 | `/account/avatar` | | `command_injection` | OS 命令注入 | `/ping`, `/ping-slow` | | `open_redirect` | 开放重定向 | `/go` | | `ssrf` | Server-Side Request Forgery | `/admin/import-image` | | `xxe` | XML External Entity injection | `/admin/import-orders` | | `insecure_deserialization` | 不安全的反序列化 (pickle) | `/login` 上的 "Remember me" | | `ssti` | Server-Side Template Injection | `/admin/email-preview` | | `weak_crypto` | 弱密码哈希 (无盐 MD5) | `/register` | | `verbose_errors` | 冗长错误 / 信息泄露 | `/product`, `/version` | 每个存在漏洞的路由在适用的地方都有一个对应的 `/safe-*` 平级路由 (如 `/safe-search`、`/safe-product`、`/safe-read-file`、`/safe-ping`、 `/safe-go`),并排展示了受正确保护的实现代码 — 这对于确认扫描器在加固后的 endpoint 上能保持静默非常有用。 ## 管理面板 `/admin` 显示实时统计数据(用户、订单、评论、活动日志 条目,以及每个漏洞当前设置的 low/medium/hard 细分情况),并提供以下快捷链接: - **Difficulty settings** (`/admin/settings`) — 针对每个漏洞的控制 + 批量 全选按钮。 - **Activity logs** (`/admin/logs`) — `header_sqli` 的汇聚点:显示 最近 100 次页面访问,包括原始的 `User-Agent`/`X-Forwarded-For` 值,完全按照写入数据库时的原样呈现。 - 现有的仅限管理员使用的 SSRF/XXE/SSTI 实验工具。 ## 配置 所有运行时配置均由环境变量驱动(参见 `vuln99/config.py`),如果您不进行任何设置, 则使用安全的默认值: | 变量 | 默认值 | 用途 | |---|---|---| | `VULN99_HOST` | `127.0.0.1` | 绑定地址 | | `VULN99_PORT` | `5099` | 绑定端口 | | `VULN99_DEBUG` | 当且仅当主机为 localhost 时开启 | Flask 调试/重载器 | | `VULN99_SECRET_KEY` | 开发默认值 | Flask session 签名密钥 | | `VULN99_LOG_DIR` | `./logs` | 访问/事件日志的写入位置 | | `VULN99_LOG_LEVEL` | `INFO` | 日志详细程度 | ### 用于扫描器 / 数据包捕获的网络绑定 默认情况下,vuln99 仅监听 `127.0.0.1`。如果您在 隔离的实验 VM 或专用实验网络中运行它,并且想要将真实工具 (nmap、Wireshark、Burp,或者在*同一*隔离网络中的*不同* VM 上运行的扫描器) 指向它,请覆盖绑定地址: ``` VULN99_HOST=0.0.0.0 VULN99_PORT=5099 python run.py ``` `run.py` 会在绑定到除 localhost 以外的任何地址时打印警告横幅, 以此提醒您它现在可以从该网络的其他地方被访问。**只有在没有任何路由可连接到 互联网或共享/企业网络的主机上才能执行此操作** — 此应用包含真实可用的漏洞利用,且没有任何额外的沙箱隔离。 由于 vuln99 是一个普通的 HTTP 服务,一旦可被访问,它就不需要任何特殊设置即可被扫描/嗅探 — `nmap -sV -p 5099 ` 会将其识别为普通的 Werkzeug/Flask 开发服务器,并且在该接口上的任何 数据包捕获都会看到明文 HTTP 流量,您可以 将其与 `logs/access.log` 进行关联比对。 ## 日志 每个请求都会被记录到 `logs/access.log` 中(方法、路径、状态、 响应时间、源 IP、user-agent),而管理员操作(难度 更改、批量重置)则会记录到 `logs/events.log` 中 — 两者都会在约 2MB 时进行轮转。 这对于在课程或 CTF 运行期间,将应用接收到的内容与同时进行的 nmap 扫描或 Wireshark 捕获的数据进行比对非常有用。 ## 项目布局 ``` run.py entry point setup.sh / setup.ps1 one-command install + run (+ --test) requirements.txt runtime deps requirements-dev.txt + pytest VULNERABILITIES.md per-vuln attack payload reference tests/ test_smoke.py route/difficulty-tier smoke suite vuln99/ __init__.py app factory, blueprint registration, logging setup config.py env-driven host/port/debug/secret/log config logging_setup.py access + event logging (logs/access.log, logs/events.log) db.py SQLite connection + schema seed.py reseeds users/products/reviews/orders/logs on boot difficulty.py vulnerability catalog (24) + get/set difficulty chrome.py shared page shell (nav/footer/CSS) helpers.py session helpers + IDOR enumeration guard sample_files/ documents for the path-traversal lab routes/ one file per feature area — see repo for full list ``` ## 与 Glacier 配合使用 将 [Glacier 的](https://hackops-academy.github.io/glacier/)主动 扫描器指向 `http://127.0.0.1:5099/`,并将 `broken_admin`/注入系列家族的 漏洞设置为 **low**(默认值) — 其路由路径、参数 名称(`username`/`password`、`q`、`id`、`file`、`host`、`url`)以及 SQL 错误格式(`sqlite3.OperationalError`)均与 `active/scanner.py` 的 `check_*` 函数所期望的内容相匹配,因此现有的针对 旧版 `vulnerable_test_app.py` 的 Glacier 扫描无需修改即可继续在 Vuln99 上运行。 如需完整的演练 — 将所有 24 个漏洞中的每一个都映射到 特定的 Glacier 模块,并辅以一套组合方法论 — 请参阅 **[Vuln99 的课程](https://hackops-academy.github.io/vuln99/)**,该课程是作为 [Glacier 的课程](https://hackops-academy.github.io/glacier/)的配套内容编写的。 ## 许可证 MIT License — 详情请参阅 `LICENSE`。 *由 HackOps Academy 打造 — [Glacier](https://github.com/hackops-academy/glacier) 的实弹靶场。*
标签:CISA项目, Flask, OPA, Web安全, 安全, 安全规则引擎, 渗透测试训练, 漏洞演练, 蓝队分析, 超时处理, 逆向工具, 靶场