问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
CVE-2024-42913:若依管理系统sql注入黑名单绕过漏洞分析
漏洞分析
CVE-2024-42913:若依管理系统sql注入黑名单绕过漏洞分析
CVE-2024-42913:若依管理系统sql注入黑名单绕过漏洞分析 =================================== 产品介绍 ---- 若依管理系统是一个后台管理系统,基于经典技术组合(Spring Boot、Apache Shiro、MyBatis、Thymeleaf)主要目的让开发者注重专注业务,降低技术难度,从而节省人力成本,缩短项目周期,提高软件安全质量。 影响版本 ---- <= v4.7.8 漏洞分析 ---- 简单地翻了翻项目结构,发现有相关的Mapper.xml,不出以为的话连接数据库的方式是Mybatis,  点进去一看,不错就是Mybatis方式连接的数据库,要知道mybatis存在sql注入的方式那就是`${}`形式的非预编译参数拼接  全局搜索`${`,发现在`GenTableMapper.xml`有一个createbale的方法是使用这样的形式  一般它的Mapper接口都是在对应的mapper层中,接着找到对应的Mapper接口即GenTableMapper  进入该接口中全局搜索`createTable`找到了该方法  接着我们`Ctrl`点击方法名,找到了对应的Service实现类中有个createTable方法调用了该方法  继续`Ctrl`点击,我们来到了`GenController`中这里有`createTableSave`方法调用了Service层的createTable方法  我们分析一下该代码:首先这个`@PreAuthorize`规定了权限必须是admin才可以,那么我们也就只能登录后台管理系统才可以,同时`@PostMapping`这是属于post方式请求,接着进入到方法中,首先是对参数sql调用了`filterKeyword`方法,这似乎是一个sql语句过滤操作,接着就是调用`parseStatements`解析sql语句,因为是允许多条sql语句的,因此for循环遍历每条sql语句,依次判断是否归属于`MySqlCreateTableStatement`类属性,接着就是if语句的`enTableService.createTable()`方法的调用进行sql语句的执行操作,接着就是获取创建的表名,并移除反引号以及将表名添加到`tableNames`列表等操作。 接着我们进入到`filterKeyword`方法中  **分析**:该方法对参数进行非空判断,之后将我们的`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`下   进入到该路由下`http://localhost:84/tool/gen`,点击创建表 poc如下 CREATE TABLE xiao1star AS SELECT/\*\*/ VERSION();  发现有报错信息提示创建表结构异常  但是查看数据库发现成功创建了xiao1star这张表并且lock\_name写的是数据库的版本   但是为什么会显示创建表结构异常呢,我们看看idea的报错  报错中有这样的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就打不通了 
发表于 2024-09-10 09:00:01
阅读 ( 10456 )
分类:
CMS
3 推荐
收藏
0 条评论
请先
登录
后评论
xhys
12 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!