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

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


三、Fastjson反序列化
3.1 反序列化用法
反序列过程就是将Json数据转换为对象,Fastjson通过创建一个新对象的方式调用JSON. ToObject方法实现的,ToObject有多个重载方法,当传入两个参数,第一个参数需要被序列化的数据、第二个参数设置序列化配置选项来指定JSONParameters按照指定的属性值处理,重载方法参考下图
具体代码可参考以下Demo
3.2 打造Poc
漏洞的触发点也是在于被序列化的Json中的$types是否可控,为此官方文档里也标注了警告。
笔者继续选择ObjectDataProvider类方便调用任意被引用类中的方法,具体有关此类的用法可以看一下《.NET高级代码审计(第一课) XmlSerializer反序列化漏洞》,因为Process.Start方法启动一个线程需要配置ProcessStartInfo类相关的属性,例如指定文件名、指定启动参数,所以首先得考虑序列化ProcessStartInfo,如下代码Demo
然后需要对其做减法,去掉无关的System.RuntimeType、System.IntPtr数据,最终得到反序列化Payload 

四、代码审计视角
从代码审计的角度很容易找到漏洞的污染点,通过前面几个小节的知识能发现需要满足一个关键条件JSON.ToObject传入String或者Object就可以被反序列化,例如以下JSONSerializer类
五、案例复盘
最后再通过下面案例来复盘整个过程,全程展示在VS里调试里通过反序列化漏洞弹出计算器。
1. 输入http://localhost:5651/Default Post加载value值


六、总结
Fastjson凭借速度和性能上的优势占得一席之地,但随着newtonsoft.Json的主流化,性能上已经逐渐赶超了Fastjson,也使得Fastjson越来越小众化,对于攻击者来说,利用成本很低,在代码审计配合的情况下这种安全问题越发的严重起来,若提交恶意的污染数据,便可水到渠成的反序列化成功拿下目标。后续笔者将陆续推出高质量的.NET反序列化漏洞文章,欢迎大伙持续关注,交流。
*本文作者:Ivan1ee@360云影实验室,转载请注明来自FreeBuf.COM
来源:freebuf.com 2019-03-13 11:30:24 by: 云影实验室








