CVE-2024-42913:若依管理系统sql注入黑名单绕过漏洞分析

CVE-2024-42913:若依管理系统sql注入黑名单绕过漏洞分析

CVE-2024-42913:若依管理系统sql注入黑名单绕过漏洞分析

产品介绍

若依管理系统是一个后台管理系统,基于经典技术组合(Spring Boot、Apache Shiro、MyBatis、Thymeleaf)主要目的让开发者注重专注业务,降低技术难度,从而节省人力成本,缩短项目周期,提高软件安全质量。

影响版本

<= v4.7.8

漏洞分析

简单地翻了翻项目结构,发现有相关的Mapper.xml,不出以为的话连接数据库的方式是Mybatis,

image-20240906203302275

点进去一看,不错就是Mybatis方式连接的数据库,要知道mybatis存在sql注入的方式那就是${}形式的非预编译参数拼接

image-20240906203441888

全局搜索${,发现在GenTableMapper.xml有一个createbale的方法是使用这样的形式

image-20240906203722584

一般它的Mapper接口都是在对应的mapper层中,接着找到对应的Mapper接口即GenTableMapper

image-20240906204052577

进入该接口中全局搜索createTable找到了该方法

image-20240906204217212

接着我们Ctrl点击方法名,找到了对应的Service实现类中有个createTable方法调用了该方法

image-20240906204302983

继续Ctrl点击,我们来到了GenController中这里有createTableSave方法调用了Service层的createTable方法

image-20240906204643261

我们分析一下该代码:首先这个@PreAuthorize规定了权限必须是admin才可以,那么我们也就只能登录后台管理系统才可以,同时@PostMapping这是属于post方式请求,接着进入到方法中,首先是对参数sql调用了filterKeyword方法,这似乎是一个sql语句过滤操作,接着就是调用parseStatements解析sql语句,因为是允许多条sql语句的,因此for循环遍历每条sql语句,依次判断是否归属于MySqlCreateTableStatement类属性,接着就是if语句的enTableService.createTable()方法的调用进行sql语句的执行操作,接着就是获取创建的表名,并移除反引号以及将表名添加到tableNames列表等操作。

接着我们进入到filterKeyword方法中

image-20240906205644407

分析:该方法对参数进行非空判断,之后将我们的SQL_REGEX常量以|分割开来赋值给sqlKeywords数组,接着就是对数组依次遍历查看参数中是否存在数组中的相关字符串,若存在就会抛出异常

public static String SQL_REGEX = "and |extractvalue|updatexml|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |+|user()";

上面是我们的常量,我们发现对我们大部分的sql注入的敏感内容进行了限制,但是可以利用可根据MySQL的特性绕过,像使用/**/注释符我们可以利用这个来绕过滤

利用注释符构造poc如下,这段poc的意思是创建一个新表xiao1star,并将数据库的版本信息作为一行数据插入到这个新表中。

CREATE TABLE xiao1star AS SELECT/**/ VERSION();

漏洞复现

根据GenController.java中相关路由注解我们了解到漏洞点在/tool/gen/createTable

image-20240906201948940

image-20240906202015154

进入到该路由下http://localhost:84/tool/gen,点击创建表

poc如下

CREATE TABLE xiao1star AS SELECT/**/ VERSION();

image-20240906211015801

发现有报错信息提示创建表结构异常

image-20240906211037521

但是查看数据库发现成功创建了xiao1star这张表并且lock_name写的是数据库的版本

image-20240906201426361

image-20240906201436136

但是为什么会显示创建表结构异常呢,我们看看idea的报错

image-20240906202810628

报错中有这样的sql语句

select table\_name, table\_comment, create\_time, update\_time from information\_schema.tables where table\_name NOT LIKE 'qrtz\\\_%' and table\_name NOT LIKE 'gen\\\_%' and table\_schema \= (select database()) and table\_name in

似乎是问题出现在GenTableMapper.xml文件中的相关SQL映射,似乎有些SQL语句不是完整的,或者有的括号不是正确闭合。如果IN子句后面应该跟一个列表或者子查询,需确保这个列表或者子查询被正确地包含在SQL语句中。但是要知道我们的漏洞点中的sql语句完全是由用户控制的,没有这样的语句,作者就不仔细去追究了

修复方式

升级至最新版

目前的最新版本是v4.7.9,我们发现在最新版本的黑名单中增加了like*/,那么我们上面的poc就打不通了

图片.png

  • 发表于 2024-09-10 09:00:01
  • 阅读 ( 12568 )
  • 分类:CMS

0 条评论

请先 登录 后评论
xhys
xhys

12 篇文章

站长统计