ofbiz-CVE-2023-51467
ofbiz-CVE-2023-51467
0x01 漏洞介绍
ofbiz-18.12.10及以前,鉴权绕过使用execute()方法执行外部命令。
poc
1 | |
代码没有对Groovy脚本,execute()方法进行过滤。
最新版修了鉴权绕过,命令执行没有修复。
0x02 命令过滤
在路径framework/security/config/security.properties 里面存在命令黑名单。
1 | |
限制也不多,也可以直接使用unicode编码就可以绕过。
0X03 Groovy分析
apache-ofbiz-18.12.11/framework/webtools/webapp/webtools/WEB-INF/controller.xml
412-416行
1 | |
可以看到是view类型
652行写着对应配置位置
1 | |
apache-ofbiz-18.12.11/framework/webtools/widget/EntityScreens.xml
74-96行
1 | |
可以看见调用了
/webtools/groovyScripts/entity/ProgramExport.groovy
56-73行
1 | |
从groovyProgram获取参数然后执行。
org/apache/ofbiz/base/util/GroovyUtil.java

这个回去去上面的配置,然后执行。
0x04 鉴权绕过分析
org/apache/ofbiz/webapp/control/LoginWorker.java#checkLogin


就是不满足if就可以返回success。
1 | |

username,password,token可控,可以构造。
看login(request, response)就行
java/org/apache/ofbiz/webapp/control/LoginWorker.java#login()

判断username,password,token是否为null,不为null就是赋予值。
然后判断非空,不为空就赋予值
然后username,password,token非否为空,为空就在数组unpwErrMsgList加入数据。

最重要的就是这里。
unpwErrMsgList只要不为空就进入if。然后requirePasswordChange可控,传入Y就可以返回suceess。

然后不满足”error”.equals(login(request, response)),最后返回checkLogin()函数返回success,绕过鉴权。
最后构造poc。不赋值获取到的是””,不是NULL,””不等于NULL,为false,但使用isNotEmpty()判断时是true。
1 | |
0x05 复现
1 | |
对open -a calculator

对Reverse Shell进行unicode编码进行测试。
先对Reverse Shell转换成java可以识别的形式
1 | |
1 | |
在使用unicode编码
1 | |
成功获取shell

声明
此文章 仅用于教育目的。请负责任地使用它,并且仅在您有明确测试权限的系统上使用。滥用此 PoC 可能会导致严重后果。