thsteixeira/django-security-lab
GitHub: thsteixeira/django-security-lab
一个针对 OWASP Top 10 的可运行 Django 安全实验室,提供漏洞视图与安全视图的对比及标准安全工具的扫描复现。
Stars: 0 | Forks: 0
# django-security-lab
[](https://github.com/thsteixeira/django-security-lab/actions/workflows/ci.yml)
[](LICENSE)
**针对 OWASP Top 10 的可运行 Django 实验室,每一个都使用安全分析师实际运行的现成工具进行扫描 —— Bandit 和 Semgrep (SAST)、OWASP ZAP / sqlmap (DAST)、pip-audit (SCA) —— 并且在每次提交时 CI 都是绿色通过的。**
这是 [Django 安全系列](https://thiagoteixeira.tech/blog/) 的配套仓库。每篇文章都解释了一种攻击;这里匹配的实验室是您可以重新运行的证明:一个易受攻击的视图和一个安全的视图,以及文章中引用的精确扫描器命令和捕获的输出。克隆它,启动实验室,用标准工具指向它,然后观察它们如何标记出易受攻击的视图并在安全的视图上保持沉默。
## 为什么会有这个项目
一个映射到 OWASP / CWE / ASVS 的 Django-5.x 安全实验室,具备可重现的 SAST/DAST/SCA playbook 和绿色的 CI pipeline,**之前并不存在**。其他的替代方案要么过时,要么不在本平台上:django.nV 依赖于旧版 Django,DVWA 是 PHP 的,Juice Shop 是 Node 的,WebGoat 是 Java 的。这个仓库为 Python/Django 生态系统填补了这一空白 —— 这是一个您可以克隆并使用手头现有工具进行扫描的实验室。
## 包含内容
```
labs/post_NN_/ runnable vulnerable + secure views, a CTF flag, tests, a teaching README
rules/.{yaml,py} OPTIONAL — a custom Semgrep rule + its test fixture, present only for the
rare post where the standard tools miss a Django-specific pattern (see below)
```
| # | 文章 / 主题 | 实验室 | 检测 |
|---|---|---|---|
| 01 | SQL 注入 | [`labs/post_01_sql_injection/`](labs/post_01_sql_injection/) | SAST (Bandit + Semgrep community) · DAST (sqlmap) |
## 运行实验室
Docker + Postgres 是标准的运行路径 —— 读者运行的内容与 CI 运行的内容一致:
```
docker compose up --build # Postgres + Django on http://127.0.0.1:8000
```
然后打开 `http://127.0.0.1:8000/sql-injection/vulnerable/` 并尝试该实验室 README 中的漏洞利用。
在本地不使用 Docker 运行(使用 SQLite,用于快速查看或快速测试循环):
```
python -m venv .venv && . .venv/Scripts/activate # or source .venv/bin/activate
pip install -r requirements.txt
LAB_DB=sqlite python manage.py migrate
LAB_DB=sqlite python manage.py test
```
## 使用标准工具扫描实验室
检测是**以标准工具优先** —— 由 CySA+ 分析师运行的相同扫描器,指向每个实验室。每个实验室的 README 都展示了确切的命令和捕获的输出。
```
# SAST — 源码的 static analysis
bandit -r labs/post_01_sql_injection/
semgrep scan --config p/django labs/post_01_sql_injection/
# SCA — 依赖的 known-CVE audit
pip-audit -r requirements.txt
# DAST — 对已启动的 lab 进行的 dynamic scan(完整 walkthrough 见 lab README)
# 注意:在默认 effort 下,sqlmap 会将其判定为 false positive;需要通过 --level/--risk 才能发现。
sqlmap -u 'http://127.0.0.1:8000/sql-injection/vulnerable/?q=1' \
-p q --batch --level=5 --risk=3 --dump -T sqli_flag
```
CI 运行 Django 实验室测试(通用关卡)以及 Bandit + Semgrep-community (SAST) 和 pip-audit (SCA)。DAST 的输出捕获在实验室的 README 中,并由读者进行复现,而不在 CI 中运行。
### 自定义的 Semgrep 规则是例外,而非常规
大多数漏洞类型都已被 Bandit 和 Semgrep 社区包很好地覆盖,因此大多数实验室**不包含**自定义规则。手写的规则仅会在标准工具遗漏的罕见 Django 特定模式(大量赋值、IDOR、权限提升)下出现在 `rules/` 下 —— 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。SQL 注入已被标准工具覆盖,因此实验室 01 没有自定义规则。
## 贡献
有关如何添加实验室(以及极少数情况下的自定义规则),请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。欢迎提交有关扫描器误报 / 漏报的 issue。
## 许可证
MIT —— 请参阅 [LICENSE](LICENSE)。
标签:CISA项目, DAST, Django, OWASP Top 10, Python, SAST, 安全靶场, 恶意软件分析, 无后门, 漏洞复现, 盲注攻击, 请求拦截, 逆向工具