ibrasonic/vulnlabs
GitHub: ibrasonic/vulnlabs
一套涵盖银行、电商、社交三大场景的故意不安全的 Web 应用靶场,全面覆盖 OWASP Top 10 及现代漏洞类型,专为渗透测试教学和练习设计。
Stars: 0 | Forks: 0
# vulnlabs




这些应用是书籍*Web Application
Penetration Testing — Accessibility-First, Terminal-First*的配套练习靶机。每一个应用在
涵盖 OWASP Top 10 及其扩展的整个清单上都是
故意设计为不安全的,因此同一个靶场无需
额外设置即可覆盖半数课程内容。
## 包含内容
| 靶机 | 主题 | 应用端口 | 附属服务 | 技术栈 |
| ------------- | ---------------------------- | -------- | ------------ | ---------------------------------------------------------------------- |
| `vuln-bank` | 网上银行 + 后台管理 | 3001 | — | Node 24 + Express + EJS + `node:sqlite` |
| `vuln-shop` | 电商 + 后台管理 + GraphQL | 3002 | 5002 (Flask) | Node 24 + Express + EJS + GraphQL + `node:sqlite` · Python 3 + Flask (Jinja2 SSTI sink) |
| `vuln-social` | 社交网络 + 私信 + LLM | 3003 | — | Node 24 + Express + EJS + Socket.IO + `node:sqlite` · Google Gemini |
每个应用包含:
- `server.js` — Express 入口。
- `seed.js` — 真实的种子数据,首次启动时自动运行。
- `routes/`, `lib/`, `views/`, `public/` — 实际应用代码。
- `Dockerfile` + `docker-compose.yml` — 一键容器化运行。
- `run.ps1` — 一键 Windows 启动脚本(检查 Node,首次运行执行 `npm install`,
填充数据库,启动服务器,打印凭证)。
- `smoke-test.ps1` — 端到端漏洞利用测试工具,可遍历完整的
漏洞清单。
- `VULNERABILITIES.txt` — 包含所有漏洞触发点、利用方法和预期的
修复措施。从头到尾阅读任意一个应用的此文件,您将
获得数十种漏洞类型的详细指引。
## 综合漏洞覆盖范围
所有十个 OWASP Top 10 类别以及现代相关的漏洞类型:
- **A01 失效的访问控制** — IDOR / BOLA,基于 GET 的提权,
缺少功能级授权,强制浏览 admin 路径。
- **A02 加密失败** — MD5 密码存储,JWT `alg=none`,
脆弱的 HS256 密钥,可预测的会话 token,JS bundle 中泄露的密钥。
- **A03 注入** — SQL injection(登录、搜索、后台),反射型 /
存储型 / DOM 型 XSS,服务器端模板注入(Jinja2),GraphQL
注入,原型污染触发点。
- **A04 不安全的设计** — 优惠券叠加竞争条件,注册时的批量赋值,
多步骤结账绕过,业务逻辑跳过。
- **A05 安全配置错误** — `/debug` 路由,CORS 反射
携带凭证,缺少安全标头,可被点击劫持的 admin,
附带 source map,默认凭证,客户端 bundle 中泄露的密钥。
- **A06 易受攻击的组件** — jQuery 1.12.4 (CVE-2019-11358) 和
lodash 风格的 merge 触发点。
- **A07 身份验证失败** — 无速率限制,薄弱的重置机制,用户枚举,
JWT 误用。
- **A08 软件/数据完整性** — `jQuery.extend(true, …)` 原型
污染,profile JSON 中的深拷贝污染。
- **A09 日志记录失败** — 敏感数据(密码、JWT、LLM
prompt)被写入日志。
- **A10 SSRF** — webhook 回调 + 图片代理。
- **Top 10 之外** — 文件上传 RCE,路径遍历 / LFI,GraphQL
无授权导出 + BOLA,WebSocket CSWSH + 无授权 `read_dm` +
未授权广播,通过 `/ai-summary` 的 LLM prompt injection,
CSRF(基于 GET 的关注 / DM / 举报 / 提升),开放重定向,
标头注入,缓存中毒模式。
每个触发点的确切位置、利用方法和预期的修复措施都位于对应应用的
`VULNERABILITIES.txt` 中。
## 环境要求
| 需求 | 版本 |
| ------------------- | ---------------------------------------------------- |
| Node.js | **24 LTS 或更高版本**(`node:sqlite` 需要) |
| PowerShell | 5.1+ (Windows) — 由 `run.ps1` 和 `smoke-test.ps1` 使用 |
| Docker Desktop | 可选 — 用于 `docker compose` 方式 |
| Python 3.11+ | 可选 — 仅当您在 Docker 之外运行 `vuln-shop` 的邮件服务时需要 |
| `GEMINI_API_KEY` | 可选 — 仅 `vuln-social` 使用;默认回退到 stub |
如果找不到 Node,`run.ps1` 会提示通过 `winget` 进行安装。
## 快速开始 — PowerShell,三个终端
```
# 终端 1
cd vuln-bank
.\run.ps1 # http://localhost:3001/
# 终端 2
cd vuln-shop
.\run.ps1 # http://localhost:3002/ (email service on :5002)
# 终端 3
cd vuln-social
.\run.ps1 # http://localhost:3003/
```
每个 `run.ps1` 都会:
1. 检查 Node.js(如果缺失则提供 `winget install`),
2. 如果 `node_modules/` 不存在则运行 `npm install`,
3. 首次运行时填充 SQLite 数据库(后续运行具有幂等性),
4. 在上面显示的端口上启动 Express 服务器,
5. 打印所有相关的 URL 和种子凭证。
`vuln-social` 额外读取 `GEMINI_API_KEY`(可选的
`GEMINI_MODEL`,默认为 `gemini-2.0-flash`)。如果没有密钥,`/ai-summary`
将回退到一个确定性的 stub,它仍会回显用户的 prompt —
这足以在不离开本机的情况下进行端到端的 prompt injection 演示。
## 快速开始 — Docker Compose
每个应用都附带自己的 compose 文件(独立的服务,独立的
命名卷,以确保 Windows 上 SQLite WAL 的安全性)。
```
cd vuln-bank ; docker compose up --build -d
cd vuln-shop ; docker compose up --build -d
cd vuln-social ; docker compose up --build -d
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
```
对于 `vuln-social`,如果您想使用
真实的 LLM 路径,请在 `docker compose up` 之前将 `vuln-social\.env.example` 复制到 `vuln-social\.env`
并填入 `GEMINI_API_KEY`。(`.env` 已包含在 `.gitignore` 中。)
要销毁所有环境:
```
cd vuln-bank ; docker compose down
cd vuln-shop ; docker compose down
cd vuln-social ; docker compose down
```
用于 WSL / Linux 的便捷脚本位于仓库根目录:
```
./.up.sh # docker compose up -d for all three
./.rebuild.sh # docker compose up --build -d for all three
```
## 默认测试凭证
每个应用的 `VULNERABILITIES.txt` 都包含完整的种子账户
列表。冒烟测试所使用账户的快速参考:
| 应用 | 客户 / 成员 | 管理员 |
| ------------- | ----------------------------- | ---------------------------------- |
| `vuln-bank` | `alice.chen / Password123!` | 由服务器 banner 打印 |
| `vuln-shop` | `olivia.park / OliviaP!23` | `admin_kate / AdminKate!1` |
| `vuln-social` | `aria / Aria2026!` | `admin_eli / AdminEli!1` |
## 验证每个漏洞触发点仍可被顺利利用
每个应用都有一个端到端测试工具,它会遍历完整的漏洞
清单并断言每个触发点都是可达的。**在启动
应用后**运行它:
```
powershell -ExecutionPolicy Bypass -File vuln-bank\smoke-test.ps1
powershell -ExecutionPolicy Bypass -File vuln-shop\smoke-test.ps1
powershell -ExecutionPolicy Bypass -File vuln-social\smoke-test.ps1
```
在全新的检出环境下的预期结果:
| 应用 | 检查项 |
| ------------- | ------- |
| `vuln-bank` | 40 / 40 |
| `vuln-shop` | 35 / 35 |
| `vuln-social` | 37 / 37 |
非零的失败意味着某个路由发生了变化,一个漏洞触发点被意外修复了 —
打开失败的检查,然后要么恢复该漏洞
(靶场的核心意义),要么更新测试工具。
## 单个靶机的目录结构
```
/
├── run.ps1 # one-shot Windows launcher
├── docker-compose.yml # alternative: docker compose up --build
├── Dockerfile
├── package.json
├── server.js # Express entry point
├── seed.js # realistic seed data
├── smoke-test.ps1 # full exploit harness — must pass 100 %
├── VULNERABILITIES.txt # every sink + recipe + intended mitigation
├── lib/ # db, auth, llm helpers
├── routes/ # express route modules
├── views/ # EJS templates
├── public/ # static frontend + per-item images
└── data/ # SQLite file + uploads (gitignored)
```
`vuln-shop` 额外包含 `email-service/` (Python 3 + Flask),它
在端口 5002 上提供 Jinja2 SSTI sink。
## 仓库目录结构
```
vulnlabs/
├── README.md # this file
├── LICENSE # MIT + safe-use notice
├── SECURITY.md # "deliberately vulnerable, no CVEs, lab-only"
├── .gitignore
├── .up.sh # WSL convenience: bring all three up
├── .rebuild.sh # WSL convenience: --build all three
├── vuln-bank/
├── vuln-shop/
└── vuln-social/
```
## 手动检查
启动每个应用后,在浏览器中访问主页:
- **bank** — http://localhost:3001/ → 渲染登录页面。
- **shop** — http://localhost:3002/ → 渲染店面,产品具有逐项生成的 SVG 艺术。
- **social** — http://localhost:3003/ → 渲染信息流,头像是逐个用户生成的 SVG。
然后打开应用的 `VULNERABILITIES.txt`,从头到尾按照指南
进行操作。
## 将靶机重置为全新种子
每个应用在其数据库文件不存在时会重新进行种子填充。
PowerShell(宿主机运行):
```
Remove-Item .\vuln-bank\data\bank.db* -Force -ErrorAction SilentlyContinue
Remove-Item .\vuln-shop\data\shop.db* -Force -ErrorAction SilentlyContinue
Remove-Item .\vuln-social\data\social.db* -Force -ErrorAction SilentlyContinue
```
Docker(命名卷 — 效果相同):
```
cd vuln-bank ; docker compose down -v ; docker compose up --build -d
cd vuln-shop ; docker compose down -v ; docker compose up --build -d
cd vuln-social ; docker compose down -v ; docker compose up --build -d
```
## 故障排除
- **找不到 `node:sqlite` / `DatabaseSync is not a constructor`** —
您的 Node 版本 ≤ 22。升级到 Node 24 LTS 或使用 Docker 方式。
- **`run.ps1` 被执行策略阻止** — 使用以下方式运行:
`powershell -ExecutionPolicy Bypass -File \run.ps1` 或
`Set-ExecutionPolicy -Scope CurrentUser RemoteSigned`。
- **端口已被占用** — 在启动前在环境中设置 `PORT`,
或对任何先前的实例执行 `docker compose down`。
- **WAL 文件在 Windows 绑定挂载上无限增长** — 这就是
compose 文件使用命名卷的原因;不要在
Windows DrvFs 上绑定挂载 `data/`。
- **`/ai-summary` 返回确定性 stub** — 未设置
`GEMINI_API_KEY`。要么设置它并重启,要么接受 stub(仍然足以
用于教授 prompt injection)。
- **冒烟测试在身份验证阶段立即失败** — 您可能在运行期间
重新进行了数据库种子填充;重启应用以使新种子生效。
## 许可证
[MIT](LICENSE)。MIT 许可涵盖了源代码;`LICENSE` 和
`SECURITY.md` 中的安全使用须知是操作指南,而不是
额外的许可限制。
## 作者
由 **Ibrahim Badawy** 构建,作为 *Web Application
Penetration Testing — Accessibility-First, Terminal-First* 一书和
[reqlore](https://github.com/ibrasonic/reqlore) 无障碍渗透测试
工具包的配套靶机。
标签:AI合规, CISA项目, Docker, GNU通用公共许可证, IP 地址批量处理, Node.js, OPA, Web安全, 安全防御评估, 版权保护, 网络安全, 自定义脚本, 蓝队分析, 隐私保护, 靶场