奥运会网球比分规则|雪缘网网球比分直播|
歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

.NET高級代碼審計(第七課) NetDataContractSerializer反序列化漏洞

來源:本站整理 作者:佚名 時間:2019-04-11 TAG: 我要投稿

NetDataContractSerializer和DataContractSerializer一樣用于序列化和反序列化Windows Communication Foundation (WCF) 消息中發送的數據。兩者 之間存在一個重要區別:NetDataContractSerializer 包含了CLR,通過CLR類型添加額外信息并保存引用來支持類型精確,而 DataContractSerializer 則不包含。 因此,只有在序列化和反序列化端使用相同的 CLR 類型時,才能使用 NetDataContractSerializer。若要序列化對象使用 WriteObject或者Serialize方法, 若要反序列化 XML流使用 ReadObject或者Deserialize方法。在某些場景下讀取了惡意的XML流就會造成反序列化漏洞,從而實現遠程RCE攻擊,本文筆者從原理和代碼審計的視角做了相關介紹和復現。
 
0x01 NetDataContractSerializer序列化
使用WriteObject或者Serialize可以非常方便的實現.NET對象與XML數據之間的轉化,注意NetDataContractSerializer包含了程序集的名字和被序列化類型的類型。這些額外信息可以用來將XML反序列化成特殊類型,允許相同類型可以在客戶端和服務端同時使用。另外的信息是z:Id 屬性在不同的元素上意義是不同的。這個用來處理引用類型以及當XML被反序列化時是否引用可以保留,最后的結論是這個輸出相比DataContractSerializer的輸出包含了更多信息。下面通過一個實例來說明問題,首先定義TestClass對象

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

筆者使用Serialize得到序列化TestClass類后的xml數據
"1" z:Type="WpfApp1.TestClass" z:Assembly="WpfApp1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" xmlns="http://schemas.datacontract.org/2004/07/WpfApp1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">age>18age>classname z:Id="2">360classname>name z:Id="3">Ivan1eename>TestClass>
 
0x02 NetDataContractSerializer反序列化
2.1、反序列化用法
NetDataContractSerializer類反序列過程是將XML流轉換為對象,通過創建一個新對象的方式調用ReadObject多個重載方法或Serialize方法實現的,查看定義得知繼承自XmlObjectSerializer抽象類、IFormatter接口,

NetDataContractSerializer類實現了XmlObjectSerializer抽象類中的WriteObject、ReadObject方法,也實現了IFormatter中定義的方法。筆者通過創建新對象的方式調用Deserialize方法實現的具體實現代碼可參考以下

其實在Deserialize方法內也是調用了ReadObject方法反序列化的

反序列化后得到對象的屬性,打印輸出當前成員Name的值。

2.2、攻擊向量—MulticastDelegate
多路廣播委托(MulticastDelegate)繼承自 Delegate,其調用列表中可以擁有多個元素的委托,實際上所有委托類型都派生自MulticastDelegate。MulticastDelegate類的_invocationList字段在構造委托鏈時會引用委托數組,但為了取得對委托鏈更多的控制就得使用GetInvocationList方法,它是具有一個帶有鏈接的委托列表,在對委托實例進行調用的時候,將按列表中的委托順序進行同步調用,那么如何將calc.exe添加到GetInvocationList列表方法?首先先看Comparison類,它用于位于命令空間System.Collections.Generic,定義如下

Comparison類返回委托,再使用Delegate或者MulticastDelegate類的公共靜態方法Combine將委托添加到鏈中作為Comparison的類型比較器

使用Comparer的靜態方法Create創建比較器,比較器對象在.NET集合類中使用的頻率較多,也具備了定制的反序列化功能,這里選擇SortedSet類,在反序列化的時內部Comparer對象重構了集合的排序。

多路廣播委托的調用列表GetInvocationList方法在內部構造并初始化一個數組,讓它的每個元素都引用鏈中的一個委托,然后返回對該數組的引用,下面代碼修改了私有字段_InvocationList并用泛型委托Func返回Process類。

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.nddver.tw)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        奥运会网球比分规则
        2018新老藏宝图图片 南通棋牌大厅下载安装 牌九变牌绝技保盈 爱乐彩首页 广西快乐十分开奖号码 福彩开奖结果 中国体育彩票网 广西快乐10分开奖结果 福建时时彩外围 20选5彩票玩法