hackops-academy/vuln99
GitHub: hackops-academy/vuln99
Vuln99 是一个集成了 24 种真实漏洞的 Flask 电商练习靶场,支持按漏洞逐个调整难度并与 Glacier 主动扫描器无缝配合,用于安全漏洞的实战化学习与扫描器验证。
Stars: 0 | Forks: 0
# 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安全, 安全, 安全规则引擎, 渗透测试训练, 漏洞演练, 蓝队分析, 超时处理, 逆向工具, 靶场