fortify-presales/fortify-demo-app

GitHub: fortify-presales/fortify-demo-app

一个包含多种故意安全漏洞的Spring Boot演示应用,用于展示和教育应用安全测试工具的检测能力。

Stars: 0 | Forks: 0

# Fortify 演示应用 ## ⚠️ 警告 **本应用包含故意的安全漏洞,绝不应部署到生产环境或暴露在互联网中。** 这仅用于教育和演示目的。 ## 概述 这是一个简单的 Spring Boot 应用程序,演示了各种安全漏洞,这些漏洞可以通过应用程序安全测试工具(例如由 [OpenText Application Security](https://www.opentext.com/products/application-security) 提供的工具)检测出来。 ## 使用的技术 - Java 17 - Spring Boot 3.2.1 - Spring Data JPA - H2 内存数据库 - Gradle 8.7 - React - Tailwind CSS 可选项: - Microsoft Entra ID (Azure AD) 用于单点登录 (SSO) 和 OAuth2 身份验证 - MSAL.js (前端) 用于 Entra 登录和 token 处理 - Spring Security (后端) 作为带有 Entra JWT 验证的 OAuth2 资源服务器 有关如何使用 Microsoft Entra 设置登录身份验证的信息,请参阅 [ENTRA_SETUP_GUIDE.md](ENTRA_SETUP_GUIDE.md)。 ## 故意设置的安全漏洞 本应用程序包含以下故意的安全漏洞: ### 1. SQL 注入 - `UserService` 中未参数化的 SQL 查询 - 在 SQL 语句中直接拼接用户输入 ### 2. 路径遍历 - `FileService` 中的文件操作缺乏路径验证 - 允许在系统上读取/写入任意文件 ### 3. 命令注入 - 在 `FileService` 中直接执行用户提供的命令 无输入验证或清理 ### 4. 跨站脚本攻击 (XSS) - 未转义的用户输入反射在 HTML 响应中 - `UserController` 中无输出编码 ### 5. 硬编码凭据/密钥 - 源代码中硬编码的 API 密钥 - `application.properties` 中硬编码的数据库凭据 - 配置文件中暴露的密钥 ### 6. 弱加密 - 使用 MD5 进行密码哈希(已被证明在加密上不安全) - 明文密码存储 ### 7. 信息泄露 - 向用户暴露堆栈跟踪 - 通过 API 端点暴露敏感凭据 - 可通过调试端点访问数据库凭据 ### 8. 不安全的身份验证 - 弱密码验证 - 明文密码比较 - 在登录响应中回显密码 ### 9. 不安全的支付处理 - 以明文形式存储完整的支付卡 PAN 和 CVV (`Payment` 实体) - PCI/PII 违规(不安全,仅限演示) - 返回或记录原始卡号的调试端点 (`/api/payments/debug/rawcards`) — 信息泄露 - 支付输入无输入验证或清理(允许格式错误/攻击者控制的值) - 缺少支付操作的访问控制和审计(调试端点即使有最少的身份验证也会暴露敏感数据) - 针对静态或传输中的支付数据,除默认 TLS 外无加密或标记化(演示缺乏适当的 PCI 控制) ### 10. 不安全的 Entra / OAuth Token 处理 - 针对Entra token交换放宽了颁发者验证回退(即使颁发者声明不匹配,也接受签名有效的token) - 不安全的演示行为 - Token 交换端点接受外部获取的 Entra 访问 token,并将其转换为具有最少声明强化的本地演示 JWT - 当无法获得同意时,前端可能会从自定义 API 范围回退到 `User.Read`,从而削弱了预期的 API 受众限制 - 身份验证工件缓存在浏览器的 localStorage 中,如果存在 XSS 会增加暴露风险 - 在 token 交换中未验证 Audience (`aud`) 和 Authorized Party (`azp`) 声明 - 后端在身份验证流程中禁用了 CSRF 保护 ## 构建应用程序 ``` # 使用本地 Gradle 安装 gradle clean build # 或使用 Gradle wrapper(如果存在则推荐) ./gradlew clean build ``` ## 运行应用程序 ``` # 使用本地 Gradle 安装 gradle bootRun # 或使用 Gradle wrapper(如果存在则推荐) ./gradlew bootRun # 或运行 jar 文件: java -jar build/libs/fortify-demo-app-1.0.0-SNAPSHOT.jar # 或者如果您已安装 Docker docker build . docker run -d --name fortify-demo-app -p 8080:8080 fortify-demo-app:latest ``` 应用程序将在 `http://localhost:8080` 上可用,您可以在此地址浏览前端,或在 `http://localhost:8080/swagger-ui/index.html` 浏览后端 API。 ## 开发应用程序 如果您希望为应用程序开发新功能,可以分别启动后端和前端。要启动后端(不包含前端): ``` ./gradlew clean bootRun -PskipFrontend=true ``` 然后启动前端: ``` cd frontend npm run dev ``` 注意:如果您对前端进行了更改,vite 服务器将自动重新加载。但是,对于后端的更改,您需要停止并重新启动后端。 ## API 端点 ### 用户管理 - `GET /api/users` - 获取所有用户 - `GET /api/users/search?query={query}` - 搜索用户(存在 SQL 注入漏洞) - `GET /api/users/find?username={username}` - 查找用户(存在 SQL 注入漏洞) - `POST /api/users` - 创建新用户(存储明文密码 — 不安全的演示) - `PUT /api/users/{id}` - 更新用户(仅限演示) - `POST /api/users/login?username={username}&password={password}` - 登录(返回演示 JWT) - `POST /api/users/logout` - 登出(将提供的 token 加入黑名单) - `GET /api/users/welcome?name={name}` - 欢迎页面(存在 XSS 漏洞) - `GET /api/users/{id}/profile?message={message}` - 用户资料(存在 XSS 漏洞) - `GET /api/users/debug/credentials` - 暴露数据库凭据(不安全) ### 文件操作 - `GET /api/files/read?filename={filename}` - 读取文件(存在路径遍历漏洞) - `POST /api/files/write?filename={filename}` - 写入文件(存在路径遍历漏洞) - `GET /api/files/exec?cmd={cmd}` - 执行命令(存在命令注入漏洞) - `GET /api/files/shell?input={input}` - 执行 shell 命令(存在命令注入漏洞) - `GET /api/files/readabs?path={path}` - 读取绝对路径(存在路径遍历漏洞) - `DELETE /api/files/delete?filename={filename}` - 删除文件(存在路径遍历漏洞) ### 支付端点 - `GET /api/payments` - 获取所有支付(暴露卡数据) - `GET /api/payments/user/{userId}` - 获取用户的支付信息 - `POST /api/payments` - 创建支付方式(以明文形式存储卡号/CVV) - `DELETE /api/payments/{id}` - 删除支付方式 - `POST /api/payments/charge?paymentId={id}&amount={amt}` - 模拟支付扣款(调试/演示) - `GET /api/payments/debug/rawcards` - 返回原始卡号的调试端点(不安全) ### 交易 - `GET /api/transactions/payment/{paymentId}` - 获取给定支付的交易记录 ### H2 控制台 - `http://localhost:8080/h2-console` - H2 数据库控制台 ## API 文档 启动应用程序后(参见[运行应用程序](#running-the-application)),可以在以下位置访问 OpenAPI JSON 和 Swagger UI: - Swagger UI: `http://localhost:8080/swagger-ui/index.html` - OpenAPI JSON: `http://localhost:8080/v3/api-docs` 注意: - 这些文档描述了本演示应用中故意设置的不安全端点。 - 如果您更改了服务器端口,请相应地更新上述 URL 中的主机/端口。 - 即使启用了 Entra 集成,Swagger UI 和 OpenAPI JSON 仍然可以公开访问。 - 当您使用 `Try it out` 时,受保护的 `/api/**` 操作仍需要 `Authorization: Bearer ` 请求头。 - 您可以像以前一样通过 `/api/users/login` 登录获取演示 JWT,然后将该 token 粘贴到 Swagger 的 **Authorize** 对话框中来继续使用 API。 ## 创建 JWT `/api/users/login` 端点在成功验证后返回一个原始 JWT token。在 `Authorization: Bearer ` 请求头中使用该 token 来调用受保护的端点(除 `/api/users/login` 和 `/api/users/debug/credentials` 之外的所有 `/api/**` 端点)。 示例(将用户名/密码替换为有效的演示凭据): ### curl (bash / Linux / macOS): ``` # 获取 token TOKEN=$(curl -s -X POST "http://localhost:8080/api/users/login?username=alice&password=alice456") echo "Token: $TOKEN" # 调用受保护的 endpoint curl -s -H "Authorization: Bearer $TOKEN" "http://localhost:8080/api/users" ``` ### PowerShell (Windows): ``` # 获取 token $token = Invoke-RestMethod -Method Post -Uri "http://localhost:8080/api/users/login?username=alice&password=alice456" Write-Host "Token: $token" # 调用受保护的 endpoint Invoke-RestMethod -Uri "http://localhost:8080/api/users" -Headers @{ Authorization = "Bearer $token" } ``` 注意: - 演示返回的 token 故意设计为不安全的(硬编码的密钥和演示声明)。请勿在生产环境中重用。 - 如果您的服务器端口不同,请相应地更新 URL。 初始演示用户: - `alice` / `alice456` (参见 [src/main/java/com/opentext/appsec/demo/DataInitializer.java](src/main/java/com/opentext/appsec/demo/DataInitializer.java#L1-L25)) ## 使用 Postman 和 Newman 进行测试 您可以使用 Postman 交互式测试 REST API,或者使用 `newman` 从命令行运行集合。 前置条件: - Node.js (v14+) 运行包含的 Postman 集合(使用 `{{baseUrl}}` 集合变量,默认为 `http://localhost:8080`): ``` # 使用 npx 运行(无需全局安装) npx newman run postman/FortifyDemoApp.postman_collection.json ``` 如果您想要 HTML 输出(在本地安装报告器或使用 npx): ``` npx newman run postman/FortifyDemoApp.postman_collection.json -r cli,html # HTML 报告将写入当前文件夹 (newman-run-report.html) ``` 注意: - `Auth - Login` 请求使用初始的 `admin` / `admin123` 凭据,并将 JWT 存储在名为 `token` 的集合变量中。 - 后续请求使用请求头 `Authorization: Bearer {{token}}`。 ## 使用 OpenText Application Security (Fortify) 进行测试 本应用程序旨在使用 OpenText Application Security 的 SAST、SCA 和 DAST 引擎,以及使用 Aviator 进行 AI 修复来进行扫描。 上述大多数漏洞应该在静态分析期间被检测出来。 您可以使用提供的 [Postman 集合](postman/FortifyDemoApp.postman_collection.json) 运行 DAST API 扫描。 您可以使用提供的 [登录宏](fortify/FortifyDemoApp-Dev-Login.webmacro) 运行 DAST 网站扫描。 注意:上面的登录宏将登出条件 URL 设置为本应用使用的自定义登出端点: ``` [URI]/api/users/logout ``` 这告诉扫描器应用程序的登出位置,以便它可以检测会话结束事件。 ### 预期发现 安全扫描应能识别出: - 多个 SQL 注入漏洞 - 路径遍历漏洞 - 命令注入漏洞 - 跨站脚本攻击 (XSS) 漏洞 - 硬编码凭据和 API 密钥 - 弱加密算法 - 信息泄露问题 - 不安全的身份验证机制 - 不安全的支付卡数据存储和暴露(明文 PAN/CVV)— PCI/PII 问题 - 故意记录或反射敏感支付数据的端点(信息泄露) - Entra 集成中的 OAuth / OpenID Connect token 验证弱点 - Entra 登录流程中的弱声明验证和不安全的 token 交换行为 ## 许可证 本项目仅用于演示目的。有关更多详细信息,请参阅 [LICENSE](./LICENSE) 文件。
标签:Azure AD, CISA项目, DAST, Fortify, Gradle, H2数据库, Microsoft Entra ID, OAuth2, OPA, React, SAST, Spring Boot, SSO, Syscalls, Tailwind CSS, Web安全, XSS, 代码安全, 信息泄露, 单点登录, 命令注入, 域名枚举, 安全培训, 安全测试, 安全漏洞, 弱加密, 恶意软件分析, 攻击性安全, 教育项目, 无线安全, 漏洞情报, 漏洞枚举, 漏洞测试, 漏洞演示, 盲注攻击, 硬编码密码, 网络安全, 自动化分析, 蓝队分析, 请求拦截, 跨站脚本, 路径遍历, 隐私保护, 靶场