如何使用 IDEA 调试分析 Java 反序列化漏洞

IDEA 是 Java 的集成开发环境,也是调试分析 Java 相关漏洞的神器,这篇文章将会介绍如何使用 IDEA 对 Java 反序列化漏洞进行分析,并以 Fastjson 反序列化漏洞的调试分析作为实战例子。

本次实验需要具备 Java 语言的基础,特别是反射方面的知识。

环境搭建

进行调试前,需要安装必要的环境

  1. JDK8
  2. IDEA

在下面的地址下载 JDK 8
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
在这里插入图片描述

在这里下载 IDEA 社区版本
https://www.jetbrains.com/idea/download/
在这里插入图片描述

下载好后直接安装jdk8 和 IDEA ,使用默认选项即可。

安装好 IDEA 后,打开IDEA ,点击 New Project

在这里插入图片描述

在新窗口中选择 Gradle 项目,Project SDK 处选择我们安装的 jdk 8,然后勾选 Java ,点击 Next 进入下一步。
在这里插入图片描述

输入项目名称,点击 Finish

在这里插入图片描述

耐心等待项目初始化完,也就是等待下面的进度条消失

在这里插入图片描述

初始化完后的页面如下,在左边的窗口出现了如下目录,其中 src 目录是存放源码的目录。

在这里插入图片描述

接下来创建一个类进行调试
在这里插入图片描述
在这里插入图片描述

输入 hello world 代码

public class Main {
   
   
    public static void main(String[] args) {
   
   
        System.out.printf("Hello World!");
    }
}

点击代码左边的绿色小箭头来运行代码

在这里插入图片描述

可以看到成功输出了 Hello World!

在这里插入图片描述

接下来开始配置实验环境,先通过配置项目构建工具 gradle 来加载存在漏洞的 fastjson 库,打开 build.gradle 文件,修改与以下内容,第14行处导入存在漏洞的 fastjson 库,版本号为 1.2.24, 然后点击右上角的 gradle 同步按钮,这样 gradle 就会自动下载该版本的 fastjson 作为库来使用。

plugins {
   
   
    id 'java'
}
​
group 'org.example'
version '1.0-SNAPSHOT'
​
repositories {
   
   
    mavenCentral()
}
​
dependencies {
   
   
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile 'com.alibaba:fastjson:1.2.24'
}

在这里插入图片描述

fastjson 用法

在进行漏洞调试前,我们先来看看 fastjson 的用法。fastjson 是一个阿里开发的一个操作 json 数据的库。

先创建一个 Person 类来演示 fastjson 的使用,该类是一个典型的 java bean , 实现了 setter 和 getter 方法(setter 和 getter 方法一般用于给对象的变量赋值,如 setAge 方法给 age 变量赋值),同时实现了 toString() 方法,便于打印实例对象。

public class Person {
   
   
    private int age;
    private String name;public int getAge() {
   
   
        System.out.println("call getAge function ");
        return age;
    }public void setAge(int age) {
   
   
        System.out.println("call setAge function ");
        this.age = age;
    }public void setName(String name) {
   
   
        System.out.println("call setName function ");
        this.name = name;
    }public String getName() {
   
   
        System.out.println("call getName function ");
        return name;
    }@Override
    public String toString() {
   
   
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

在 Main 类中添加以下代码,第5-7 行处创建了 person 对象,年龄为18, 姓名为 Jenny。第 9 行处使用 JSONObject.toJSONString() 方法把 person 对象转化为 json 字符串。

import com.alibaba.fastjson.JSONObject;public class Main {
   
   
public static void main(String[] args) {
   
   
        Person person = new Person();
        person.setAge(18);
        person.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值