服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 搭建一个java反序列化靶场

搭建一个java反序列化靶场

2023-10-18 14:55leeezp Java教程

反序列化的过程中,会涉及一些接口类或者基类(举个例子简单的如:Map、List 和 Object)。应用也必须根据数据源,去判断选择哪一个具体的接口实现类。也就是说,如果黑客可以控制输入数据,黑客也就可以控制反序列化过程中

0x00 简介

java反序列化漏洞研究需要。

反序列化的过程中,会涉及一些接口类或者基类(举个例子简单的如:Map、List 和 Object)。应用也必须根据数据源,去判断选择哪一个具体的接口实现类。也就是说,如果黑客可以控制输入数据,黑客也就可以控制反序列化过程中,应用要调用的接口实现类的默认方法。通过对不同接口类的默认方法进行组合,黑客就可以控制反序列化的调用过程,实现执行任意命令的功能。

0x01 环境搭建

环境:

java version "1.8.0_91" ; IDEA ULTIMATE 2019.3

考虑到springmvc项目配置略显繁琐,这里选择建立一个springboot项目。

IDEA  -- New Project -- Spring Initializr 

搭建一个java反序列化靶场

Next

Type 选择 Maven Project

搭建一个java反序列化靶场

 Next

选择 Web -- Spring Web

搭建一个java反序列化靶场

Next

Springboot项目就建好了。

搭建一个java反序列化靶场

修改pom.xml ,新增反序列化依赖 (下文会介绍为什么添加这个依赖)


commons-collections
commons-collections
3.2.1

打开 DemoApplication.java 查看:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

 需要修改的只有 DemoApplication.java 这个类:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ObjectInputStream;

@SpringBootApplication
@Controller
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @ResponseBody
    @RequestMapping("/cc5")
    public String cc5Vuln(HttpServletRequest request, HttpServletResponse response) throws Exception {
        java.io.InputStream inputStream =  request.getInputStream();
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        try {
            String a=objectInputStream.readObject().toString();
            System.out.println(a);
        }catch (Exception e){
            System.out.println(e); //cc3 java.lang.annotation.IncompleteAnnotationException: java.lang.Override missing element entrySet
        }
        return "Hello,World";      
    }

    @ResponseBody
    @RequestMapping("/demo")
    public String demo(HttpServletRequest request, HttpServletResponse response) throws Exception{
        return "This is OK Demo!";
    }
}

 为什么不用CC3链呢,因为 CC3链在JDK8u71以上版本无法使用。产生报错:

cc3 java.lang.annotation.IncompleteAnnotationException: java.lang.Override missing element entrySet

我的java version "1.8.0_91",参考 ref: An Error Of "java -cp ysoserial-master.jar ysoserial.exploit.RMIRegistryExploit " · Issue #77 · frohoff/ysoserial · GitHub

0x02 payload 构建

payload生成:

java -jar ysoserial-0.0.5-all.jar CommonsCollections5 calc > a.ser

 burp 发包:

搭建一个java反序列化靶场

如果不添加 commons-collections 依赖,运行会报错:

java.lang.ClassNotFoundException: org.apache.commons.collections.keyvalue.TiedMapEntry

可见在反序列化的时候要调用这个jar。

0x03 修复与防御

1.使用ObjectInputFilter来校验反序列化的类

 

Java 9包含了支持序列化数据过滤的新特性,开发人员也可以继承java.io.ObjectInputFilter类重写checkInput方法实现自定义的过滤器,并使用ObjectInputStream对象的setObjectInputFilter设置过滤器来实现反序列化类白/黑名单控制。

ref : 《Combating Java Deserialization Vulnerabilities with Look-Ahead Object Input Streams (LAOIS)》

2.使用 SerialKiller.jar

GitHub - ikkisoft/SerialKiller: Look-Ahead Java Deserialization Library

将 ObjectInputStream.readObject()改为 SerialKiller.readObject()。

SerialKiller.conf为配置文件,可以指定白名单,仅仅对白名单中的类反序列化。

SerialKiller.java为ObjectInputStream的子类,覆盖了resolveClass方法(此会被readObject()方法调用),加入了类名检查,确保反序列化的是安全的类。

0x04 代码审计

涉及到以下函数,则可能存在java反序列化:

readExternal 
objectInputStream.readObject()
objectInputStream.readUnshared()
xmlDecoder.readObject()
xStream.fromXML()
objectMapper.readValue()
JSON.parseObject()

......

0x05 后记

1.如果运行时报错:

java.io.StreamCorruptedException: invalid stream header: xxxx

应该使用序列化方式获取二进制流,不能直接传入文本。

https://www.cnblogs.com/gaoquanquan/p/11276114.html

2. IDEA 配置 Maven

Settings -- Maven -- Maven home directory : (填写本地的Maven路径)

3. 如果你用的是IDEA社区版,需要安装一个插件

​​​​​​​IDEA社区版怎么配置Spring boot项目?_idea没有创建springboot的选项怎么设置_普通网友的博客-CSDN博客

到此这篇关于搭建一个java反序列化靶场的文章就介绍到这了,更多相关内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文地址:https://blog.csdn.net/leeezp/article/details/126783259

延伸 · 阅读

精彩推荐