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



相关文章
|
25天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
46 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
28天前
|
SQL 安全 Java
JavaSecLab 一款综合Java漏洞平台
JavaSecLab是一款综合型Java漏洞学习平台,涵盖多种漏洞场景,提供漏洞代码、修复示例、安全编码规范及友好UI。适用于安全服务、甲方安全培训、安全研究等领域,助于理解漏洞原理与修复方法。支持跨站脚本、SQL注入等多种漏洞类型……
|
1月前
|
Java Maven Spring
Java Web 应用中,资源文件的位置和加载方式
在Java Web应用中,资源文件如配置文件、静态文件等通常放置在特定目录下,如WEB-INF或classes。通过类加载器或Servlet上下文路径可实现资源的加载与访问。正确管理资源位置与加载方式对应用的稳定性和可维护性至关重要。
57 6
|
1月前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
72 4
|
1月前
|
存储 安全 Java
🌟Java零基础-反序列化:从入门到精通
【10月更文挑战第21天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
84 5
|
1月前
|
存储 缓存 安全
🌟Java零基础:深入解析Java序列化机制
【10月更文挑战第20天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
30 3
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
1月前
|
Java 持续交付 项目管理
使用Maven进行项目管理:提高Java Web开发的效率
Maven 是一款强大的项目管理和构建自动化工具,广泛应用于Java社区。它通过依赖管理、构建生命周期管理、插件机制和多模块项目支持等功能,简化了项目的构建过程,提高了开发效率。本文将介绍Maven的核心功能及其在Java Web开发中的应用。
65 0
WK
|
1月前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
99 0