问答
发起
提问
文章
攻防
活动
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, ![image-20240906203302275](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-5b3cf7d9505fd483dbe07f22dea38558bfb876e1.png) 点进去一看,不错就是Mybatis方式连接的数据库,要知道mybatis存在sql注入的方式那就是`${}`形式的非预编译参数拼接 ![image-20240906203441888](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-7961d2d96770cf6c652af7510ba1bb205a96a70e.png) 全局搜索`${`,发现在`GenTableMapper.xml`有一个createbale的方法是使用这样的形式 ![image-20240906203722584](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-ddcaca5d9f994b1b34b94b935d6a7337521f5609.png) 一般它的Mapper接口都是在对应的mapper层中,接着找到对应的Mapper接口即GenTableMapper ![image-20240906204052577](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-43ce66918183afe8f295726ce35f083bc8afec26.png) 进入该接口中全局搜索`createTable`找到了该方法 ![image-20240906204217212](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-4fd24fc7800a2a957b1c631c238955b5865be87d.png) 接着我们`Ctrl`点击方法名,找到了对应的Service实现类中有个createTable方法调用了该方法 ![image-20240906204302983](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-69bc3074d2ddc4a8c5b5c1e1b42c8d57ba5c3039.png) 继续`Ctrl`点击,我们来到了`GenController`中这里有`createTableSave`方法调用了Service层的createTable方法 ![image-20240906204643261](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-3f8348b4c26a5840fd7da595c48fbac7ae8ff486.png) 我们分析一下该代码:首先这个`@PreAuthorize`规定了权限必须是admin才可以,那么我们也就只能登录后台管理系统才可以,同时`@PostMapping`这是属于post方式请求,接着进入到方法中,首先是对参数sql调用了`filterKeyword`方法,这似乎是一个sql语句过滤操作,接着就是调用`parseStatements`解析sql语句,因为是允许多条sql语句的,因此for循环遍历每条sql语句,依次判断是否归属于`MySqlCreateTableStatement`类属性,接着就是if语句的`enTableService.createTable()`方法的调用进行sql语句的执行操作,接着就是获取创建的表名,并移除反引号以及将表名添加到`tableNames`列表等操作。 接着我们进入到`filterKeyword`方法中 ![image-20240906205644407](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-7cc073e495df82889064b8558944dd504512d0e9.png) **分析**:该方法对参数进行非空判断,之后将我们的`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](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-5ba205597bb48eacaffc3c05b85f0158d1a4a1a9.png) ![image-20240906202015154](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-920ef049beed2e21543c6f571159d19b6cf08c83.png) 进入到该路由下`http://localhost:84/tool/gen`,点击创建表 poc如下 CREATE TABLE xiao1star AS SELECT/\*\*/ VERSION(); ![image-20240906211015801](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-4b048092870671fe88445beed42e0401a79e9106.png) 发现有报错信息提示创建表结构异常 ![image-20240906211037521](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-5744c4c144cb8e833e605ae0429202302790f963.png) 但是查看数据库发现成功创建了xiao1star这张表并且lock\_name写的是数据库的版本 ![image-20240906201426361](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-92e98f6a749d108bb04c69a398ba43705be004e0.png) ![image-20240906201436136](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-26e51ecae9f2200a5c3a93006bc78961ef09a6b4.png) 但是为什么会显示创建表结构异常呢,我们看看idea的报错 ![image-20240906202810628](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-a5207725232d65c21aa87662e645e9b2204eab7d.png) 报错中有这样的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](https://shs3.b.qianxin.com/attack_forum/2024/09/attach-cd98327c1ef88ee8bd89d176fba4819977b1c3bb.png)
发表于 2024-09-10 09:00:01
阅读 ( 3581 )
分类:
CMS
1 推荐
收藏
0 条评论
请先
登录
后评论
xhys
11 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!