漏洞分析 | Apache OFBiz XML-RPC 反序列化漏洞(CVE-2023-49070)

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接口的认证
有了这两个绕过,最新的漏洞重新变回一个Pre-Auth RCE漏洞。

▌漏洞分析

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的环境。

 

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”获取相关攻击模拟验证动作,从而验证您的安全防御体系是否能够有效应对该漏洞,平台以业界独有方式确保您的验证过程安全无害。

 

参考来源:

https://github.com/apache/ofbiz-framework
https://mp.weixin.qq.com/s/iAvitO6otPdHSu1SjRNX3g
https://issues.apache.org/jira/browse/OFBIZ-12812
https://github.com/advisories/GHSA-6vwp-35w3-xph8