91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

SoapFormatter反序列化漏洞示例分析

發布時間:2022-01-14 21:36:43 來源:億速云 閱讀:307 作者:柒染 欄目:網絡管理

SoapFormatter反序列化漏洞示例分析,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

一、前言

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

二、SoapFormatter序列化

SoapFormatter類實現的IFormatter接口中定義了核心的Serialize方法可以非常方便的實現.NET對象與SOAP流之間的轉換,可以將數據保存為XML文件,官方提供了兩個構造方法。    

SoapFormatter反序列化漏洞示例分析

下面還是用老案例來說明問題,首先定義TestClass對象    

定義了三個成員,并實現了一個靜態方法ClassMethod啟動進程。 序列化通過創建對象實例分別給成員賦值     

SoapFormatter反序列化漏洞示例分析

常規下使用Serialize得到序列化后的SOAP流,通過使用XML命名空間來持久化原始程序集,例如下圖TestClass類的開始元素使用生成的xmlns進行限定,關注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類反序列化過程是將SOAP消息流轉換為對象,通過創建一個新對象的方式調用Deserialize多個重載方法實現的,查看定義得知實現了IRemotingFormatter、IFormatter接口,

SoapFormatter反序列化漏洞示例分析

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

SoapFormatter反序列化漏洞示例分析

筆者通過創建新對象的方式調用Deserialize方法實現的具體實現代碼可參考以下

SoapFormatter反序列化漏洞示例分析

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

SoapFormatter反序列化漏洞示例分析

3.2 攻擊向量—ActivitySurrogateSelector

在SoapFormatter類的定義中除了構造函數外,還有一個SurrogateSelector屬性,SurrogateSelector便是代理選擇器,序列化代理的好處在于一旦格式化器要對現有類型的實例進行反序列化,就調用由代理對象自定義的方法。查看得知實現了ISurrogateSelector接口,定義如下    

SoapFormatter反序列化漏洞示例分析

因為序列化代理類型必須實現System.Runtime.Serialization.ISerializationSurrogate接口,ISerializationSurrogate在Framework ClassLibrary里的定義如下:    

SoapFormatter反序列化漏洞示例分析

SoapFormatter反序列化漏洞示例分析

SoapFormatter反序列化漏洞示例分析

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

SoapFormatter反序列化漏洞示例分析

有關更多的介紹請參考《.NET高級代碼審計第二課 Json.Net反序列化漏洞》,在實現自定義反序列類的時通過構造方法讀取攻擊者提供的PocClass類    

SoapFormatter反序列化漏洞示例分析

下圖定義了PayloadClass類實現ISerializable接口,然后在GetObjectData方法里又聲明泛型List集合接收byte類型的數據    

SoapFormatter反序列化漏洞示例分析

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

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

SoapFormatter反序列化漏洞示例分析

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

SoapFormatter反序列化漏洞示例分析

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

SoapFormatter反序列化漏洞示例分析

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

SoapFormatter反序列化漏洞示例分析

因為指定了RemotingFormat屬性為Binary,所以引入了BinaryFormatter格式化器并指定屬性SurrogateSelector代理器為自定義的MySurrogateSelector類。序列化后得到SOAP-XML,再利用SoapFormatter對象的Deserialize方法解析讀取文件內容的流數據,成功彈出計算器

SoapFormatter反序列化漏洞示例分析

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

3.3 攻擊向量—PSObject

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

四、代碼審計

4.1 XML載入

從代碼審計的角度找到漏洞的EntryPoint,傳入XML,就可以被反序列化,這種方式也是很常見的,需要關注一下,LoadXml直接載入xml數據,這個點也可以造成XXE漏洞。例如這段代碼:    

SoapFormatter反序列化漏洞示例分析

這種污染點漏洞攻擊成本很低,攻擊者只需要控制傳入字符串參數source便可輕松實現反序列化漏洞攻擊,彈出計算器。

SoapFormatter反序列化漏洞示例分析

4.2 File讀取

SoapFormatter反序列化漏洞示例分析

這段是摘自某個應用的代碼片段,在審計的時候只需要關注DeserializeSOAP方法中傳入的path變量是否可控。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

荆门市| 宁南县| 乃东县| 苍南县| 青川县| 腾冲县| 和硕县| 车险| 宜宾市| 文昌市| 合阳县| 新宾| 上饶市| 甘泉县| 白山市| 施秉县| 宜阳县| 若羌县| 东乌珠穆沁旗| 呼玛县| 荥阳市| 尖扎县| 拜泉县| 安丘市| 新绛县| 磴口县| 广德县| 新邵县| 莱芜市| 临澧县| 古田县| 克什克腾旗| 洪泽县| 靖州| 高唐县| 依安县| 吉木乃县| 旅游| 韶山市| 抚宁县| 万山特区|