Apache OFBiz是一个电子商务平台,用于构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类应用系统。
2023年12月,官方发布新版本修复了CVE-2023-49070 Apache Ofbiz xmlrpc 代码执行漏洞。官方已于4月主分支代码中删除XML-RPC组件,但直至18.12.10正式发布才废除XML-RPC接口。攻击者能够利用该漏洞获取服务器权限,建议尽快修复漏洞。
▌漏洞详情
早在2020年,Apache OFBiz就曾出现过一个反序列化漏洞(CVE-2020-9496),问题出现在XML-RPC这个组件中。XML-RPC也是Apache基金会旗下的一个项目,但基本上在2010年前后就不更新了,XML-RPC在历史上出现过多个反序列化漏洞(如CVE-2016-5003、CVE-2019-17570),都没有被修复。
由于Apache OFBiz使用了XML-RPC组件,受到了影响。官方于后续的版本中对相关接口进行加固修复漏洞,但修复方法存在绕过问题(CVE-2023-49070)。
在CVE-2020-9496中,通过向/webtools/control/xmlrpc接口发送包含XML格式的RPC请求体的数据包进行漏洞利用。其中这个对象中包含了base64格式的Payload:
2020年5月,漏洞出现后,OFBiz官方在https://github.com/apache/ofbiz-framework/commit/d955b03fdc226d600d81d19d273e773f84b5c000这个commit中提交了第一次补丁,这个补丁的作用是为XML-RPC的接口增加鉴权:
这个补丁并不能完全解决问题,但提高了漏洞利用门槛,不再是一个“Pre-Auth RCE”漏洞。
在2021年10月,一个叫Jie Zhu的人向官方反应了这个“Post-Auth RCE漏洞”,可以在当时最新的17.12.08版本上复现。由于这个漏洞本不是OFBiz导致,而且XML-RPC不再维护,所以无法从根本上修复这个漏洞。
官方只能退而求其次,在https://github.com/apache/ofbiz-framework/commit/d6d863020c0fe89f949e5d2cd23d5ecc95d68c4c使用filter的方式对请求做了一次检测,只要发现Body中存在这个关键字就报错:
这个修复方法很快被Jie Zhu绕过,因为攻击者可以增加一个空格,使用的方式绕过检测。
于是,官方在 https://github.com/apache/ofbiz-framework/commit/25293e4cf6f334a2ae33b3041acba45113dddce9 这个提交中再次进行加固,将检测关键词更改为, 并且将检测位置修改到了framework/base/src/main/java/org/apache/ofbiz/base/util/CacheFilter.java文件中:
但这种直接检查请求体中存在字符串就报错的方式也存在一个问题,就是会影响到正常业务中包含字符串请求,所以官方在https://github.com/apache/ofbiz-framework/commit/a5bdcc6f9ea59d5d614f64832d5b6acec8e81e97中增加了对请求路径的限制:
同一天,官方又发现接口限制路径不正确,所以又在https://github.com/apache/ofbiz-framework/commit/19d29325910ee2c904b63a951437aa59f73f1d93中做了修改:
而最新的CVE-2023-49070就是对上述官方提供的加固方式进行了绕过:
-
绕过对于这个关键词的检测 -
绕过对XML-RPC接口的认证
▌漏洞分析
1. 绕过检测
首先需要绕过这个关键词的检测。在Java中,部分中间件如Tomcat可以通过 ; 的方式可以在请求路径中增加Matrix Parameters:https://www.baeldung.com/cs/url-matrix-vs-query-parameters。
所以,我们也可以尝试在XML-RPC请求的路径中增加分号:/webtools/control/xmlrpc;/。
第一个限制绕过,服务器返回了登录页面。
2. 绕过认证的限制
在检查用户是否登录方法中(org.apache.ofbiz.webapp.control.LoginWorker#checkLogin),有一个很关键的判断 “error”.equals(login(request, response))
当login()方法的返回值不等于error时就能不进入if语句从而绕过return “error”,使检查用户登陆方法返回success。
而在login()方法中有这样几行:
由于username、password、token这些参数是从session中取的,在未登录时为空,所以requirePasswordChange这个参数的值如果等于Y,login()方法就能返回requirePasswordChange,否则返回error。
3. 结论
综上所述,只要将请求路径修改为/webtools/control/xmlrpc;/?USERNAME=&PASSWORD=&requirePasswordChange=Y ,即可绕过权限检测和关键词限制。
▌漏洞复现
1. 靶场环境搭建
-
使用docker启动ofbiz:18.12.09的环境。
-
在等待数分钟后,访问https://localhost:8443/accounting查看到登录页面,说明环境已启动成功。
2.Payload生成
使用ysoserial的CommonsBeanutils1来生成Payload:
3.测试
使用CVE-2020-9496中的复现方法发送数据包,可见已经无法成功进入XMLRPC的解析流程:
把Path修改成/webtools/control/xmlrpc;/?USERNAME=&PASSWORD=&requirePasswordChange=Y即可绕过限制:
进入容器中,可见touch /tmp/success已成功执行:
▌塞讯验证规则
12月28日,针对该漏洞的攻击模拟已经加入到塞讯安全度量验证平台中,您可以在塞讯安全度量验证平台中搜索关键词“Apache OfBiz”或“CVE-2023-49070”获取相关攻击模拟验证动作,从而验证您的安全防御体系是否能够有效应对该漏洞,平台以业界独有方式确保您的验证过程安全无害。
参考来源: