nithiya-rajesh/owasp-web-top10-playground
GitHub: nithiya-rajesh/owasp-web-top10-playground
一个基于 OWASP Top 10:2025 的开源 Web 应用安全实战靶场,提供十个可真实利用的漏洞场景供学习和练习。
Stars: 0 | Forks: 0
# OWASP Web Top 10 实战演练场
[](https://github.com/nithiya-rajesh/owasp-web-top10-playground/actions/workflows/ci.yml)
[](LICENSE)
[](https://www.python.org/downloads/)
**免费、开源的经典 Web 应用安全实战练习——无需付费订阅、无需 API key,也**
**无需任何形式的外部服务。** 这里的一切完全运行在你自己的机器上。
一个包含刻意设计漏洞的 Web 应用,专门用于实战演练
**[OWASP Top 10:2025](https://owasp.org/Top10/)** —— 经典的 Web 应用安全
风险(SQL injection、访问控制失效、XSS 等),
这与独立的 **OWASP LLM Top 10 Playground**(一个涵盖 AI/LLM 特定
风险的姊妹项目——等两个仓库都发布后再在此处添加链接,
例如 `https://github.com/nithiya-rajesh/owasp-llm-playground`)有所不同。
十个真实的、可实际利用的 endpoint —— 每个 OWASP 类别一个 —— 具有
应用内的目标/提示/修复指南,并在成功利用时自动捕获 flag。
可以将其想象为 Juice Shop / WebGoat / DVWA,但专门针对
当前的(2025 年)OWASP 清单。
**只能在本地、针对你自己的机器运行此应用。切勿将其公开部署**
—— 这里的每一个 endpoint 都是故意留下漏洞的。**
## 场景
| # | OWASP ID | 类别 | 你将要利用的真实漏洞 |
|---|---|---|---|
| 1 | A01:2025 | 访问控制失效 | 订单详情中的 IDOR;通过头像导入 URL 获取器引发的 SSRF |
| 2 | A02:2025 | 安全配置错误 | 遗留的已启用的 debug endpoint,泄露了配置/密钥/堆栈跟踪 |
| 3 | A03:2025 | 供应链失效 | 模拟市场中的拼写错误且未经验证的“扩展” |
| 4 | A04:2025 | 加密机制失效 | 可破解的无盐 MD5 密码导出;使用可猜测 secret 签名的 JWT |
| 5 | A05:2025 | 注入 | 真正的 SQL injection 登录绕过(真实的 sqlite3 数据库);评论中的存储型 XSS |
| 6 | A05:2025 | 不安全设计 | 结账时信任客户端提交的价格/数量,且服务端无二次校验 |
| 7 | A07:2025 | 身份验证失效 | 无暴力破解锁定机制;通过忘记密码功能进行用户名枚举 |
| 8 | A08:2025 | 软件或数据完整性失效 | 没有签名/完整性校验的设置恢复功能 |
| 9 | A09:2025 | 安全日志与告警失效 | CRLF 日志注入 —— 伪造虚假的审计日志条目 |
| 10 | A10:2025 | 异常条件处理不当 | 授权检查在遇到畸形输入时会直接放行(fails OPEN) |
有关完整的分类说明和修复方案,请参阅 `docs/OWASP_MAPPING.md`。
## 快速开始(Docker —— 推荐)
```
git clone
cd owasp-web-top10-playground
docker compose up --build
```
打开 **http://localhost:8000**。
## 快速开始(不使用 Docker)
```
git clone
cd owasp-web-top10-playground
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload
```
打开 **http://localhost:8000**。
## 工作原理
- 控制面板列出了所有 10 个场景。点击其中一个即可直接进入其
真实的、包含漏洞的页面 —— 登录表单、搜索框、结账流程,
或是适合该类别的任何页面。
- 每个场景都有 **Play(实战) / Objective(目标) / Hints(提示) / Fix(修复)** 标签页。Play 是
实际存在漏洞的应用;其他则是培训材料。
- 成功利用漏洞会自动捕获 flag(在服务端进行,
基于真实的请求/响应状态 —— 而不是你可以从前端伪造的),并解锁该场景的 **Fix** 标签页。
- **Reset session(重置会话)**(通过 `POST /play/{id}/reset`)会清除你当前会话中
已捕获的 flag 以及该场景的所有专属状态。
在架构上,这与姊妹 LLM playground 采用相同的模式 ——
自动发现场景(只需在 `app/scenarios/` 中放入一个新文件夹,它就会被
自动拾取)、确定性的服务端 flag 验证,以及
每个场景模块对应一个 OWASP 类别。
## 关于真实与模拟的说明
这里的一切都是针对**真实**运行代码的**真正**漏洞 —— SQL injection 会通过真实的未参数化查询命中实际的 sqlite3 数据库;JWT 伪造是使用真实的 PyJWT 针对该应用实际存在的(弱)签名 secret 进行验证的;而 XSS 则是真正未经转义的 HTML 渲染。
出于安全考虑,有两点是故意模拟而非完全真实的:
- **SSRF (A01):** 头像导入器检测到看似内部的 hostname
并返回一个*虚假的*“已获取”结果 —— 它绝不会发出真实的出站
网络请求,因此即使意外操作,也无法实际用于触及真实的内部
基础设施。
- **A08(完整性失效):** 此场景使用没有签名校验的 JSON 设置恢复,
而不是真正的不安全反序列化(例如
Python `pickle`)远程代码执行演示。一个可运行的通过 pickle 实现 RCE 的
payload 是一种通用的、可直接转移的 exploit 原语,可用于攻击
*任何*反序列化不受信任数据的 Python 应用 —— 与受控的培训实验环境相比,这是一种实质上不同(且更广泛)的风险,
因此该场景在教授相同的缺失完整性校验
根本原因的同时,并未提供可复用的 RCE payload 生成器。
## 架构
```
app/
core/
db.py # real sqlite3 DB (for A05) + plain dict stores for the rest
session.py # cookie-based session store
layout.py # shared HTML page shell (Play/Objective/Hints/Fix tabs)
scenarios/
base.py # Scenario dataclass every module implements
a01_broken_access_control/
scenario.py # real FastAPI router with the vulnerable routes
a02_security_misconfiguration/
...
main.py # dashboard, mounts each scenario's router, generic tab routes
```
没有真实的用户账户,没有真实的支付处理,除了
进程内存外没有任何持久化。这是一个培训工具,而不是用于生产环境的
架构模板 —— 切勿在任何真实的应用中复用这些模式。
## 环境要求
- Python 3.11+(如果不使用 Docker 运行)
- Docker + Docker Compose(可选,推荐)
## 许可证
MIT —— 详见 `LICENSE`。欢迎参与贡献;请参阅 `CONTRIBUTING.md` 以及我们的
`CODE_OF_CONDUCT.md`。
标签:CISA项目, OPA, OWASP Top 10, Python, StruQ, Web安全, 安全, 无后门, 蓝队分析, 请求拦截, 超时处理, 逆向工具, 靶场