若依管理系统是一个后台管理系统,基于经典技术组合(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就打不通了
12 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!