阜新市迅银支付网络科技有限公司
首页 | 联系方式 | 加入收藏 | 设为首页 | 手机站

产品目录

联系方式

联系人:业务部
电话: 00167-642021
邮箱:service@rxzhilian.com

当前位置:首页 >> 产品展示 >> 默认分类 >> 正文

.NET高级代码审计(第三课)Fastjson反序列化漏洞

详细信息:

一、前言

前文回顾:

.NET 高级代码审计之 XmlSerializer 反序列化漏洞

.NET 高级代码审计(第二课) Json.Net 反序列化漏洞

Java 中的 Fastjson 曾经爆出了多个反序列化漏洞和 Bypass 版本,而在 .Net 领域也有一个 Fastjson 的库,作者官宣这是一个读写 Json 效率最高的的 .Net 组件,使用内置方法 JSON.ToJSON 可以快速序列化 .Net 对象。让你轻松实现 .Net 中所有类型(对象,基本数据类型等)和 Json 之间的转换。

fastjson 是一个开源的 Json.Net 库,下载地址 http://www.codeproject.com/Articles/159450/fastJSON,反序列过程中详细的性能对比如下

[图片]

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

二、 Fastjson 序列化

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

[图片]

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

[图片]

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

[图片]

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

三、Fastjson 反序列化

3. 1 反序列化用法

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

[图片]

具体代码可参考以下 Demo

[图片]

3. 2 打造 Poc

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

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

[图片]

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

[图片]

然后需要对其做减法,去掉无关的 System.RuntimeType、System.IntPtr 数据,最终得到反序列化 Payload[图片]

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

[图片]

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

[图片]

四、代码审计视角

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

[图片]

攻击者控制传入字符串参数 json 便可轻松实现反序列化漏洞攻击。Github 上也存在大量的不安全案例代码,如下[图片]

五、案例复盘

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

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

[图片]

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

[图片]

最后附个动态图

[图片]

六、总结

Fastjson 凭借速度和性能上的优势占得一席之地,但随着 newtonsoft.Json 的主流化,性能上已经逐渐赶超了 Fastjson,也使得 Fastjson 越来越小众化,对于攻击者来说,利用成本很低,在代码审计配合的情况下这种安全问题越发的严重起来,若提交恶意的污染数据,便可水到渠成的反序列化成功拿下目标。后续笔者将陆续推出高质量的 .NET 反序列化漏洞文章,欢迎大伙持续关注,交流。

*本文作者:Ivan1ee@360 云影实验室,转载请注明来自 FreeBuf.COM