WEB漏洞 JAVA 反序列化

本文涉及的产品
系统运维管理,不限时长
简介: WEB漏洞 JAVA 反序列化

#序列化和反序列化

序列化 (Serialization):将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。

反序列化:从存储区中读取该数据,并将其还原为对象的过程,称为反序列化。

  • Java反序列化及命令执行代码测试
  1. 在IDE创建一个package包,包名为SerialTest
  2. 包中创建三个类文件 Main  Person  SerializableTest

Main文件代码

// 执行DOS命令

package SerialTest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class Main {
    public static void main(String args[]) throws IOException, InterruptedException {
        Process p = Runtime.getRuntime().exec("ipconfig");
        java.io.InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("GBK")));
        p.waitFor();
        if (p.exitValue() != 0){
            // 命令执行失败 进入错误处理步骤中
        }
        String s = null;
        while ((s = reader.readLine()) != null){
            System.out.println(s);
        }
    }
}

Person 文件  

// 待调用类

package SerialTest;
import com.sun.xml.internal.ws.server.ServerRtException;
import java.io.Serializable;
class Person implements Serializable {
    private String name;
    private int age;
    private String sex;
    private int height;
    public Person(){
        this.name = null;
        this.age = 0;
        this.sex = null;
        this.height = 0;
    }
    public Person(String name,int age,String sex,int height){
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.height = height;
    }
    public   String toString(){
        return "Persion{" +
                "name=" + name +
                ", age=" + age +
                ", sex=" + sex +
                ", height=" + height +
                "}";
    }

SerializableTest 文件

// 序列化

package SerialTest;
import java.io.*;
public class SerializableTest {
    public static void main(String[] args) throws Exception {
        serialPerson();
        Person person = deserialPerson();
        System.out.println(person);
    }
    /**
     * Person 对象序列化
     * @throws IOException
     */
    private static void serialPerson() throws IOException{
        Person person = new Person("阿杰",20,"男",175);
        ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream(new File("F:/person.txt"))
        );
        oos.writeObject(person);
        System.out.println("person 对象序列化成功!");
        oos.close();
    }
    /**
     * Person 对象反序列化
     * @return
     * @throws Exception
     */
    private static Person deserialPerson() throws Exception {
        ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream(new File("F:/person.txt"))
        );
        Person person = (Person)ois.readObject();
        System.out.println("person 对象反序列化成功!");
        return person;
    }
}

640.png

代码分析

java中 
在ObjectOutputStream类中 有一个writeObject()方法 把指定的对象进行序列化后
把字节序列写到一个目标输出流中
ObjectInputStream类中 readObject()方法 从一目标输入流中读取字节序列进行反序化
成一个对象 再把结果返回
代码中定义了一个person类 类中含有成员属性 使用writeObject()方法 把对象序列化
写进一个文本里 然后在使用readObject() 方法 从文件中读取字节序列 在还原成源对象

目前没有此文件 运行后


写入文件中的是字节序列 通过readObject()方法 再将对象还原。

如果对象不是字符串 而是一些命令 则反序列化后 利用java exec命令函数进行执行 就会产生命令执行漏洞。

在Web应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用代码或命令执行函数
去处理。比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能
控制这个字符串,将造成代码执行漏洞。同样调用系统命令处理,将造成命令执行漏洞。
php(system()、shell_exec()、exec()、eval())
JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)
ThinkPHP命令执行

比如下图:

执行了ipconfig系统命令

WebGoat_Javaweb靶场反序列化测试

资料链接:

https://github.com/frohoff/ysoserial/releases

https://github.com/WebGoat/WebGoat/releases

cmd  输入 java -jar  webgoat-server-8.0.1.jar

注:JDK8 无法运行 版本较低 安装11以上的版本

浏览器输入 127.0.0.1:8080/WebGoat  

注册一个账号即可

部分源码示例

public static Object fromString(String s)
    throws IOException, ClassNotFoundException
{
    byte[] data = Base64.getDecoder().decode(s);
    ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data));
    Object o = ois.readObject();
    ois.close();
    return o;
  }
  public static String toString(Serializable o)
    throws IOException
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(o);
    oos.close();
    return Base64.getEncoder().encodeToString(baos.toByteArray

将对象序列化后 进行base64加密 变成了图片中的一堆字符

rO0ABXQAVklmIHlvdSBkZXNlcmlhbGl6ZSBtZSBkb3duLCBJIHNoYWxsIGJlY29tZSBtb3JlIHBvd2VyZnVsIHRoYW4geW91IGNhbiBwb3NzaWJseSBpbWFnaW5l

字符串    ——>  字节序列   序列化  writeObject()

字节序列  ——>  字符串     反序列化  readObject()

如何构造payload?

calc  ---->  序列化  ---->  base64加密=rO0AB格式开头的字符串  

java -Dhibernate5 -cp hibernate-core-5.4.9.Final.jar;ysoserial-master-30099844c6-1.jar ysoserial.GeneratePayload Hibernate1 calc.exe > payload.bin



相关文章
|
5天前
|
存储 安全 Java
🌟Java零基础-反序列化:从入门到精通
【10月更文挑战第21天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
24 5
|
6天前
|
存储 缓存 安全
🌟Java零基础:深入解析Java序列化机制
【10月更文挑战第20天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
14 3
|
9天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
22天前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
28天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
WK
|
5天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
9 0
|
9天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
7 0
|
25天前
|
安全 Java Python
基于python-django的Java网站全站漏洞检测系统
基于python-django的Java网站全站漏洞检测系统
29 0
|
22天前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
82 3
|
4天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
74 44