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.JimuReportTokenInterceptor
    • org.jeecg.modules.jmreport.desreport.service.a.f

漏洞详细分析

1. 拦截器流程

漏洞存在于Spring MVC拦截器的preHandle方法中,主要逻辑如下:

  1. 首先检查用户是否登录(var10变量)
  2. 如果未登录,进入isSharingEffective检查
  3. 从GET参数获取previousPage参数并通过j.d()方法校验
  4. 调用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;
    }
}

问题细节:

  1. j()方法存在方法重载问题:

    • c(String var0)c(Object var0)两个版本
    • JmReport-Share-Token头存在时,仍会获取shareToken参数并覆盖var3
    • 如果shareToken为空,不会立即返回false,而是继续执行
  2. 数据库查询结果处理缺失:

    • getShareByShareToken返回null时没有处理逻辑
    • 方法默认返回true,导致权限绕过

2.2 j.d()方法问题

// previousPage参数校验方法
j.d() {
    // 字符串分割逻辑
    // 长度<3: 转为小写输出
    // 长度≥3: 检测大写字符并加入_分割
    // 只要previousPage不为空即可通过
}

漏洞利用条件

  1. 系统处于未登录状态
  2. 能够控制HTTP请求中的:
    • previousPage GET参数
    • JmReport-Share-Token头或shareToken参数

漏洞修复方案

1.8.0版本修复措施

  1. 修改j()方法中的c方法调用:

    • 改为使用OkConvertUtils.isEmpty
    • 该方法实质上是原c(Object var0)方法
  2. 增加对数据库查询结果为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. 立即升级到1.8.0或更高版本
  2. 如果无法立即升级,可考虑以下临时措施:
    • 自定义拦截器加强Token验证
    • previousPageshareToken参数进行严格校验
  3. 实施权限验证的深度防御策略,不依赖单一验证机制

总结

该漏洞源于Token验证逻辑中的多个缺陷组合,包括方法重载导致的参数覆盖、空值处理不严格以及数据库查询结果验证缺失。修复方案通过统一使用安全的空值检查方法和增加必要的验证逻辑,有效堵住了权限绕过的可能性。

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