Java審計之CMS中的那些反序列化漏洞

nice_0e3發表於2021-02-18

Java審計之CMS中的那些反序列化漏洞

0x00 前言

過年這段時間比較無聊,找了一套原始碼審計了一下,發現幾個有意思的點拿出來給分享一下。

0x01 XStream 反序列化漏洞

下載原始碼下來發現並不是原始碼,而是一個的資料夾,裡面都已經是編譯過的一個個class檔案。

在一個微信回撥的路由位置裡面找到通過搜尋類名 Serialize關鍵字找到了一個工具類,並且引數是可控的。

這裡呼叫xstream.fromXML(xml)進行反序列化。

而下面這個看了一下lib資料夾下面的元件其實是有著cc cb等元件,並且這個元件的反序列化漏洞是在版本範圍內。

找到路由位置,發現訪問頁面的時候顯示API 什麼的錯誤。POC打過去沒有任何響應。這個點弄了比較久沒弄出來,暫且留著。

0x02 Shiro反序列化漏洞

上次的點沒弄出來後,開始轉換思路。再次從web.xml入手

發現這裡載入了一下配置檔案,從中還發現了shiro的配置檔案,前面還真沒注意到。

並且在lib的元件找到了這個shiro元件,但是發現這個是1.3版本的。而shiro 550漏洞的版本是在1.2.4,但是問題就來了,不在漏洞版本內就是不能打了嘛?其實不是的。

Shiro 1.2.4及之前的版本中,AES加密的金鑰預設硬編碼在程式碼裡(SHIRO-550),Shiro 1.2.4以上版本官方移除了程式碼中的預設金鑰,要求開發者自己設定,如果開發者沒有設定,則預設動態生成,降低了固定金鑰洩漏的風險。

回頭再來看看上次分析的shiro550的細節

這裡key是定義在程式碼裡面的,定義死的。

Java安全之Shiro 550反序列化漏洞分析

但是隻要能找到他配置的金鑰就能偽造Shiro的加密流程傳送gadget進行反序列化,從而達到命令執行。

這裡找到web.xml載入的這個配置檔案翻找了一下還真找到了金鑰。這裡金鑰配置的不是隨機金鑰。

那麼這裡還需要找的一點是漏洞地址在哪裡,也就是shiro作用於哪個地方,一般使用shiro都是將這些東西託管給shiro做許可權控制,而在做許可權控制的時候同時也需要配置到一些後臺的登入地址,這裡是從配置檔案上方找到了這個地址。

配置對應的key值拿到工具裡面跑一下

以上是xml檔案的配置方式的審計方法,當然部分cms也會採用一個config類來進行配置。同理還是找到配置類然後看金鑰

這裡Config配置Shiro的本地沒環境,找了一個網上的圖。

漏洞修復

其實修復起來也很簡單,只需要使用隨機金鑰就好了。

 <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
        <property name="cipherKey" value="#{T(com.nova.framework.modules.sys.security.GenerateCipherKey).generateNewKey()}"></property>
    </bean>

0x03 結尾

整體的其實還是比較簡單,但是在XStream這個洞裡面遠端除錯的環境不知道為啥一直搭不好,不知道是環境問題還是啥,斷點停不下來。總的來說其實還是有原始碼審起來舒服,環境只要一搭建好就能本地除錯下斷點。

相關文章