RuoYi-3.0代码审计

1 第三方组件漏洞审计

本项目使用Maven构建的。因此我们直接看pom.xml文件引入了哪些组件。通过IDEA打 开该若依,发现本项目采用了多模块方式。因此每个模块下都会有一个pom.xml,项目 最外层的pom.xml为父POM。我们可以通过 pom.xml 或者 External Libraries 来 确定引入组件的版本,具体整理如下:

组件名称组件版本是否存在漏洞
shiro1.4.0存在
thymeleaf2.0.0存在
druid1.1.10不存在
mybatis1.3.2不存在
bitwalker1.19不存在
kaptcha2.3.2不存在
swagger2.7.0不存在
framework2.0.5不存在
fastjson1.2.36存在

通过版本号进行初步判断后,我们还需再进一步验证

1.1 shiro反序列化漏洞

1.1.1 shiro密钥硬密码

通过查看pom.xml文件,我们了解到本套项目使用了Shiro组件。我们进一步查看Shiro配置文件时,发现了Shiro密钥硬编码写在了代码文件中。代码位于

D:\code\RuoYi-3.0\ruoyi-framework\src\main\java\com\ruoyi\framework\config\ShiroConfig.java

可以直接通过搜索关键字setCipherKey或CookieRememberMeManager,来看看密钥是否硬编码在了代码中,第331行。如下图所示:

1.1.2 Shiro反序列化漏洞

Apache Shiro框架提供了记住我的功能(RememberMe),用户登陆成功后会生成经过加密并编码的cookie。cookie的key为RememberMe,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的。在调用反序列化时未进行任何过滤,导致可以触发远程代码执行漏洞。 由于AES加解密的秘钥被硬编码在代码中,这意味着有权访问源代码的任何人都知道默认加密密钥是什么,因此,攻击者可以创建一个恶意对象并对其进行序列化,编码,然后将其作为cookie发送,然后Shiro将解码并反序列化,从而导致恶意代码执行。 通过查看pom.xml文件我们确定了Shiro版本为1.4.0。Shiro 1.4.2版本对于Shiro反序列化来说是个分水岭。由于CVE-2019-12422漏洞的出现,也就是Shiro Padding Oracle Attack漏洞。Shiro在1.4.2版本开始,由AES-CBC加密模式改为了AES-GCM。所以我们在做漏洞验证时,要将payload改成AES-GCM加密模式。

1.1.3 漏洞验证

既然已经得到了密钥为“fCq+/xW488hMTCD+cmJ3aQ==”,那这里就直接用工具打一波试试啦,试不出来再审代码。

1.2 swagger-ui.html接口文档

1.2.1 查看系统文档

1.2.2 点击List Operations 然后构造参数之后,再点击execute执行,拼接路径。

1.2.3 造成信息泄露,获取账号密码。

1.4 计的话就全局搜索:swagger-ui.html,存在的话看下路径然后访问下,看看有没有鉴权什么的。

2 任意文件下载

2.1 文件上传下载漏洞搜索关键词: download、upload、write、fileName、filePath

CommonController.java

2.2构建poc

common/download?filename=/../../../1.txt

3 sql注入

3.1 1 确定使用的持久层框架是mybaits还是Hibeinate或jdbc或自己封装的数据库框架

3.2 确定了使用的框架是mybatis,按照sql注入对应框架的手段全局关键字$检索

其中id为selectRoleList

3.3 继续向上回溯

-->SysRoleServiceImpl.java

3.4 寻找controller

3.5 /system/role/list 接口

3.6 构造数据包,回到文件SysRoleMappper.xml,最初发现的异常点是datascope参数,系统取params.dataScope 参数。

3.7 最后进行复现,执行延时注入

roleName=&roleKey=&status=&params[beginTime]=2022-07-05&params[dataScope]=and 1=2
union select 1,2,3,4,5,6,7,concat(0x7e,(select database()),0x7e),9&pageSize=10&pageNum=1&orderByColumn=roleSort&isAsc=asc

其他接口找寻方法与之类似。

/system/role/export

/system/user/list

/system/user/export

4 xss漏洞

4.1 全局搜索XSS关键字

查看是否设置了防XSS的过滤器且是否生效,如未设置相关的XSS全局过滤器或未开启过滤器或开启过滤器但排除了相关的API,或手动处理【基本遇不到】

总结:三个问题:(1)能否对所有场景的参数全部拦截过滤,比如springmvc注解、struts2接收参数以及fastjson,jackson以及两个框架封装的对象内的全部属性等 (2)系统生产环境是否真正的开启了过滤器,好多研发过滤器通过标识来配置。(3)过滤器是不是对所有的API进行作用,是不是存在不过过滤器的API。

特殊的情况:全局过滤器无法过滤上传文件中的内容,通过在后端读取文件内容后进行手动的编码处理。

4.2 随后便可以对漏洞进行复现

找到system/notice模块下的API入口进行黑盒验证

### Ruoyi-app 代码架构分析 #### 1. 整体项目结构概述 Ruoyi 是一款基于 Spring Boot 和 Vue 的开源前后端分离快速开发平台。其整体代码结构清晰,模块划分合理,便于扩展和维护。以下是 `ruoyi-app` 的主要模块及其功能描述: - **前端部分 (`ruoyi-ui`)** - 使用 Vue.js 构建的单页应用 (SPA),负责系统的界面展示与交互逻辑[^1]。 - **网关模块 (`ruoyi-gateway`)** - 提供 API 请求路由、权限校验等功能,运行于默认端口 `[8080]`[^1]。 - **认证中心 (`ruoyi-auth`)** - 负责用户的登录验证、Token 管理以及 OAuth2 集成,监听端口为 `[9200]`[^1]。 - **核心业务模块** - **系统模块 (`ruoyi-system`)**: 实现基础的功能管理,如用户、角色、菜单等,部署在 `[9201]` 上[^1]。 - **代码生成器 (`ruoyi-gen`)**: 动态生成 CRUD 页面及相关代码的服务,绑定到 `[9202]`。 - **定时任务 (`ruoyi-job`)**: 支持后台调度任务的执行与监控,启动端口为 `[9203]`[^1]。 - **文件服务 (`ruoyi-file`)**: 提供上传下载接口,支持多存储方式(本地/远程),工作在 `[9300]`[^1]。 - **公共组件库 (`ruoyi-common`)** - 包含多个子模块用于处理跨项目的通用需求: - **日志记录 (`ruoyi-common-log`)**: 统一的日志收集机制。 - **缓存服务 (`ruoyi-common-redis`)**: 利用 Redis 进行分布式会话共享和其他临时数据保存[^1]。 - **安全防护 (`ruoyi-common-security`)**: 加密解密算法封装及敏感操作保护措施。 #### 2. 关键技术点解析 ##### a) 微服务治理 通过引入 Sleuth 和 Zipkin 或 SkyWalking 工具链来完成请求跟踪与性能诊断,帮助开发者定位潜在瓶颈所在位置[^1]。 ##### b) 数据访问层设计模式 采用 MyBatis Plus 框架简化持久化操作流程,在 DAO 层定义 Mapper 接口即可自动生成对应 SQL 方法声明[^1]。 ```java @Mapper public interface SysUserMapper extends BaseMapper<SysUser> { } ``` 上述例子展示了如何利用 MP 自动生成针对实体类 `SysUser` 的增删改查方法。 ##### c) 安全控制策略 借助 Shiro 或 JWT 技术构建细粒度的安全体系,确保只有合法身份才能访问受保护资源[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值