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 可能会导致严重后果。