ayinedjimi/wordpress-vulnerable-lab
GitHub: ayinedjimi/wordpress-vulnerable-lab
一个基于 Docker 的完整 WordPress 漏洞实验室,集成了大量真实 CVE 插件、辅助服务与多步 CTF 攻击链,专用于安全学习、CTF 训练及漏洞扫描器基准测试。
Stars: 2 | Forks: 0
```
██╗ ██╗██████╗ ██╗ ██╗██╗ ██╗██╗ ███╗ ██╗ ██╗ █████╗ ██████╗
██║ ██║██╔══██╗ ██║ ██║██║ ██║██║ ████╗ ██║ ██║ ██╔══██╗██╔══██╗
██║ █╗ ██║██████╔╝ ██║ ██║██║ ██║██║ ██╔██╗ ██║ ██║ ███████║██████╔╝
██║███╗██║██╔═══╝ ╚██╗ ██╔╝██║ ██║██║ ██║╚██╗██║ ██║ ██╔══██║██╔══██╗
╚███╔███╔╝██║ ╚████╔╝ ╚██████╔╝███████╗██║ ╚████║ ███████╗██║ ██║██████╔╝
╚══╝╚══╝ ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝╚═════╝
```
# wordpress-vulnerable-lab — **v2.0.0**
### 世界上最完整的 Docker WordPress 漏洞实验室。
[](https://github.com/ayinedjimi/wordpress-vulnerable-lab/actions/workflows/ci.yml)
[](https://github.com/ayinedjimi/wordpress-vulnerable-lab/actions/workflows/verify.yml)
[](LICENSE)
[](docker-compose.yml)
[](docs/VULNERABILITIES.md)
[](docs/VULNERABILITIES.md)
[](docs/CTF/)
[](docs/PHASE_F_MATRIX.md)
[](docs/PHASE_D_NGINX.md)
[](https://ayinedjimi-consultants.fr)
**54 个固定 CVE 的插件与主题 (2019-2025) · 10 个定制的教学性质 mini-plugin · WP 5.2 / 5.3 / 6.1 / 6.8 矩阵 · Apache + nginx stack · 辅助服务 (Elasticsearch / MinIO / Gitea / 伪造的 AWS IMDS) · 5 条完整文档化的 kill-chain · 11 处故意的配置错误**
[快速开始](#quickstart-30-seconds) ·
[所有漏洞](docs/VULNERABILITIES.md) ·
[2024-25 CVE 包](docs/PHASE_A_GROUND_TRUTH.md) ·
[定制 mini-plugin](docs/PHASE_B_GROUND_TRUTH.md) ·
[辅助服务](docs/PHASE_C_SERVICES.md) ·
[nginx stack](docs/PHASE_D_NGINX.md) ·
[Kill chains](docs/CTF/) ·
[WP 矩阵](docs/PHASE_F_MATRIX.md) ·
[Français](#français)
## 🆕 v2.0.0 中的新特性
| 阶段 | 范围 | 文件 |
|-------|-------|-------|
| **A** | 15 个固定 CVE 的插件 (CVE-2024-* / CVE-2025-*) + 5 个存在漏洞的主题 | [`docs/PHASE_A_GROUND_TRUTH.md`](docs/PHASE_A_GROUND_TRUTH.md) |
| **B** | 10 个定制的教学性质 mini-plugin,每类漏洞一个 (nonce, type-juggling, mass-assignment, host-poisoning, CRLF, SOAP-XXE, race coupon…) | [`plugins/bazooka-vuln-pack/`](plugins/bazooka-vuln-pack/) · [`docs/PHASE_B_GROUND_TRUTH.md`](docs/PHASE_B_GROUND_TRUTH.md) |
| **C** | 辅助服务 compose:Elasticsearch / MinIO / Gitea / 伪造的 AWS IMDS — 可用于 SSRF → metadata → S3 dump 链 | [`docker-compose.aux.yml`](docker-compose.aux.yml) · [`docs/PHASE_C_SERVICES.md`](docs/PHASE_C_SERVICES.md) |
| **D** | 替代 stack:nginx 1.18 + PHP 8.1-FPM + ModSec-lite (3 处故意的 nginx 配置错误) | [`docker-compose.nginx.yml`](docker-compose.nginx.yml) · [`docs/PHASE_D_NGINX.md`](docs/PHASE_D_NGINX.md) |
| **E** | 5 条完整文档化的多步骤 CTF kill-chain,包含 curl/wpscan/sqlmap 命令 + 植入的 flag | [`docs/CTF/`](docs/CTF/) · [`scripts/plant-flags.sh`](scripts/plant-flags.sh) |
| **F** | WordPress 版本矩阵:在 4 个端口上并行运行 5.2 / 5.3 / 6.1 / 6.8 — 跨版本基准测试扫描器 | [`docker-compose.matrix.yml`](docker-compose.matrix.yml) · [`docs/PHASE_F_MATRIX.md`](docs/PHASE_F_MATRIX.md) |
## 快速开始 (30 秒)
```
git clone https://github.com/ayinedjimi/wordpress-vulnerable-lab.git
cd wordpress-vulnerable-lab
bash scripts/install.sh # boots stack + installs 54 vulnerable plugins/themes
```
然后:
| 服务 | URL | 凭证 |
|---|---|---|
| WordPress | http://localhost:31338 | `admin` / `admin` |
| phpMyAdmin | http://localhost:31339 | `root` / `root` |
| MailHog | http://localhost:31340 | — |
| Adminer | http://localhost:31341 | 服务器 `db`, 用户 `root`, 密码 `root` |
| MySQL | `localhost:31306` | `wordpress` / `wordpress` |
| Redis | `localhost:31379` | 无需认证 |
| Memcached | `localhost:31211` | 无需认证 |
验证所有服务是否在线:
```
bash scripts/verify.sh http://localhost:31338
```
销毁并从零开始重建:
```
bash scripts/reset.sh
```
### 可选 compose stack (v2.0.0)
```
# 基础服务之外,还提供辅助服务(Elasticsearch、MinIO、Gitea、模拟 AWS IMDS):
docker compose -f docker-compose.yml -f docker-compose.aux.yml up -d
# 除了 Apache 之外,还提供可选的 nginx 1.18 + PHP 8.1 stack(端口 31888):
docker compose -f docker-compose.yml -f docker-compose.nginx.yml up -d
# 完整的 WP 版本矩阵(端口 31352-31368 上的 5.2 / 5.3 / 6.1 / 6.8):
docker compose -f docker-compose.yml -f docker-compose.matrix.yml up -d
# 在 stack 启动后植入 CTF flag(用于链式 walkthrough 所必需):
bash scripts/plant-flags.sh
```
## 包含哪些内容
### 54 个存在漏洞的插件和主题 (CVE 2019 → 2025)
| 阶段 | 组件 | 数量 | 文档 |
|---|---|---|---|
| 初始 | 插件 CVE 2020-2024 | 39 | [`docs/VULNERABILITIES.md`](docs/VULNERABILITIES.md) |
| **A** | 插件 CVE 2024-2025 | 15 | [`docs/PHASE_A_GROUND_TRUTH.md`](docs/PHASE_A_GROUND_TRUTH.md) |
| **A** | 主题 CVE 2024 | 5 | [`docs/PHASE_A_GROUND_TRUTH.md`](docs/PHASE_A_GROUND_TRUTH.md) |
| **B** | 定制教学 mini-plugin | 10 | [`docs/PHASE_B_GROUND_TRUTH.md`](docs/PHASE_B_GROUND_TRUTH.md) |
完整的 ground-truth 表 (slug、版本、CVE id、CVSS、类型、NVD 链接) 位于
上述各阶段的文档中。
### 10 个定制教学 mini-plugin (阶段 B)
每一个都精确演示了**一种**很难通过现成 CVE 插件来教学的漏洞类别。
通过以下方式激活它们:
```
docker compose exec wp wp plugin activate bazooka-vuln-pack/bz-broken-nonce --allow-root
```
| # | 插件 | 漏洞类别 | CWE |
|---|---|---|---|
| 1 | `bz-broken-nonce` | 生成了 nonce 但从未验证的 AJAX action | CWE-352 |
| 2 | `bz-cap-confusion` | 使用 `is_user_logged_in()` 而不是 `current_user_can()` | CWE-285 |
| 3 | `bz-xxe-soap` | 带有 `LIBXML_NOENT \| LIBXML_DTDLOAD` 的 SOAP/XML endpoint | CWE-611 |
| 4 | `bz-type-juggling` | `md5($pw) == '0e…'` magic-hash 绕过 | CWE-697 |
| 5 | `bz-mass-assignment` | REST POST 接受任意 `role` 字段 | CWE-915 |
| 6 | `bz-host-poisoning` | 基于 `$_SERVER['HTTP_HOST']` 构建密码重置 | CWE-20 |
| 7 | `bz-crlf-injection` | 来自未经处理的 `$_GET['url']` 的 `Location:` header | CWE-113 / CWE-601 |
| 8 | `bz-postmessage-xss` | 管理页面将 `event.data` 传递给 `innerHTML` | CWE-79 |
| 9 | `bz-no-clickjacking` | 移除了 `X-Frame-Options` 的管理 action | CWE-1021 |
| 10 | `bz-race-coupon` | coupon 读写之间的 TOCTOU (parallel-curl race) | CWE-367 |
### 辅助服务 (阶段 C)
可通过 Docker 网络中的服务名称从 WordPress 容器访问 —
非常适合 SSRF 链练习 (例如 `wp-content/plugins/xxx → http://aws-metadata/latest/meta-data/iam/security-credentials/`)。
| 服务 | 宿主机端口 | 容器 | 配置错误 |
|---|---|---|---|
| 伪造的 AWS IMDS | 31254 | `aws-metadata` | 始终开启的 metadata 响应 |
| Gitea (HTTP / SSH) | 31300 / 31322 | `gitea` | 公开的 `internal/secrets-leak` 仓库,包含伪造的 `.env` |
| Elasticsearch 6.8 | 31392 | `elasticsearch` | 无需认证,`/_cat/indices` 可读 |
| MinIO API / 控制台 | 31900 / 31901 | `minio` | 默认凭证,公开的 `wp-backups` bucket 包含 `db_dump.sql` |
### 替代 nginx stack (阶段 D)
在端口 **31888** 上由 **nginx 1.18 + PHP 8.1-FPM** 提供相同的 WordPress 文件,
包含 3 个故意设置的漏洞 (alias path traversal, 通过 `.php~` 导致的源码泄露,
冗长的 `Server:` header),以及一套刻意宽松的 `ModSec-lite` 规则集。
### WordPress 版本矩阵 (阶段 F)
| WP | PHP | 端口 | 亮点 |
|----|-----|------|-----------|
| 5.2 | 7.2 | 31352 | CVE-2019-17671 REST API 用户泄露 |
| 5.3 | 7.4 | 31353 | 与主实验室保持一致 (5.3.2 基线) |
| 6.1 | 8.0 | 31361 | CVE-2023-2745 目录遍历 |
| 6.8 | 8.2 | 31368 | 已加固 — 误报对照箱 |
使用它来跨 WP 版本对扫描器的召回率与精确度进行基准测试。
### 11 处故意的配置错误
| URL 或端口 | 问题 |
|---|---|
| `/info.php` | phpinfo() |
| `/adminer.php` | Adminer 诱饵 |
| `/debug.log` | Stack traces + secrets |
| `/wp-config.php.bak` | 备份泄露 |
| `/dump.sql` | SQL 转储 |
| `/.env` | Env 文件泄露 |
| `/.git/{HEAD,config}` | Git 目录泄露 |
| `/wp-content/uploads/` | 目录列表 |
| `/xmlrpc.php` | 已启用 |
| `/wp-json/wp/v2/users` | 用户枚举 |
| MySQL :31306, Redis :31379, Memcached :31211 | 无需认证的网络服务 |
## 5 条完整文档化的 CTF kill-chain (阶段 E)
每条链都将实验室中的 **3 个以上漏洞** 组合成一个现实的
端到端攻击,在每一个步骤中都附有可直接复制粘贴的 curl/wpscan/sqlmap 命令、
预期输出、植入的 flag,**以及**防御者视角 (检测与
加固)。
| # | 标题 | Flag | 演练指南 |
|---|---|---|---|
| 1 | 从 `.git` 泄露到完全 RCE | `FLAG{wpvulnlab-chain1-a1f3c9e2}` | [`docs/CTF/chain-1.md`](docs/CTF/chain-1.md) |
| 2 | 子域名接管 → 窃取管理员 cookie | `FLAG{wpvulnlab-chain2-b7d2e8f4}` | [`docs/CTF/chain-2.md`](docs/CTF/chain-2.md) |
| 3 | 开放重定向 → OAuth 钓鱼 → REST 接管 | `FLAG{wpvulnlab-chain3-c4a9b1d6}` | [`docs/CTF/chain-3.md`](docs/CTF/chain-3.md) |
| 4 | SSRF → AWS IMDS → S3 备份转储 | `FLAG{wpvulnlab-chain4-d8e5f2a3}` | [`docs/CTF/chain-4.md`](docs/CTF/chain-4.md) |
| 5 | XML-RPC multicall 暴力破解 → SVG XSS → 后门插件 | `FLAG{wpvulnlab-chain5-e2b6c4f9}` | [`docs/CTF/chain-5.md`](docs/CTF/chain-5.md) |
在 stack 启动后植入 flag:
```
bash scripts/plant-flags.sh
```
## 在此实验室中对比 WordPress 扫描器
该实验室是专门为给 WordPress 安全工具*打分*而构建的。运行
包含的基准测试:
```
bash scripts/benchmark.sh http://localhost:31338 ./bench-out
```
| 扫描器 | 召回率 | 精确度 | F1 | 时间 |
|---|---:|---:|---:|---:|
| [**wordpress-bazooka**](https://github.com/ayinedjimi/wordpress-bazooka) **0.94** | 0.98 | **0.96** | 38 秒 |
| WPScan (免费数据库) | 0.82 | 0.93 | 0.87 | 71 秒 |
| WPScan (付费 API) | 0.98 | 0.98 | 0.98 | 73 秒 |
| Nuclei (wordpress tag) | 0.44 | 0.73 | 0.55 | 24 秒 |
| Nikto | 0.14 | 0.33 | 0.20 | 110 秒 |
完整方法论:[`docs/BENCHMARK.md`](docs/BENCHMARK.md)。
## CTF 挑战 (单漏洞,适合初学者)
除了 5 条 v2.0.0 kill-chain 之外,最初的 **15 个渐进式
单漏洞挑战** 记录在 [`docs/CHALLENGES.md`](docs/CHALLENGES.md) 中:
1. (简单) 发现 WP 版本
2. (简单) 枚举用户
3. (简单) 读取泄露的 `.env`
4. (中等) 通过 xmlrpc 暴力破解编辑者账号
5. (中等) 通过 popup-builder 存储型 XSS (CVE-2023-6000)
6. (中等) 通过 wp-statistics 进行基于时间的 SQLi (CVE-2024-2194)
7. (中等) 通过 ultimate-member 进行权限提升 (PE) (CVE-2023-3460)
8. (中等) 通过 royal-elementor-addons 进行文件上传 (CVE-2023-5360)
9. (困难) 链:post-smtp → admin
10. (困难) 链:forminator AFU → RCE → Redis
11. (困难) SAML XXE (CVE-2024-2879)
12. (困难) WooCommerce 认证绕过 (CVE-2023-28121)
13. (困难) 网络配置错误透传 (Redis/Memcached)
14. (地狱) 完整利用链至持久化 admin
## 路线图
- [x] 植入 39 个 CVE 插件 (v1.0)
- [x] 11 个配置错误端点 (v1.0)
- [x] CI:实验室启动 / 每周 CVE 端点验证 (v1.0)
- [x] **v2.0.0** — 新增 15 个 CVE 插件 (2024-2025)
- [x] **v2.0.0** — 5 个存在漏洞的主题
- [x] **v2.0.0** — 10 个定制教学 mini-plugin (`bazooka-vuln-pack`)
- [x] **v2.0.0** — 辅助服务 compose (Elasticsearch / MinIO / Gitea / 伪造的 IMDS)
- [x] **v2.0.0** — nginx 1.18 + PHP 8.1 替代 stack
- [x] **v2.0.0** — 5 条已文档化的多步骤 CTF kill-chain
- [x] **v2.0.0** — WP 版本矩阵 (5.2 / 5.3 / 6.1 / 6.8)
- [ ] v2.1 — 在 141 个漏洞目录上进行 BAZOOKA / WPScan / Nuclei 自动化基准 CI 测试
- [ ] v2.1 — 多站点模式 (子域名) + 每租户 CVE 矩阵
- [ ] v2.1 — 真正的 ModSecurity v3 (定制 Dockerfile) 替代 ModSec-lite
- [ ] v2.1 — 可选的可注入式 Wordfence/iThemes 插件场景
欢迎提交 PR — 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。
## 同一作者的相关项目
- **[wordpress-bazooka](https://github.com/ayinedjimi/wordpress-bazooka)** — 在此实验室中进行基准测试的 WordPress 扫描器。它附带单个 89 MB 的便携式 `bazooka.exe`、嵌入式多源 CVE 数据库、Tor 代理以及实时 GUI。
- **[ayinedjimi-consultants.fr](https://ayinedjimi-consultants.fr)** — WordPress 安全指南、加固检查清单、审计。
## 作者
**Ayi NEDJIMI** ·
**由 [Ayi NEDJIMI](https://ayinedjimi-consultants.fr) 使用 🔒 构建 — 巴黎**
标签:CISA项目, Docker, Go语言工具, OPA, WordPress, 安全, 安全测试, 安全防御评估, 搜索引擎查询, 攻击性安全, 文件完整性监控, 漏洞复现, 版权保护, 请求拦截, 超时处理, 靶场