溫馨提示×

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

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

SoapFormatter反序列化漏洞示例分析

發(fā)布時(shí)間:2022-01-14 21:36:43 來(lái)源:億速云 閱讀:297 作者:柒染 欄目:網(wǎng)絡(luò)管理

SoapFormatter反序列化漏洞示例分析,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

一、前言

NetDataContractSerializer和DataContractSerializer一樣用于序列化和反序列化Windows Communication Foundation (WCF) 消息中發(fā)送的數(shù)據(jù)。兩者之間存在一個(gè)重要區(qū)別:NetDataContractSerializer 包含了CLR,通過(guò)CLR類型添加額外信息并保存引用來(lái)支持類型精確,而DataContractSerializer 則不包含。 因此,只有在序列化和反序列化端使用相同的 CLR 類型時(shí),才能使用 NetDataContractSerializer。若要序列化對(duì)象使用 WriteObject或者Serialize方法, 若要反序列化 XML流使用 ReadObject或者Deserialize方法。在某些場(chǎng)景下讀取了惡意的XML流就會(huì)造成反序列化漏洞,從而實(shí)現(xiàn)遠(yuǎn)程RCE攻擊,本文筆者從原理和代碼審計(jì)的視角做了相關(guān)介紹和復(fù)現(xiàn)。    

二、SoapFormatter序列化

SoapFormatter類實(shí)現(xiàn)的IFormatter接口中定義了核心的Serialize方法可以非常方便的實(shí)現(xiàn).NET對(duì)象與SOAP流之間的轉(zhuǎn)換,可以將數(shù)據(jù)保存為XML文件,官方提供了兩個(gè)構(gòu)造方法。    

SoapFormatter反序列化漏洞示例分析

下面還是用老案例來(lái)說(shuō)明問(wèn)題,首先定義TestClass對(duì)象    

定義了三個(gè)成員,并實(shí)現(xiàn)了一個(gè)靜態(tài)方法ClassMethod啟動(dòng)進(jìn)程。 序列化通過(guò)創(chuàng)建對(duì)象實(shí)例分別給成員賦值     

SoapFormatter反序列化漏洞示例分析

常規(guī)下使用Serialize得到序列化后的SOAP流,通過(guò)使用XML命名空間來(lái)持久化原始程序集,例如下圖TestClass類的開(kāi)始元素使用生成的xmlns進(jìn)行限定,關(guān)注a1 命名空間

<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

<SOAP-ENV:Body>

<a1:TestClass id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/WpfApp1/WpfApp1%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">

<classname id="ref-3">360</classname>

<name id="ref-4">Ivan1ee</name>

<age>18</age>

</a1:TestClass>

</SOAP-ENV:Body>


</SOAP-ENV:Envelope>

三、SoapFormatter反序列化

3.1 反序列化原理和用法

SoapFormatter類反序列化過(guò)程是將SOAP消息流轉(zhuǎn)換為對(duì)象,通過(guò)創(chuàng)建一個(gè)新對(duì)象的方式調(diào)用Deserialize多個(gè)重載方法實(shí)現(xiàn)的,查看定義得知實(shí)現(xiàn)了IRemotingFormatter、IFormatter接口,

SoapFormatter反序列化漏洞示例分析

查看IRemotingFormatter接口定義得知也是繼承了IFormatter    

SoapFormatter反序列化漏洞示例分析

筆者通過(guò)創(chuàng)建新對(duì)象的方式調(diào)用Deserialize方法實(shí)現(xiàn)的具體實(shí)現(xiàn)代碼可參考以下

SoapFormatter反序列化漏洞示例分析

反序列化后得到TestClass類的成員Name的值。

SoapFormatter反序列化漏洞示例分析

3.2 攻擊向量—ActivitySurrogateSelector

在SoapFormatter類的定義中除了構(gòu)造函數(shù)外,還有一個(gè)SurrogateSelector屬性,SurrogateSelector便是代理選擇器,序列化代理的好處在于一旦格式化器要對(duì)現(xiàn)有類型的實(shí)例進(jìn)行反序列化,就調(diào)用由代理對(duì)象自定義的方法。查看得知實(shí)現(xiàn)了ISurrogateSelector接口,定義如下    

SoapFormatter反序列化漏洞示例分析

因?yàn)樾蛄谢眍愋捅仨殞?shí)現(xiàn)System.Runtime.Serialization.ISerializationSurrogate接口,ISerializationSurrogate在Framework ClassLibrary里的定義如下:    

SoapFormatter反序列化漏洞示例分析

SoapFormatter反序列化漏洞示例分析

SoapFormatter反序列化漏洞示例分析

代碼中判斷類型解析器IsSerializable屬性是否可用,如果可用直接基類返回,如果不可用就獲取派生類System.Workflow.ComponentModel.Serialization.ActivitySurrogateSelector的類型,然后交給Activator創(chuàng)建實(shí)例,再回到GetObjectData方法體內(nèi),另外為了對(duì)序列化數(shù)據(jù)進(jìn)行完全控制,就需要實(shí)現(xiàn)Serialization.ISeralizable接口,定義如下:

SoapFormatter反序列化漏洞示例分析

有關(guān)更多的介紹請(qǐng)參考《.NET高級(jí)代碼審計(jì)第二課 Json.Net反序列化漏洞》,在實(shí)現(xiàn)自定義反序列類的時(shí)通過(guò)構(gòu)造方法讀取攻擊者提供的PocClass類    

SoapFormatter反序列化漏洞示例分析

下圖定義了PayloadClass類實(shí)現(xiàn)ISerializable接口,然后在GetObjectData方法里又聲明泛型List集合接收byte類型的數(shù)據(jù)    

SoapFormatter反序列化漏洞示例分析

將PocClass對(duì)象添加到List集合,聲明泛型使用IEnumerable集合map_type接收程序集反射得到的Type并返回IEnumerable類型,最后用Activator.CreateInstance創(chuàng)建實(shí)例保存到e3此時(shí)是一個(gè)枚舉集合的迭代器。    

SoapFormatter反序列化漏洞示例分析上圖將變量e3填充到了分頁(yè)控件數(shù)據(jù)源,查看PageDataSource類定義一目了然,    

SoapFormatter反序列化漏洞示例分析

除此之外System.Runtime.Remoting.Channels.AggregateDictionary返回的類型支持IDictionary,然后實(shí)例化對(duì)象DesignerVerb并隨意賦值,此類主要為了配合填充MenuCommand類properties屬性的值,最后為哈希表中的符合條件的buckets賦值。     
   

SoapFormatter反序列化漏洞示例分析

接下來(lái)用集合添加數(shù)據(jù)源DataSet,DataSet和DataTable對(duì)象繼承自System.ComponentModel.MarshalByValueComponent類,可序列化數(shù)據(jù)并支持遠(yuǎn)程處理ISerializable接口,這是ADO.NET對(duì)象中僅有支持遠(yuǎn)程處理的對(duì)象,并以二進(jìn)制格式進(jìn)行持久化。

SoapFormatter反序列化漏洞示例分析

更改屬性DataSet.RemotingFormat值為SerializationFormat.Binary,更改屬性DataSet.CaseSensitive為false等,再調(diào)用BinaryFormatter序列化List集合,如下圖。

SoapFormatter反序列化漏洞示例分析

因?yàn)橹付薘emotingFormat屬性為Binary,所以引入了BinaryFormatter格式化器并指定屬性SurrogateSelector代理器為自定義的MySurrogateSelector類。序列化后得到SOAP-XML,再利用SoapFormatter對(duì)象的Deserialize方法解析讀取文件內(nèi)容的流數(shù)據(jù),成功彈出計(jì)算器

SoapFormatter反序列化漏洞示例分析

SoapFormatter反序列化漏洞示例分析SoapFormatter反序列化漏洞示例分析

3.3 攻擊向量—PSObject

由于筆者的Windows主機(jī)打過(guò)了CVE-2017-8565(Windows PowerShell遠(yuǎn)程代碼執(zhí)行漏洞)的補(bǔ)丁,利用不成功,所以在這里不做深入探討,有興趣的朋友可以自行研究。有關(guān)于補(bǔ)丁的詳細(xì)信息參考:https://support.microsoft.com/zh-cn/help/4025872/windows-powershell-remote-code-execution-vulnerability

四、代碼審計(jì)

4.1 XML載入

從代碼審計(jì)的角度找到漏洞的EntryPoint,傳入XML,就可以被反序列化,這種方式也是很常見(jiàn)的,需要關(guān)注一下,LoadXml直接載入xml數(shù)據(jù),這個(gè)點(diǎn)也可以造成XXE漏洞。例如這段代碼:    

SoapFormatter反序列化漏洞示例分析

這種污染點(diǎn)漏洞攻擊成本很低,攻擊者只需要控制傳入字符串參數(shù)source便可輕松實(shí)現(xiàn)反序列化漏洞攻擊,彈出計(jì)算器。

SoapFormatter反序列化漏洞示例分析

4.2 File讀取

SoapFormatter反序列化漏洞示例分析

這段是摘自某個(gè)應(yīng)用的代碼片段,在審計(jì)的時(shí)候只需要關(guān)注DeserializeSOAP方法中傳入的path變量是否可控。

關(guān)于SoapFormatter反序列化漏洞示例分析問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

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

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

AI