1.Fastjson的使用
.NET版本的Fastjson如何呢,用它序列化试试,这里要对Y4er师傅的代码修改一下,如果这个类没有public的标记,反序列化的时候会出现错误
加上public就好了:
2.Fastjson(.NET)反序列化
比起前面几个介绍的Json处理组件需要开启某些配置才能显示出__type或者$type,.NET Fastjson这边毫不避讳,正常序列化的时候就会搞出一个大大的$types,指向目标类的type,生怕别人不知道这里可以反序列化。。。总之,这很Fastjson
{"$types":{"Fastjson.NetSerializer.Person, ConsoleApp3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null":"1"},"$type":"1","Name":"jack"}
注意这里的写法,应该是Fastjson自己的一些规范,在开头写一个$types,把相关的type都放在这里,然后给每个type都设置一个“别名”(个人理解),比如这里把
Fastjson.NetSerializer.Person
设置为1,然后后续使用$type去使用,传入目标type设置好的别名,比如这里后面就使用"$type":"1"去调用了。
所以我们也很容易把之前的json有关的反序列化payload改造成符合.NET Fastjson规则的格式:
如下图,只要ToObject()方法接收的json数据可控,即可实现RCE
3.关于fastjson黑名单
非常经典的,Fastjson知道这个反序列化问题后,在fastjson 2.3.0版本之后,加了一个黑名单,在处理用户传入的type时,先与_blacklistTypes做匹配,如果匹配到就直接抛出异常
这个_blacklistTypes内容如下
我们常用的
system.windows.data.objectdataprovider
就在其中,不过这里我很好奇,除了objectdataprovider,其它几个Sink点都是怎样的,感觉也是非常值得学习的,这个我们会放在下一篇文章里学习。
4.结语
在审计中主要关注目标是否使用了.NET Fastjson,且其版本是否小于2.3.0,然后再找一个调用了ToObject()方法的点,观察传入的json数据是否可控,若可控则存在反序列化问题。
下篇文章会简单研究Fastjson _blacklistTypes中涉及到的其它方法,这些方法都挺有趣的。
5.参考
https://xz.aliyun.com/t/9604