正在按部就班,循序渐进
火热练习ing......
关注我们,时刻跟着学习。
下文配套的练习环境版本
可从文末处获取。
一、项目简介
RuoYi 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Apache Shiro、MyBatis、Thymeleaf、Bootstrap),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、通知公告等。在线定时任务配置;支持集群,支持多数据源,支持分布式事务。
内置功能详解如下:
-
用户管理:用户是系统操作者,该功能主要完成系统用户配置。
-
部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。
-
岗位管理:配置系统用户所属担任职务。
-
菜单管理:配置系统菜单,操作权限,按钮权限标识等。
-
角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
-
字典管理:对系统中经常使用的一些较为固定的数据进行维护。
-
参数管理:对系统动态配置常用参数。
-
通知公告:系统通知公告信息发布维护。
-
操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
-
登录日志:系统登录日志记录查询包含登录异常。
-
在线用户:当前系统中活跃用户状态监控。
-
定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。
-
代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。
-
系统接口:根据业务代码自动生成相关的api接口文档。
-
服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。
-
缓存监控:对系统的缓存查询,删除、清空等操作。
-
在线构建器:拖动表单元素生成相应的HTML代码。
-
连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。
若依官方网站:
http://www.ruoyi.vip/
二、项目搭建
1、环境要求
JDK >= 1.8 (推荐1.8版本)
Mysql >= 5.7.0 (推荐5.7版本)
Maven >= 3.0
2、Windows环境的项目部署流程
基于windows10操作系统。
①、命令行进入Mysql,创建数据库名为ry
,并切换使用该数据库。
create datavase ry; 创建名为ry的数据库
use ry; 切换使用ry数据库
②、将项目文件中的/sql/ry_20200323.sql
的数据导入到ry
数据库,注意导入路径中应使用正斜杠/
。
source /绝对路径/sql/ry_20200323.sql; 导入数据库文件
③、使用IDEA打开本项目,等待Maven自动加载依赖项,如果时间较长需要自行配置Maven加速源。几个现象表明项目部署成功。pom.xml
文件无报错,项目代码已编译为class
,Run/Debug Configurations...
处显示可以运行。
④、修改srcmainresourcesapplication-druid.yml
配置文件内容,主要修改数据库连接地址,如下图所示:
⑤、点击启动Run/Debug Configurations...
本项目。
⑥、项目访问地址如下:
-
后台地址:
http://127.0.0.1:8088/login
记得自己配下端口号,默认的是80端口。
⑦、登录账号密码adminadmin123
。
3、Linux环境的项目部署流程
基于VMware虚拟机中的搭建的Ubuntu20操作系统
注意:以下步骤需要Ubuntu系统中安装所需的软件,可参考星球之前发的一篇文章:https://t.zsxq.com/Ea6qF6Y
本项目的默认打包方式就是JAR形式。并且本项目构建为SpringBoot多模块形式。我们所需要的运行的Jar程序打包在了RuoYi-v4.2/ruoyi-admin/target
目录下。
整体部署流程如下:
①、使用IDEA打开项目,我们修改一下数据源链接地址。如下图所示:
我为了方便,将数据源直接连接到了Windows下的Mysql,也就是PHPstaduy一键启动的。如果你也想这样做,请注意以下几点:
-
宿主机和虚拟机需要在同一网段下,简单来说就是能互相ping通。
-
Mysql启用远程访问,命令如下:
GRANT ALL PRIVILEGES ON *.* ‘root’@’%’ identified by ‘root’ WITH GRANT OPTION;
flush privileges;
②、使用Maven打包项目,选择若依总项目,依次点击clean
和package
,如下图所示:
③、我们将最终生成的ruoyi-admin.jar
文件,复制粘贴Vmware虚拟中的Ubuntu桌面。
④、下一步,我们打开命令行,CD进入Desktop,使用sudo java -jar ruoyi-admin.jar
运行项目。启动成功如下图所示:
⑤、最后我们就可以正常访问了。
⚠️注意:
-
java -jar
启动若依项目需要管理员权限,因此要在前面加上sudo
,如果报错说找不到命令。需要修改/etc/sudoers
文件中Defaults secure_path
位置,在后面加上java路径,如下图所示:
sudo vim /etc/sudoers 打开该文件
-
如果想要在其他环境中访问ruoyi,需要关闭防火墙,或者激活特定端口。偷个懒,直接关闭防火墙。
sudo ufw disable 关闭防火墙
3、单点漏洞审计
3.2、Shiro密钥硬编码代码审计
通过查看pom.xml文件,我们了解到本套项目使用了Shiro组件。我们进一步查看Shiro配置文件时,发现了Shiro密钥硬编码写在了代码文件中。代码位于
RuoYi-v4.2ruoyi-frameworksrcmainjavacomruoyiframeworkconfigShiroConfig.java
第331行。如下图所示:
在黑盒测试中,我们常使用爆破的方式来探测目标是否使用了常见的弱密钥。
但在代码审计我们可以直接通过搜索关键字setCipherKey
,来看看密钥是否硬编码在了代码中。
攻击者在知道了密钥后,就可以构造恶意payload,经过序列化、AES加密、base64编码操作加工后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞,进而在目标机器上执行任意命令。
既然我们从代码处知道了密钥,那么我们就可以直接对他进行反序列化攻击了。
四、渗透测试漏洞挖掘
2、Shiro反序列化漏洞验证
2.1、漏洞简述
Apache Shiro框架提供了记住我的功能(RememberMe),用户登陆成功后会生成经过加密并编码的cookie。cookie的key为RememberMe,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的。在调用反序列化时未进行任何过滤,导致可以触发远程代码执行漏洞。
尽管官方更新了很多版本,但还是没有将反序列化的本身问题解决。后续版本使用了每次生成一个密钥的方法来解决该漏洞。但是由于开源系统,或者教学代码范例常将弱密钥硬编码等原因,因此导致很多开发人员疏忽,经验不足而导致该问题的产生。
通过查看pom.xml文件我们确定了Shiro版本为1.4.2
。Shiro 1.4.2
版本对于Shiro反序列化来说是个分水岭。由于CVE-2019-12422漏洞的出现,也就是Shiro Padding Oracle Attack漏洞。Shiro在1.4.2版本开始,由AES-CBC
加密模式改为了AES-GCM
。所以我们在做漏洞验证时,要将payload改成AES-GCM
加密模式。
2.2、漏洞验证
在黑盒测试中,我们可以在Cookie中添加rememberMe=123
,如果响应Set-Cookie
头返回rememberMe=deleteMe
,那么就可可以确定该系统使用了Shiro框架。如下图所示:
下面我们使用攻击脚本进行漏洞验证,该脚本在已添加至附件中。
【欢迎加入炼石计划,解锁该部分,跟着大家一起学习~】
第五套若依系统代码审计正按部就班火热练习中,本次练习真的力荐,各种高危漏洞等你学习。如果大家想循序渐进跟着学习JavaWeb代码审计,欢迎扫码加入炼石计划。
想要学习若依后面完整版代码审计教程,欢迎加入炼石计划。
【炼石计划加入方式】
现加入炼石计划知识星球价格为99元一年,自加入起计算。随着课程有序推进,价格只增不减。现在投资自己最为合适。
点击下方链接获取【前八套】练习环境
50套JavaWeb代码审计【前八套】练习环境分享给你,内附配套代码审计教程。
内含本文【若依管理系统】
以及前几套练习环境对应代码审计文章
原文始发于微信公众号(哈拉少安全小队):Shiro1.4.2后用了AES-GCM加密,代码审计中发现硬编码密钥,我们应该这么做
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论