ibrasonic/vulnlabs

GitHub: ibrasonic/vulnlabs

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

Stars: 0 | Forks: 0

# vulnlabs ![status: lab use only](https://img.shields.io/badge/use-lab%20only-red) ![node](https://img.shields.io/badge/node-24%20LTS-339933?logo=node.js&logoColor=white) ![docker](https://img.shields.io/badge/docker-compose-2496ED?logo=docker&logoColor=white) ![license](https://img.shields.io/badge/license-MIT-blue) 这些应用是书籍*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安全, 安全防御评估, 版权保护, 网络安全, 自定义脚本, 蓝队分析, 隐私保护, 靶场