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



相关文章
|
6月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
303 1
|
6月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
318 1
|
7月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
827 0
|
7月前
|
存储 安全 前端开发
Web渗透-文件上传漏洞-上篇
文件上传漏洞常见于Web应用,因类型限制不严可致恶意文件执行。本文介绍前端检测、MIME类型、黑名单、.htaccess、空格、双写等多种绕过方式,并结合upload-labs靶场演示利用方法,提升安全防护认知。
1876 1
Web渗透-文件上传漏洞-上篇
|
7月前
|
安全 中间件 应用服务中间件
WEB渗透-文件上传漏洞-下篇
本文详解文件上传安全漏洞,涵盖白名单绕过(如00截断、条件竞争)、图片木马制作与利用、以及IIS、Apache、Nginx等常见解析漏洞原理与防御。结合实战案例,深入剖析攻击手法与修复方案。
535 1
|
7月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
691 1
|
7月前
|
安全 测试技术 程序员
web渗透-文件包含漏洞
文件包含漏洞源于程序动态包含文件时未严格校验用户输入,导致可加载恶意文件。分为本地和远程包含,常见于PHP,利用伪协议、日志或session文件可实现代码执行,需通过合理过滤和配置防范。
1144 79
web渗透-文件包含漏洞
|
7月前
|
存储 JavaScript 安全
Web渗透-XSS漏洞深入及xss-labs靶场实战
XSS(跨站脚本攻击)是常见的Web安全漏洞,通过在网页中注入恶意脚本,窃取用户信息或执行非法操作。本文介绍其原理、分类(反射型、存储型、DOM型)、测试方法及xss-labs靶场实战案例,帮助理解与防御XSS攻击。
2294 1
Web渗透-XSS漏洞深入及xss-labs靶场实战
|
7月前
|
安全 程序员 数据库连接
web渗透-CSRF漏洞
CSRF(跨站请求伪造)是一种常见的Web安全漏洞,攻击者通过伪造用户请求,诱使其在已登录状态下执行非意愿操作。本文介绍CSRF原理、分类(站外与站内)、DVWA靶场搭建及防御措施,如同源策略与Token验证,提升安全防护意识。
617 0
web渗透-CSRF漏洞
|
安全 前端开发 Java
网站代码漏洞审计之JAVA架构
以前诸位看到过大牛的php代码审计,但是后来由于技术需要学了Java的代码审计,刚来时实战演练检测自个的技术成果,实际上代码审计我觉得不单单是取决于源代码方面的检测,包含你去构建布署下去和去黑盒测试方法作用点相匹配的源代码中去探索这一环节是最重要的,在代码审计中通常全部都是静下心去一步步的探索就可以峰回路转了!
271 0
网站代码漏洞审计之JAVA架构