溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析

發(fā)布時間:2021-12-14 10:18:22 來源:億速云 閱讀:271 作者:柒染 欄目:安全技術(shù)

本篇文章為大家展示了怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

前言

遲到的Fastjson反序列化漏洞分析,按照國際慣例這次依舊沒有放poc。道理還是那個道理,但利用方式多種多樣。除了之前放出來用于文件讀寫的利用方式以外其實還可以用于SSRF。

一、漏洞概述

在之前其他大佬文章中,我們可以看到的利用方式為通過清空指定文件向指定文件寫入指定內(nèi)容(用到第三方庫)。當(dāng)gadget是繼承的第一個類的子類的時候,滿足攻擊fastjson的條件。此時尋找到的需要gadget滿足能利用期望類繞過checkAutoType。

下面分析了一種利用反序列化指向fastjson自帶類進(jìn)行攻擊利用,可實現(xiàn)文件讀取、SSRF攻擊等。

二、調(diào)試分析

1. 漏洞調(diào)試

從更新的補丁中可以看到expectClass類新增了三個方法分別為:

java.lang.Runnable、java.lang.Readable、java.lang.AutoCloseable

首先,parseObject方法對傳入的數(shù)據(jù)進(jìn)行處理。通過詞法解析得到類型名稱,如果不是數(shù)字則開始checkAutoType檢查。

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析

當(dāng)傳入的數(shù)據(jù)不是數(shù)字的時候,默認(rèn)設(shè)置期望類為空,進(jìn)入checkAutoType進(jìn)行檢查傳入的類。

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析

判斷期望類,此時期望類為null。往下走的代碼中,autoCloseable 滿足不在白名單內(nèi),不在黑名單內(nèi),autoTypeSupport沒有開啟,expectClassFlag為false。

其中:

A.計算哈希值進(jìn)行內(nèi)部白名單校驗

B.計算哈希值進(jìn)行黑名單校驗

C.非內(nèi)部白名單且開啟autoTypeSupport或者是期望類的,進(jìn)行hash校驗白名單acceptHashCodes、黑名單denyHashCodes。如果在acceptHashCodes內(nèi)則進(jìn)行加載( defaultClassLoader),在黑名單內(nèi)則拋出 autoType is not support。

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析滿足條件C后來到clazz的賦值,解析來的代碼中對clazz進(jìn)行了各種判斷。

從明文緩存中取出autoCloseable賦值給 clazz。

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析當(dāng)clazz不為空時,expectClassFlag為空不滿足條件,返回clazz,至此,第一次的checkAutoType檢查完畢。

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析

將檢查完畢的autoCloseable進(jìn)行反序列化,該類使用的是JavaBeanDeserializer反序列化器,從MapDeserializer中繼承。

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析

JSON.DEFAULT_TYPE_KEY 為@type ,并給它賦值傳入的key @type ,將第二個類也就是這次 的gadget傳入。

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析

期望類在這里發(fā)生了變化,expectClass的值變?yōu)閖ava.lang.AutoCloseable,typeName為gadget,

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析

來到JSONType注解,取typename gadget轉(zhuǎn)換變?yōu)槁窂?,resource通過將 “.” 替換為”/“得到路徑 。其實已經(jīng)開始讀取gadget了,它本意應(yīng)該是加載AutoCloseable。

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析

可以看到這里有讀取文件的功能。

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析

isAssignableFrom()這個方法用于判斷里面的類是否為繼承類,當(dāng)利用了java.lang.AutoCloseable這個方法去攻擊fastjson,那么后續(xù)反序列化的鏈路一定是要繼承于該類的子類。

TypeUtils.addMapping(typeName, clazz)這一步成功把gadget加入緩存中并返回被賦值gadget的clazz.

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析checkAutoType正式檢查完畢,此時用deserializer = parser.getConfig().getDeserializer(userType); userType既gadget進(jìn)行反序列化。

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析

進(jìn)入coreConnect()

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析

怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析

在這里進(jìn)行連接。找到合適并且可利用的常用jar包中的gadget。gadget在被反序列化后即可執(zhí)行類里的惡意的功能(不僅限于RCE還包括任意文件讀取/創(chuàng)建,SSRF等)。也可以使本漏洞得到最大化的利用。

至此漏洞利用完結(jié)。

上述內(nèi)容就是怎么實現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI