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