本篇文章為大家展示了怎么實(shí)現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
公司專(zhuān)注于為企業(yè)提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、商城系統(tǒng)網(wǎng)站開(kāi)發(fā),重慶小程序開(kāi)發(fā),軟件按需求定制開(kāi)發(fā)等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗(yàn),我們會(huì)仔細(xì)了解各客戶(hù)的需求而做出多方面的分析、設(shè)計(jì)、整合,為客戶(hù)設(shè)計(jì)出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,創(chuàng)新互聯(lián)建站更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。
遲到的Fastjson反序列化漏洞分析,按照國(guó)際慣例這次依舊沒(méi)有放poc。道理還是那個(gè)道理,但利用方式多種多樣。除了之前放出來(lái)用于文件讀寫(xiě)的利用方式以外其實(shí)還可以用于SSRF。
在之前其他大佬文章中,我們可以看到的利用方式為通過(guò)清空指定文件向指定文件寫(xiě)入指定內(nèi)容(用到第三方庫(kù))。當(dāng)gadget是繼承的第一個(gè)類(lèi)的子類(lèi)的時(shí)候,滿足攻擊fastjson的條件。此時(shí)尋找到的需要gadget滿足能利用期望類(lèi)繞過(guò)checkAutoType。
下面分析了一種利用反序列化指向fastjson自帶類(lèi)進(jìn)行攻擊利用,可實(shí)現(xiàn)文件讀取、SSRF攻擊等。
從更新的補(bǔ)丁中可以看到expectClass類(lèi)新增了三個(gè)方法分別為:
java.lang.Runnable、java.lang.Readable、java.lang.AutoCloseable
首先,parseObject方法對(duì)傳入的數(shù)據(jù)進(jìn)行處理。通過(guò)詞法解析得到類(lèi)型名稱(chēng),如果不是數(shù)字則開(kāi)始checkAutoType檢查。
當(dāng)傳入的數(shù)據(jù)不是數(shù)字的時(shí)候,默認(rèn)設(shè)置期望類(lèi)為空,進(jìn)入checkAutoType進(jìn)行檢查傳入的類(lèi)。
判斷期望類(lèi),此時(shí)期望類(lèi)為null。往下走的代碼中,autoCloseable 滿足不在白名單內(nèi),不在黑名單內(nèi),autoTypeSupport沒(méi)有開(kāi)啟,expectClassFlag為false。
其中:
A.計(jì)算哈希值進(jìn)行內(nèi)部白名單校驗(yàn)
B.計(jì)算哈希值進(jìn)行黑名單校驗(yàn)
C.非內(nèi)部白名單且開(kāi)啟autoTypeSupport或者是期望類(lèi)的,進(jìn)行hash校驗(yàn)白名單acceptHashCodes、黑名單denyHashCodes。如果在acceptHashCodes內(nèi)則進(jìn)行加載( defaultClassLoader),在黑名單內(nèi)則拋出 autoType is not support。
滿足條件C后來(lái)到clazz的賦值,解析來(lái)的代碼中對(duì)clazz進(jìn)行了各種判斷。
從明文緩存中取出autoCloseable賦值給 clazz。
當(dāng)clazz不為空時(shí),expectClassFlag為空不滿足條件,返回clazz,至此,第一次的checkAutoType檢查完畢。
將檢查完畢的autoCloseable進(jìn)行反序列化,該類(lèi)使用的是JavaBeanDeserializer反序列化器,從MapDeserializer中繼承。
JSON.DEFAULT_TYPE_KEY 為@type ,并給它賦值傳入的key @type ,將第二個(gè)類(lèi)也就是這次 的gadget傳入。
期望類(lèi)在這里發(fā)生了變化,expectClass的值變?yōu)閖ava.lang.AutoCloseable,typeName為gadget,
來(lái)到JSONType注解,取typename gadget轉(zhuǎn)換變?yōu)槁窂?,resource通過(guò)將 “.” 替換為”/“得到路徑 。其實(shí)已經(jīng)開(kāi)始讀取gadget了,它本意應(yīng)該是加載AutoCloseable。
可以看到這里有讀取文件的功能。
isAssignableFrom()這個(gè)方法用于判斷里面的類(lèi)是否為繼承類(lèi),當(dāng)利用了java.lang.AutoCloseable這個(gè)方法去攻擊fastjson,那么后續(xù)反序列化的鏈路一定是要繼承于該類(lèi)的子類(lèi)。
TypeUtils.addMapping(typeName, clazz)這一步成功把gadget加入緩存中并返回被賦值gadget的clazz.
checkAutoType正式檢查完畢,此時(shí)用deserializer = parser.getConfig().getDeserializer(userType); userType既gadget進(jìn)行反序列化。
進(jìn)入coreConnect()
在這里進(jìn)行連接。找到合適并且可利用的常用jar包中的gadget。gadget在被反序列化后即可執(zhí)行類(lèi)里的惡意的功能(不僅限于RCE還包括任意文件讀取/創(chuàng)建,SSRF等)。也可以使本漏洞得到最大化的利用。
至此漏洞利用完結(jié)。
上述內(nèi)容就是怎么實(shí)現(xiàn)Fastjson小于1.2.68版本反序列化漏洞分析,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。