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


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這個洞里面遠程調試的環境不知道為啥一直搭不好,不知道是環境問題還是啥,斷點停不下來。總的來說其實還是有源代碼審起來舒服,環境只要一搭建好就能本地調試下斷點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM