12.Fastjson(.NET)反序列化点前篇

2024-10-28 22:11   广东  

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


HW专项行动小组
大师!教我打攻防
 最新文章