BhanukaC/Web-security-lab
GitHub: BhanukaC/Web-security-lab
一个本地运行的故意存在漏洞的 Web 应用实验室,用于教学和演示 SQL 注入、XSS、CSRF、提示词注入和密钥泄露等安全漏洞。
Stars: 0 | Forks: 0
# Web 安全实验室
## 快速开始
```
git clone https://github.com/BhanukaC/Web-security-lab.git
cd Web-security-lab
cp .env.example .env
docker compose up
```
默认的 `.env` 设置了 `LLM_PROVIDER=fake`,因此 prompt injection 演示无需 API key
即可运行。容器启动后,演示 01-03 位于 http://localhost:8080,
存在漏洞的聊天机器人位于 http://localhost:8000,安全聊天机器人位于
http://localhost:8001。
## 演示
| Demo | 漏洞 | OWASP 2025 类别 | URL |
|---|---|---|---|
| `01-sql-injection` | SQL injection,明文密码 | A05 Injection | http://localhost:8080/01-sql-injection/vulnerable.php |
| `02-xss` | 存储型跨站脚本攻击 | A05 Injection | http://localhost:8080/02-xss/vulnerable.php |
| `03-csrf` | 跨站请求伪造 | A01 Broken Access Control | http://localhost:8080/03-csrf/vulnerable.php |
| `04-prompt-injection` | 直接和间接 prompt injection | LLM01 Prompt Injection | http://localhost:8000/answer |
| `05-secrets` | 硬编码凭证提交到了 git | A03 Software Supply Chain Failures | 运行 gitleaks,参见 `demos/05-secrets/README.md` |
每个演示文件夹都有自己的 README,其中包含了要尝试的准确 payload 以及修复位置。
## 工具
**OWASP ZAP baseline scan。** ZAP 会对正在运行的网站进行抓取,并报告常见问题,
而不会对其进行激进的攻击。在本地针对该 stack 运行它:
```
docker run --rm -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py -t http://host.docker.internal:8080
```
`host.docker.internal` 在 Docker Desktop(Mac/Windows)上可以直接解析;在
原生 Linux Docker 上,你需要在上述命令中添加 `--add-host=host.docker.internal:host-gateway`,
或者直接使用你机器的局域网 IP 即可。
相同的扫描会在 CI 中针对演示 01-03 运行,并将 HTML 报告作为构建工件(build artifact)上传。
**Burp Community 作为代理。** 将 Burp 的代理监听器设置为 127.0.0.1:8080(其
默认值),通过 Burp 内置浏览器或代理扩展让浏览器指向它,然后通过 Burp 浏览演示,
这样你就可以查看并重放每个请求。
Community 版本没有主动扫描功能,这里使用它是为了拦截和重复
请求,而不是为了自动化攻击。
**gitleaks。** 扫描 git 仓库中类似 secret 的字符串,包括后来被删除的字符串,
因为它会读取历史记录。在本地运行
`docker run --rm -v "$PWD:/repo" zricethezav/gitleaks:v8.30.1 detect --source /repo --verbose`,
或者依赖 CI 中的 `secrets` 作业。
## 练习
1. 在不知道有效密码的情况下,绕过演示 01 中的登录。
2. 使用存储型 XSS payload 从演示 02 中窃取会话 cookie。
3. 使用来自 `attacker.html` 的伪造跨站请求,在演示 03 中转账。
4. 通过直接 prompt injection,从演示 04 的 `/chat` endpoint 泄露员工折扣码。
5. 利用隐藏在评论中的间接 prompt injection,从演示 04 的 `/summarise-review` endpoint 触发退款。
6. 通过演示 04 的 `/answer` endpoint 让任意标记语言被执行。
7. 让 gitleaks 在演示 05 中标记出一个尚未在 `.gitleaksignore` 中的 secret。
## 故障排除
**端口已被占用。** 有其他程序正在监听 8080、8000、8001 或 3306 端口。
请停止该进程,或者更改 `docker-compose.yml` 中端口映射的左侧。
**重新运行时数据库未初始化。** `db/init.sql` 只在首次创建全新的 MySQL
数据卷时运行。如果你已经启动过一次 stack,请运行
`docker compose down -v` 删除该卷,然后再次运行 `docker compose up`。
**Windows 上的 Docker。** 使用 WSL2 作为后端(Docker Desktop 设置),并将
仓库克隆到 WSL 文件系统中,而不是 `/mnt/c` 下,因为跨过该边界进行文件监视和
卷挂载要慢得多。
**Gemini 返回 429 错误。** 免费配额由使用同一 Google Cloud 项目的所有人共享。
如果你使用的是共享的课堂 key,请等待一分钟然后重试,或者切换到你自己的 key,或者设置 `LLM_PROVIDER=fake` 以便无需等待即可继续工作。
标签:CISA项目, Docker, Web安全, 安全培训, 安全防御评估, 漏洞靶场, 版权保护, 蓝队分析, 请求拦截, 逆向工具, 防御检测