Paulo-Marcos-Lucio/laboratorio-owasp
GitHub: Paulo-Marcos-Lucio/laboratorio-owasp
一个以 Spring Boot 漏洞-攻击-修复三阶段对照为特色的 OWASP Top 10 实践教学项目,通过 JUnit 测试验证每类漏洞的复现与修复效果。
Stars: 1 | Forks: 0
# 🧪 OWASP 实验室
### OWASP Top 10 中的每一个漏洞分为**三个阶段**:漏洞版 → exploit → 修复版。
*这是一个基于 **Spring Boot** 的应用,其中每个漏洞都存在于两个 endpoint 中——`/vulneravel` 和 `/corrigido`——并且有一个**自动化测试证明**该 exploit 在漏洞版本中有效,而在修复版本中被拦截。这就是 Java 技术栈中以可执行代码呈现的“诊断与修复”。*
[](https://github.com/Paulo-Marcos-Lucio/laboratorio-owasp/actions/workflows/ci.yml)
[](https://openjdk.org/)
[](https://spring.io/projects/spring-boot)
[](LICENSE)
[](https://owasp.org/Top10/)
## ⚠️ 警告
本应用出于教育目的**刻意包含**了安全漏洞。**请勿将其暴露在互联网上。**请在本地运行。
## 🎯 理念
阅读关于漏洞的资料是一回事;**看到 exploit 实际生效**,然后再**看到修复方案拦截它**则是另一回事。这里的每一个模块都是一对:
- `…/vulneravel` —— 不安全的实现,带有解释错误的注释。
- `…/corrigido` —— 具有相同功能的安全实现。
- 一个**测试**,触发真实的 exploit 并断言双方的行为表现。
如果测试通过,演示就是真实的:漏洞是真实的,修复也是有效的。
## 🗂️ 漏洞列表
| OWASP | 漏洞 | 位置 | 证明测试 |
| --- | --- | --- | --- |
| **A03** | SQL Injection (CWE-89) | [`a03sqli`](src/main/java/br/com/paulomarcos/labowasp/a03sqli) | [`SqlInjectionTest`](src/test/java/br/com/paulomarcos/labowasp/SqlInjectionTest.java) |
| **A03** | 反射型 XSS (CWE-79) | [`a03xss`](src/main/java/br/com/paulomarcos/labowasp/a03xss) | [`XssTest`](src/test/java/br/com/paulomarcos/labowasp/XssTest.java) |
| **A03** | Command Injection (CWE-78) | [`a03cmd`](src/main/java/br/com/paulomarcos/labowasp/a03cmd) | [`CommandInjectionTest`](src/test/java/br/com/paulomarcos/labowasp/CommandInjectionTest.java) |
| **A01** | IDOR — 失效的访问控制 (CWE-639) | [`a01idor`](src/main/java/br/com/paulomarcos/labowasp/a01idor) | [`IdorTest`](src/test/java/br/com/paulomarcos/labowasp/IdorTest.java) |
| **A01** | Path Traversal (CWE-22) | [`a01path`](src/main/java/br/com/paulomarcos/labowasp/a01path) | [`ArquivoServiceTest`](src/test/java/br/com/paulomarcos/labowasp/ArquivoServiceTest.java) |
| **A01** | Open Redirect (CWE-601) | [`a01redirect`](src/main/java/br/com/paulomarcos/labowasp/a01redirect) | [`OpenRedirectTest`](src/test/java/br/com/paulomarcos/labowasp/OpenRedirectTest.java) |
| **A02** | 弱密码 Hash:MD5 → BCrypt (CWE-916) | [`a02crypto`](src/main/java/br/com/paulomarcos/labowasp/a02crypto) | [`HashSenhaTest`](src/test/java/br/com/paulomarcos/labowasp/HashSenhaTest.java) |
| **A10** | SSRF (CWE-918) | [`a10ssrf`](src/main/java/br/com/paulomarcos/labowasp/a10ssrf) | [`SsrfTest`](src/test/java/br/com/paulomarcos/labowasp/SsrfTest.java) |
## 🚀 运行
需要 **Java 21+**。(或者使用 Docker:`docker run --rm -v "$PWD":/app -w /app maven:3.9-eclipse-temurin-21 mvn test`。)
```
./mvnw spring-boot:run # ou: mvn spring-boot:run
```
### 查看并排展示的 exploit 和修复
```
# A03 — SQL Injection:payload 返回整个表...
curl "http://localhost:8080/a03/sqli/vulneravel?nome=Notebook' OR '1'='1"
# ...而参数化版本返回空:
curl "http://localhost:8080/a03/sqli/corrigido?nome=Notebook' OR '1'='1"
# A03 — XSS:`"
curl "http://localhost:8080/a03/xss/corrigido?q="
# A03 — Command Injection:"&& echo" 执行了第二个命令(存在漏洞) vs. 400(已修复)
curl "http://localhost:8080/a03/cmd/vulneravel?host=127.0.0.1 && echo INJETADO"
curl -i "http://localhost:8080/a03/cmd/corrigido?host=127.0.0.1 && echo INJETADO"
# A01 — IDOR:bob 读取了 alice 的成绩(存在漏洞) vs. 403(已修复)
curl -H "X-Usuario: bob" http://localhost:8080/a01/idor/vulneravel/1
curl -i -H "X-Usuario: bob" http://localhost:8080/a01/idor/corrigido/1
# A01 — Open Redirect:重定向到外部目标(存在漏洞) vs. 400(已修复)
curl -i "http://localhost:8080/a01/redirect/vulneravel?destino=https://site-falso.example"
curl -i "http://localhost:8080/a01/redirect/corrigido?destino=https://site-falso.example"
# A10 — SSRF:服务器获取云元数据的 IP(存在漏洞) vs. 400(已修复)
curl "http://localhost:8080/a10/ssrf/vulneravel?url=http://169.254.169.254/latest/meta-data/"
curl -i "http://localhost:8080/a10/ssrf/corrigido?url=http://169.254.169.254/latest/meta-data/"
```
### 运行测试(证明)
```
mvn test
```
## 🏗️ 组织结构
```
src/main/java/.../labowasp/
├── a01idor/ IDOR — verificação de propriedade do recurso
├── a01path/ Path Traversal — normalização + confinamento ao diretório-base
├── a01redirect/ Open Redirect — só aceita caminho relativo ao próprio app
├── a02crypto/ Hash de senha — MD5 (errado) vs BCrypt (certo)
├── a03cmd/ Command Injection — shell com entrada concatenada vs allowlist sem shell
├── a03sqli/ SQL Injection — concatenação vs consulta parametrizada
├── a03xss/ XSS — reflexão crua vs codificação de saída
└── a10ssrf/ SSRF — busca de URL arbitrária vs allowlist de host + bloqueio de IP interno
```
每个修复都应用了**正确的原则**,而不是简单的补丁:查询参数化、输出编码、基于属性的授权、路径限制、仅限内部目的地的重定向、通过白名单验证且不将输入传递给 shell、使用主机白名单并阻止内部地址(loopback/private/metadata)以及带盐的慢速 Hash。
## ⚖️ 道德规范使用
本材料为**教学和防御性质**。其中涉及的 exploit 技术仅用于理解和修复漏洞——请仅在本实验室或您已获授权测试的系统中使用。
## 📄 许可证
[MIT](LICENSE) © 2026 Paulo Marcos Lucio。
标签:CISA项目, JUnit测试, OWASP Top 10, Spring Boot, Web安全, 域名枚举, 安全教学, 漏洞复现, 蓝队分析, 请求拦截