Jimureport1.7.8越权漏洞代码分析及修复代码分析(CVE-2024-44893)
字数 1203 2025-08-29 08:30:05
Jimureport 1.7.8 越权漏洞分析及修复指南 (CVE-2024-44893)
漏洞概述
Jimureport 1.7.8 版本中存在一个权限绕过漏洞,攻击者可以在未登录状态下通过特定方式绕过Token验证机制,访问受限资源。
漏洞环境
- 受影响组件:jimureport-spring-boot-starter.jar
- 相关类:
org.jeecg.modules.jmreport.config.firewall.interceptor.JimuReportTokenInterceptororg.jeecg.modules.jmreport.desreport.service.a.f
漏洞详细分析
1. 拦截器流程
漏洞存在于Spring MVC拦截器的preHandle方法中,主要逻辑如下:
- 首先检查用户是否登录(
var10变量) - 如果未登录,进入
isSharingEffective检查 - 从GET参数获取
previousPage参数并通过j.d()方法校验 - 调用
isShareingToken方法进行Token验证
2. 关键漏洞点
2.1 Token验证逻辑缺陷
isShareingToken方法中存在以下问题:
// 原始漏洞代码
public boolean isShareingToken(HttpServletRequest var1) {
String var3 = this.j(var1.getHeader("JmReport-Share-Token"));
if (var3 == null) {
var3 = this.j(var1.getParameter("shareToken"));
}
if (var3 == null) {
return false;
} else {
// 查询数据库
Object var10 = this.getShareByShareToken(var3);
// 缺少对var10为null的处理
return true;
}
}
问题细节:
-
j()方法存在方法重载问题:- 有
c(String var0)和c(Object var0)两个版本 - 当
JmReport-Share-Token头存在时,仍会获取shareToken参数并覆盖var3 - 如果
shareToken为空,不会立即返回false,而是继续执行
- 有
-
数据库查询结果处理缺失:
getShareByShareToken返回null时没有处理逻辑- 方法默认返回true,导致权限绕过
2.2 j.d()方法问题
// previousPage参数校验方法
j.d() {
// 字符串分割逻辑
// 长度<3: 转为小写输出
// 长度≥3: 检测大写字符并加入_分割
// 只要previousPage不为空即可通过
}
漏洞利用条件
- 系统处于未登录状态
- 能够控制HTTP请求中的:
previousPageGET参数JmReport-Share-Token头或shareToken参数
漏洞修复方案
1.8.0版本修复措施
-
修改
j()方法中的c方法调用:- 改为使用
OkConvertUtils.isEmpty - 该方法实质上是原
c(Object var0)方法
- 改为使用
-
增加对数据库查询结果为null的处理:
if (var10 == null) { return false; }
修复代码示例
// 修复后的isShareingToken方法
public boolean isShareingToken(HttpServletRequest var1) {
String var3 = this.j(var1.getHeader("JmReport-Share-Token"));
if (OkConvertUtils.isEmpty(var3)) {
var3 = this.j(var1.getParameter("shareToken"));
}
if (OkConvertUtils.isEmpty(var3)) {
return false;
} else {
Object var10 = this.getShareByShareToken(var3);
if (var10 == null) {
return false;
}
return true;
}
}
安全建议
- 立即升级到1.8.0或更高版本
- 如果无法立即升级,可考虑以下临时措施:
- 自定义拦截器加强Token验证
- 对
previousPage和shareToken参数进行严格校验
- 实施权限验证的深度防御策略,不依赖单一验证机制
总结
该漏洞源于Token验证逻辑中的多个缺陷组合,包括方法重载导致的参数覆盖、空值处理不严格以及数据库查询结果验证缺失。修复方案通过统一使用安全的空值检查方法和增加必要的验证逻辑,有效堵住了权限绕过的可能性。