apache-ofbiz-CVE-2023-51467漏洞分析
漏洞简介
Apache OFBiz是一套足够灵活的业务应用程序,可以在任何行业中使用。通用架构允许开发人员轻松扩展或增强它以创建自定义功能。
该漏洞存在于apache-ofbiz产品18.12.11版本以下版本。利用该漏洞的攻击者可能会绕过身份验证来实现RCE。
影响范围
Apache-Ofbiz < 18.12.11
漏洞分析
认证绕过
通过版本分析,发现新版本主要修改有两个位置,一个是去掉了url中的..
符号。我们都知道,这个符号通常用来表示上级目录。
另一个是修改了判断账号密码的方式。
可以看到,在旧版本中使用了==
来比较密码username、password、token等变量是否为空。
然而,编码语言的等号运算又有强弱之分。==
属于弱相等,特点如下:
1.如果两个值具有相同的类型,那么就检测它们的等同性。如果这两个值完全相同,它们就相等。如果它们不完全相同,则它们不相等。
2.如果两个值的类型不同,它们仍然可能相等。用下面的规则和类型转换来检测它们的相等性:
01.如果一个值是null,另一个值是undefined,它们相等。
02.如果一个值是数字,另一个值是字符串,把字符串转换为数字,再用转换后的值进行比较。
03.如果一个值为true,将它转化为1,再进行比较。如果一个值为false,把它转化为0,再进行比较。
04.如果一个值是对象,另一个值是数字或字符串,将对象转换成原始类型的值,再做比较。可以使用对象的toString()方法或 valueOf()方法把对象转化成原始类型的值。JavaScript核心语言的内部类通常先尝试valueOf()方法转换,再尝试toString()方法转换,但是对于Date类,则先执行toString()方法再执行valueOf()方法转换。
那么,旧版本的判断方法,是存在绕过可能。
当然,认证绕过的关键并不是这几个参数,我们接着往下看。修改点涉及认证的几个函数:checkLogin、login。
最关键的修改点是函数的返回值,如下位置:
看看变量requirePasswordChange
是怎么来的。类型为布尔类型,从web请求同名参数中获取。也就是说我们可以直接控制。那么我们也就可以控制login函数的返回值了。
每次访问需要授权的后台接口时,都会通过checkLogin进行权限检查。如果账号密码的值为null,login的返回结果不等于"error"
,就跳过了认证检查。
通过前边的分析,我们完全可以控制这里参与的所有变量。
其实username、password直接留空,值为空,就可以使条件判断为false,设置requirePasswordChange为Y,就可以直接走下边的代码流程,最终返回success
命令执行
有了认证绕过,就可以访问后台所有的接口功能了。这个应用后台漏洞挺多的,有SSRF、任意代码执行等等。这里直接挑一个最严重的任意代码执行导致任意命令执行漏洞分析。
在后台web管理工具-> 导入/导出 -> 编程导出
处,可知执行受限的Groovy代码。截图中看到并没有什么限制,那么我为什么说受限那?
先来执行个系统命令看看,弹个计算机是没问题的。实战中,不可能只运行计算机吧?
当我执行whoami的时候,报错了。
通过一番代码跟踪,发现系统对执行的代码进行了一些限制。代码中不能出现以下单词。其实绕过也很简单,只需要进行unicode编码即可。
漏洞复现
修复建议
更新至最新版本:
https://ofbiz.apache.org/download.html
原文始发于微信公众号(闲聊知识铺):apache-ofbiz-CVE-2023-51467漏洞分析
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论