Weblogic CVE-2019-2725補丁JDK1.6繞過分析

前言

簡單的水一篇

這兩天網上公佈了CVE-2019-2725的補丁使用array標籤+method屬性來獲取Class的繞過,這裏簡單分析一下。

由於JDK1.7以上的XMLDecoder對每種標籤支持的屬性有嚴格的限制,所以此方法只適用於JDK1.6。

看本文之前建議先了解一下XMLDecoder的解析流程。

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函數調用,開頭流程如下:

  1. 初始化屬性HashMap。
  2. 創建MutableExpression對象,有關Expression看下這裏,簡單來說就是可以用類似表達式的形式來調用構造方法、數組讀寫、類函數的類。
  3. 遍歷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對象,最後進行實例化,此處就不說了。
在這裏插入圖片描述

結尾

水水更健康。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章