.NET高级代码审计(第三课)Fastjson反序列化漏洞
0X00 前言
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攻击,本文笔者从原理和代码审计的视角做了相关介绍和复现。
0X01 Fastjson序列化
使用JSON.ToJSON可以非常方便的实现.NET对象与Json数据之间的转化,ToJSON首先会得到对象名称所在的程序集全限定名,并且作为$types这个key的值,再将对象的成员属性名转化为Json数据中的Key,把对象的成员属性值转化为Json数据中的value,下面通过一个实例来说明问题,首先定义TestClass对象
定义了三个成员,并实现了一个静态方法ClassMethod启动进程。 序列化通过创建对象实例分别给成员赋值
笔者为了尽量保证序列化过程不抛出异常,所以引入了 JSON.ToJSON方法的第二个参数并实例化创建JSONParameters,它的字段中有很多类型是布尔值,
和反序列化漏洞相关的字段为UseExtensions ,将它设置为true可得到类的全限定名,如果不需要序列化空值的时可将另一个字段SerializeNullValues设为false; 笔者使用JSON.ToJSON后得到序列化的Json数据
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方法找到指定为FileName的公共属性并赋值给PropertyInfo类型的变量propertyName;再使用PropertyInfo.SetValue方法设置对象的指定属性值“cmd.exe“,同理为Arguments属性指定值。下一步再来序列化Process类,并调用StartInfo启动程序,Demo如下
然后需要对其做减法,去掉无关的System.RuntimeType、System.IntPtr数据,最终得到反序列化Payload
FastJson定义的JSON类定义了多个ToObject重载方法,对于反序列化漏洞无需关心重载的方法参数是一个还是多个,它们都可以触发漏洞
笔者通过下面的Demo , JSON.ToObject(payload)反序列化成功弹出计算器。
0x03 代码审计视角
从代码审计的角度很容易找到漏洞的污染点,通过前面几个小节的知识能发现需要满足一个关键条件JSON.ToObject传入String或者Object就可以被反序列化,例如以下JSONSerializer类
攻击者控制传入字符串参数json便可轻松实现反序列化漏洞攻击。Github上也存在大量的不安全案例代码,如下
0x04 案例复盘
最后再通过下面案例来复盘整个过程,全程展示在VS里调试里通过反序列化漏洞弹出计算器。
1. 输入http://localhost:5651/Default Post加载value值
2. 通过ToObject 反序列化 ,并弹出计算器
最后附个动态图
0x05 总结
Fastjson凭借速度和性能上的优势占得一席之地,但随着newtonsoft.Json的主流化,性能上已经逐渐赶超了Fastjson,也使得Fastjson越来越小众化,对于攻击者来说,利用成本很低,在代码审计配合的情况下这种安全问题越发的严重起来,若提交恶意的污染数据,便可水到渠成的反序列化成功拿下目标,最后.NET反序列化系列课程笔者会同步到 https://github.com/Ivan1ee/ 、https://ivan1ee.gitbook.io/ ,后续笔者将陆续推出高质量的.NET反序列化漏洞文章,欢迎大伙持续关注,交流,更多的.NET安全和技巧可关注实验室公众号。
.NET高级代码审计(第三课)Fastjson反序列化漏洞的更多相关文章
- .NET高级代码审计(第二课) Json.Net反序列化漏洞
0X00 前言 Newtonsoft.Json,这是一个开源的Json.Net库,官方地址:https://www.newtonsoft.com/json ,一个读写Json效率非常高的.Net库,在 ...
- Fastjson反序列化漏洞概述
Fastjson反序列化漏洞概述 背景 在推动Fastjson组件升级的过程中遇到一些问题,为帮助业务同学理解漏洞危害,下文将从整体上对其漏洞原理及利用方式做归纳总结,主要是一些概述性和原理上的东 ...
- Java安全之Fastjson反序列化漏洞分析
Java安全之Fastjson反序列化漏洞分析 首发:先知论坛 0x00 前言 在前面的RMI和JNDI注入学习里面为本次的Fastjson打了一个比较好的基础.利于后面的漏洞分析. 0x01 Fas ...
- Fastjson反序列化漏洞基础
Fastjson反序列化漏洞基础 FastJson是alibaba的一款开源JSON解析库,可用于将Java对象转换为其JSON表示形式,也可以用于将JSON字符串转换为等效的Java对象. 0x0 ...
- Fastjson反序列化漏洞分析 1.2.22-1.2.24
Fastjson反序列化漏洞分析 1.2.22-1.2.24 Fastjson是Alibaba开发的Java语言编写的高性能JSON库,用于将数据在JSON和Java Object之间互相转换,提供两 ...
- fastjson反序列化漏洞研究(上)
前言 最近护网期间,又听说fastjson传出“0day”,但网上并没有预警,在github上fastjson库中也有人提问关于fastjson反序列化漏洞的详情.也有人说是可能出现了新的绕过方式.不 ...
- fastjson反序列化漏洞实际案例利用
fastjson反序列化rce实际案例利用全过程: 存在问题网站:http://***.com/ 在网站上寻找一些安全漏洞的时候,发现一条json数据包 数据包如下: POST /*** HTTP/1 ...
- Fastjson反序列化漏洞复现
Fastjson反序列化漏洞复现 0x00 前言 对Fastjson反序列化漏洞进行复现. 0x01 漏洞环境 靶机环境:vulhub-fastjson-1.2.24 ip:172.16.10.18 ...
- .NET高级代码审计(第一课)XmlSerializer反序列化漏洞
0X00 前言 在.NET 框架中的 XmlSerializer 类是一种很棒的工具,它是将高度结构化的 XML 数据映射为 .NET 对象.XmlSerializer类在程序中通过单个 API 调用 ...
随机推荐
- Python之线程与进程
今天我们来了解一下Python的线程和进程的管理机制 首先,我们要了解下线程跟进程的概念: 线程(Thread)是操作系统能够进行运算调度的最小的单位,是一堆cpu的指令.他被包含在进程中,是进程中的 ...
- nginx记录post数据日志
1.vi nginx.conf 找到http {}中log_foramt ,定义post 日志格式 #log_format main '$remote_addr - $remote_user [$ti ...
- 室内设计类网站Web原型制作分享——Dinzd
Dinzd是一家德国室内设计网站,网站内涵盖全球设计精品资讯以及优秀案列.网站布局简单直观,内容丰富. 此原型模板所用到的交互动作有结合弹出面板做下拉菜单效果,鼠标按下文字按钮跳转页面,按钮hover ...
- js处理img标签加载图片失败,显示默认图片
1.第一种方法: 如果已经引入了jquery插件,就很好办.没有的话,如果实在需要,可以附上代码: script(type='text/javascript', src="http://aj ...
- 【转】ssh-copy-id帮你建立信任
本原创文章属于<Linux大棚>博客. 博客地址为http://roclinux.cn. 文章作者为roc. == 对于做运维的同学来说,给两台UNIX/Linux机器建立ssh信任关系是 ...
- 2019.01.21 NOIP训练 可持久化序列【模板】(可持久化treap)
传送门 题意简述:支持在把某个数插入到某版本的第k个位置,删除某版本第k个数,询问第k个数. 思路:用可持久化treaptreaptreap维护区间第kkk个位置的数是啥就可以了. 代码
- poj--2299(树状数组+离散化)
一.离散化: https://www.cnblogs.com/2018zxy/p/10104393.html 二.逆序数 AC代码: #include<iostream> #include ...
- HTML5 通过 FileReader 实现文件上传
概述 在页面中上传时,之前一般都是需要使用form表单进行上传.html5 中提供了FileReader 可以将文件转换成Base64编码字符串,因此就可以直接使用 AJAX实现文件上传. 实现代码 ...
- asp.net 多线程
//开启一条线程并执行一个方法 Thread oThread = new Thread(new ThreadStart(IIMsSqlToSqlitle2)); oTh ...
- linux ps查进程 kill关闭进程
原文链接:http://blog.sina.com.cn/s/blog_53855ace0100ded4.html 首先,我们需要使用linux下另外一个ps命令查找与进程相关的PID号:ps aux ...