反序列化漏洞分析

接着昨天的来说,由于fastjson调试起来过程比较复杂,在这里直接看关键点:首先会获取字符串的第一对引号中的内容

如果内容为@type就会加载下一对引号中的类

 

 

在JavaBeanInfo.class中会获取类中所有详细详细 在这里匹配以set开头的方法

methodName.length() >= 4 && 
!Modifier.isStatic(method.getModifiers()) && 
(method.getReturnType().equals(Void.TYPE) || 
method.getReturnType().equals(method.getDeclaringClass())))

 函数名长度大于等于4非静态方法,以get开头且第4个字母为大写,无参数,返回值类型继承自Collection或Map或AtomicBoolean,或Atomiclnteger或AtomicLon的方法

methodName.length() >= 4 && 
!Modifier.isStatic(method.getModifiers()) && 
methodName.startsWith("get") && 
Character.isUpperCase(methodName.charAt(3)) && 
method.getParameterTypes().length == 0 && 
(Collection.class.isAssignableFrom(method.getReturnType()) || 
Map.class.isAssignableFrom(method.getReturnType()) || 
AtomicBoolean.class == method.getReturnType() || 
AtomicInteger.class == method.getReturnType() || 
AtomicLong.class == method.getReturnType()))

 其实本质就是fastjson会利用反序列化通过无参构造创建一个对象,不通过setter或getter方法进行赋值与输出操作 因此我们只需要找到满足条件的类就行,这里一般利用的是 TemplatesImpl链来加载字节码,从而rce等操作 下面我们来证明一下我们的观点 在setter方法中添加一段命令执行的代码

package com.naihe;

public class User {
    private String name;
    private int age;

    public User() {}

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

Demo:

package com.naihe;

import com.alibaba.fastjson.JSONObject;

public class Demo1 {
    public static void main(String[] args) {
        String str = "{\"@type\":\"com.naihe.User\",\"age\":1000,\"name\":\"老李\"}";
        Object obj1 = JSONObject.parse(str);
        
    }
}

 

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-28 22:24:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-28 22:24:05       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-28 22:24:05       82 阅读
  4. Python语言-面向对象

    2023-12-28 22:24:05       91 阅读

热门阅读

  1. React-Native项目 — 关于IOS知识储备

    2023-12-28 22:24:05       61 阅读
  2. 脚本批量导入导出es表结构

    2023-12-28 22:24:05       63 阅读
  3. List的四种遍历方法

    2023-12-28 22:24:05       57 阅读
  4. 面向-对象的三大原则

    2023-12-28 22:24:05       58 阅读
  5. vue中使用lodash的debounce防抖函数

    2023-12-28 22:24:05       60 阅读
  6. Qt开发Charts折线图绑定事件

    2023-12-28 22:24:05       57 阅读
  7. Vue前后端跨域链接

    2023-12-28 22:24:05       61 阅读
  8. vue前端学习笔记

    2023-12-28 22:24:05       69 阅读
  9. 数据库(部分函数)

    2023-12-28 22:24:05       50 阅读