fastjson反序列化
fastjson最经典的部分是自动触发getter来getProperties加载字节码,如何触发getter可以通过JSON.parse触发,也可以通过toJSONString触发,很有意思的是JSON这个类的tostring就是toJSONString
基础知识
FastJson 是一个由阿里巴巴研发的java库,可以把java对象转换为JSON格式,也可以把JSON字符串转换为对象
环境搭建
导入依赖
1 | <dependencies> |
FastJson的简单使用
新建一个简单的pojo类
1 | package com.liang.pojo; |
关于Fastjson的使用,使用JSON的toJSONString
方法 可以将对象转换为字符串
1 | public class FastjsonTest { |
但是这里转化的字符串只有属性的值,无法区分是哪个类进行了序列化转化的字符串,这里就有了在JSON.toJSONString
的第二个参数SerializerFeature.WriteClassName
写下这个类的名字
@type
关键字标识的是这个字符串是由某个类序列化而来。
传入
SerializerFeature.WriteClassName
可以使得Fastjson支持自省,开启自省后序列化成JSON的数据就会多一个@type,这个是代表对象类型的JSON文本。
反序列化漏洞
@type 指定类
使用JSON.parse
方法反序列化会调用此类的set方法
使用JSON.parseObject
方法反序列化会调用此类get和set方法
可以写一个恶意类,然后通过这一特性实现命令执行
1 | package com.liang.pojo; |
FastJson反序列化和原生反序列化利用不同的点:
FastJson不需要实现Serializable
不需要变量不是transient/可控变量:
- 变量有对应的setter
- 或是public/static
- 或满足条件的getter
反序列化入口点不是readObject,而是setter或者是getter
一般的利用方式
一个是通过JNDI注入进行出网攻击,另一个是通过defineClass的动态类加载,来进行不出网攻击
利用方式一:
我们要找fastjson中的原生反序列化,发现 JSONObject
和JSONArray
类 有序列化接口,可并没有readobject方法,且 extends
对应的JSON
类也没有readObect方法 ,所以只能找谁的readobject触发了这两个类,或者他们继承的JSON
类
这里我们就要引入toString方法,我们可以发现在Json类中存在toString方法能够触发toJSONString方法的调用( 在toJSONString中调用了serializer.write方法 )
例题
2022西湖论剑初赛 easyapi
//api_text绕过,?data=…