前言
fastjson常用的利用方式为利用其在解析JSON的过程中导致的反序列化,同样在fastjson也能够作为反序列化Gadgets中的一个重要环节,能够触发getter方法
普通的getter调用
下面讨论的是如何使用fastjson中的JSONArray或者JSONObject进行原生反序列化调用进而触发对象的getter方法
入口
在fastjson中存在实现了Serializable
接口的类很少,经过检索,有以下3
个
-
AntiCollisionHashMap
: 这个类实现了自己的readObject
方法 -
JSONObject/JSONArray
在这个版本中存在有自己的readObject
方法
主要是通过重写了ObjectInputStream#resolveClass
方法来进行反序列化类的安全性检查
没有任何的反序列化功能点
JSONArray的toString调用
因为在JSONArray类中的实现的readObject
方法中除了检查恶意类之外没有反序列化的过程,所以我们需要找到一个中转的点,这里也就是toString
方法的带哦用
本身JSONArray
类中并没有toString
方法,它使用父类JSON
的toString
方法
这里就是能够触发getter
方法的关键点,toString方法中调用了toJSONString
方法,通过执行对应的JSONSerializer#write
方法达到getter方法触发的目的
接下来详细分析一下原理
调用getter流程
前面提到了将会调用JSONSerializer#write
方法
这里将会通过getObjectWriter
来获取一个ObjectSerializer的实现类
这是一个关于ObjectSerializer
的官方的一个例子
最后会来到SerializeConfig#getObjectWriter
方法中获取对应class对象的ObjectWriter
这里因为是使用的JSONArray
进行JavaBean的嵌套使用,因为JSONArray
是一个实现了List
接口的一个类,所以获取到的是ListSerializer
而在ListSerializer#write
的处理中
针对他的元素(一个JavaBean),他通过调用getObjectWriter
方法获取了对应Bean类的ObjectWriter
对象
所以又重新回到了SerializeConfig#getObjectWriter
的调用过程
前面都是一些对一些常见的对象进行不同的Serilizer
的映射,但是这里的JavaBean都不满足
来到这个方法的末尾部分
在不满足前面已有的映射,通过createJavaBeanSerializer
方法来动态的创建一个类
在经过简单的黑名单过滤之后,调用TypeUtils#buildBeanInfo
方法来提取这个JavaBean的类信息,为之后的类生成做准备
之后嘞,就是将提取的信息beanInfo
传入createJavaBeanSerializer
中进行JavaBeanSerializer类的动态生成
在createJavaBeanSerializer
方法中主要是通过调用createASMSerializer
方法进行创建的
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)