关键漏洞信息 漏洞名称: WebStack-Guns SQL Injection in Log Sorting (CWE-89) 提交者: sh7err@vEcho 目标产品: WebStack-Guns (基于Spring Boot的书签CMS) 受影响版本: 1.0 (当前master) 测试环境: commit HEAD of https://github.com/jsnjfz/WebStack-Guns on Java 8 / MySQL 5.7 漏洞类型: 经过身份验证的通过动态ORDER BY进行的SQL注入 CVSS V3.1 向量: AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (基础分8.8) 概要 管理日志查看器( 和 )从HTTP请求中接受任意的排序参数并通过MyBatis 替换将它们传递到构建的ORDER BY子句。由于应用程序故意暴露了可配置的排序功能,因此不存在任何验证或白名单。因此,任何经过身份验证的管理员都可以注入执行带有应用程序数据库权限的SQL表达式。 组件概述 (src/main/java/com/jsnjfz/manage/core/common/constant/factory/PageFactory.java:34-52) (src/main/java/com/jsnjfz/manage/modular/system/controller/LogController.java:69-76) (src/main/java/com/jsnjfz/manage/modular/system/controller/LoginLogController.java:67-74) 这些模块旨在给管理员客户端对表排序的控制。 参数未被处理就从UI传递到数据库层以支持任意列的排序,这无意中允许SQL片段到达数据库服务器。 概念验证 1. 登录到WebStack-Guns管理员控制台(默认凭据在README中:admin/111111)。 2. 使用恶意的 值请求操作日志列表: 3. MyBatis渲染的SQL语句变为: 4. 数据库连接在返回结果前被阻止5秒,表明注入成功。用 替换payload将返回HTTP响应中的当前模式名。类似的payload对 同样有效。 根因分析 直接从HTTP请求中获取 和 并存储在MyBatis 对象中,不进行过滤。 和 将 传递给各自的映射器方法,而不检查字段名称。 MyBatis XML文件在 内部嵌入 ,因此提供的字符串被连接到SQL语句中,绕过准备好的语句保护。 不存在批准的列名的白名单或映射,因此构造的SQL以应用程序的数据库凭证执行。 影响 任何已通过身份验证的管理员(或已攻陷此类账户的攻击者)都可以在WebStack-Guns数据库内实现任意SQL执行。这可以转储或篡改所有门户数据、更改用户密码,并可能通过基于时间的有效载荷影响可用性。由于项目附带公开记录的默认管理员凭证,远程利用可能是在未经加固的部署中进行的。 推荐修复措施 1. 用安全的基于枚举的映射替换 。在构建SQL之前定义可排序列的服务器端白名单,并将用户提供的标识符翻译为已知的列名。 2. 避免在 中进行字符串替换。使用MyBatis-Plus排序助手或实现条件逻辑,程序化地追加列标记。 3. 在初始化设置期间禁用或限制默认管理员凭证,以减少经过身份验证的攻击载体的暴露。