Fastjson反序列化漏洞是怎樣的

這篇文章給大家介紹Fastjson反序列化漏洞是怎樣的,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

成都創(chuàng)新互聯(lián)主營易縣網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都APP應(yīng)用開發(fā),易縣h5重慶小程序開發(fā)搭建,易縣網(wǎng)站營銷推廣歡迎易縣等地區(qū)企業(yè)咨詢

Java中的Fastjson曾經(jīng)爆出了多個(gè)反序列化漏洞和Bypass版本,而在.Net領(lǐng)域也有一個(gè)Fastjson的庫,作者官宣這是一個(gè)讀寫Json效率最高的的.Net 組件,使用內(nèi)置方法JSON.ToJSON可以快速序列化.Net對象。讓你輕松實(shí)現(xiàn).Net中所有類型(對象,基本數(shù)據(jù)類型等)和Json之間的轉(zhuǎn)換。

fastjson是一個(gè)開源的Json.Net庫,下載地址 http://www.codeproject.com/Articles/159450/fastJSON,反序列過程中詳細(xì)的性能對比如下

Fastjson反序列化漏洞是怎樣的從圖上得出和老牌Json.Net、Stack等比起來速度和性能優(yōu)勢非常明顯,究其原因組件的作者利用反射生成了大量的IL代碼,而IL代碼是托管代碼,可以直接給運(yùn)行庫編譯所以性能就此大大提升。但在某些場景下開發(fā)者使用JSON.ToObject方法序列化不安全的數(shù)據(jù)時(shí)候會造成反序列化漏洞從而實(shí)現(xiàn)遠(yuǎn)程RCE攻擊,本文筆者從原理和代碼審計(jì)的視角做了相關(guān)介紹和復(fù)現(xiàn)。    Fastjson反序列化漏洞是怎樣的

二、 Fastjson序列化

使用JSON.ToJSON可以非常方便的實(shí)現(xiàn).NET對象與Json數(shù)據(jù)之間的轉(zhuǎn)化,ToJSON首先會得到對象名稱所在的程序集全限定名,并且作為$types這個(gè)key的值,再將對象的成員屬性名轉(zhuǎn)化為Json數(shù)據(jù)中的Key,把對象的成員屬性值轉(zhuǎn)化為Json數(shù)據(jù)中的value,下面通過一個(gè)實(shí)例來說明問題,首先定義TestClass對象Fastjson反序列化漏洞是怎樣的定義了三個(gè)成員,并實(shí)現(xiàn)了一個(gè)靜態(tài)方法ClassMethod啟動(dòng)進(jìn)程。 序列化通過創(chuàng)建對象實(shí)例分別給成員賦值 

Fastjson反序列化漏洞是怎樣的筆者為了盡量保證序列化過程不拋出異常,所以引入了 JSON.ToJSON方法的第二個(gè)參數(shù)并實(shí)例化創(chuàng)建JSONParameters,它的字段中有很多類型是布爾值,    

Fastjson反序列化漏洞是怎樣的和反序列化漏洞相關(guān)的字段為UseExtensions ,將它設(shè)置為true可得到類的全限定名,如果不需要序列化空值的時(shí)可將另一個(gè)字段SerializeNullValues設(shè)為false;筆者使用JSON.ToJSON后得到序列化的Json數(shù)據(jù)    Fastjson反序列化漏洞是怎樣的

三、Fastjson反序列化

3.1 反序列化用法

反序列過程就是將Json數(shù)據(jù)轉(zhuǎn)換為對象,F(xiàn)astjson通過創(chuàng)建一個(gè)新對象的方式調(diào)用JSON. ToObject方法實(shí)現(xiàn)的,ToObject有多個(gè)重載方法,當(dāng)傳入兩個(gè)參數(shù),第一個(gè)參數(shù)需要被序列化的數(shù)據(jù)、第二個(gè)參數(shù)設(shè)置序列化配置選項(xiàng)來指定JSONParameters按照指定的屬性值處理,重載方法參考下圖Fastjson反序列化漏洞是怎樣的

具體代碼可參考以下DemoFastjson反序列化漏洞是怎樣的

3.2 打造Poc

漏洞的觸發(fā)點(diǎn)也是在于被序列化的Json中的$types是否可控,為此官方文檔里也標(biāo)注了警告。Fastjson反序列化漏洞是怎樣的

筆者繼續(xù)選擇ObjectDataProvider類方便調(diào)用任意被引用類中的方法,具體有關(guān)此類的用法可以看一下《.NET高級代碼審計(jì)(第一課) XmlSerializer反序列化漏洞》,因?yàn)镻rocess.Start方法啟動(dòng)一個(gè)線程需要配置ProcessStartInfo類相關(guān)的屬性,例如指定文件名、指定啟動(dòng)參數(shù),所以首先得考慮序列化ProcessStartInfo,如下代碼DemoFastjson反序列化漏洞是怎樣的一步步來看,開始從GetType獲取當(dāng)前類的實(shí)例,返回Type類型變量t3;然后通過Type.GetProperty方法找到指定為FileName的公共屬性并賦值給PropertyInfo類型的變量propertyName;再使用PropertyInfo.SetValue方法設(shè)置對象的指定屬性值“cmd.exe“,同理為Arguments屬性指定值。下一步再來序列化Process類,并調(diào)用StartInfo啟動(dòng)程序,Demo如下

Fastjson反序列化漏洞是怎樣的

然后需要對其做減法,去掉無關(guān)的System.RuntimeType、System.IntPtr數(shù)據(jù),最終得到反序列化Payload    Fastjson反序列化漏洞是怎樣的FastJson定義的JSON類定義了多個(gè)ToObject重載方法,對于反序列化漏洞無需關(guān)心重載的方法參數(shù)是一個(gè)還是多個(gè),它們都可以觸發(fā)漏洞Fastjson反序列化漏洞是怎樣的筆者通過下面的Demo , JSON.ToObject(payload)反序列化成功彈出計(jì)算器。    

Fastjson反序列化漏洞是怎樣的

四、代碼審計(jì)視角

從代碼審計(jì)的角度很容易找到漏洞的污染點(diǎn),通過前面幾個(gè)小節(jié)的知識能發(fā)現(xiàn)需要滿足一個(gè)關(guān)鍵條件JSON.ToObject傳入String或者Object就可以被反序列化,例如以下JSONSerializer類Fastjson反序列化漏洞是怎樣的攻擊者控制傳入字符串參數(shù)json便可輕松實(shí)現(xiàn)反序列化漏洞攻擊。Github上也存在大量的不安全案例代碼,如下    Fastjson反序列化漏洞是怎樣的

五、案例復(fù)盤

最后再通過下面案例來復(fù)盤整個(gè)過程,全程展示在VS里調(diào)試?yán)锿ㄟ^反序列化漏洞彈出計(jì)算器。

1.    輸入http://localhost:5651/Default Post加載value值

Fastjson反序列化漏洞是怎樣的2.   通過ToObject 反序列化 ,并彈出計(jì)算器    

Fastjson反序列化漏洞是怎樣的最后附個(gè)動(dòng)態(tài)圖

Fastjson反序列化漏洞是怎樣的

關(guān)于Fastjson反序列化漏洞是怎樣的就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

網(wǎng)站標(biāo)題:Fastjson反序列化漏洞是怎樣的
網(wǎng)頁鏈接:http://www.muchs.cn/article44/gcehee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站設(shè)計(jì)公司、微信小程序、移動(dòng)網(wǎng)站建設(shè)標(biāo)簽優(yōu)化、網(wǎng)頁設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)