Basic Java Deserialization (ObjectInputStream, readObject)

Support HackTricks

Katika POST hii itafafanuliwa mfano ukitumia java.io.Serializable.

Serializable

Java Serializable interface (java.io.Serializable ni interface ya alama ambayo darasa zako lazima zitekeleze ikiwa zinapaswa kuwa serialized na deserialized. Uandishi wa serialization ya kitu cha Java unafanywa na ObjectOutputStream na usomaji wa deserialization unafanywa na ObjectInputStream.

Hebu tuone mfano wa darasa la Person ambalo ni serializable. Darasa hili linakandamiza kazi ya readObject, hivyo wakati kitu chochote cha darasa hili kinapokuwa deserialized kazi hii itatekelezwa. Katika mfano, kazi ya readObject ya darasa la Person inaita kazi eat() ya mnyama wake na kazi eat() ya Mbwa (kwa sababu fulani) inaita calc.exe. Tutashuhudia jinsi ya kuunda na kuondoa kitu cha Person ili kutekeleza kalkuleta hii:

Mfano ufuatao umetolewa kutoka https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649

import java.io.Serializable;
import java.io.*;

public class TestDeserialization {
interface Animal {
public void eat();
}
//Class must implements Serializable to be serializable
public static class Cat implements Animal,Serializable {
@Override
public void eat() {
System.out.println("cat eat fish");
}
}
//Class must implements Serializable to be serializable
public static class Dog implements Animal,Serializable {
@Override
public void eat() {
try {
Runtime.getRuntime().exec("calc");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("dog eat bone");
}
}
//Class must implements Serializable to be serializable
public static class Person implements Serializable {
private Animal pet;
public Person(Animal pet){
this.pet = pet;
}
//readObject implementation, will call the readObject from ObjectInputStream  and then call pet.eat()
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
pet = (Animal) stream.readObject();
pet.eat();
}
}
public static void GeneratePayload(Object instance, String file)
throws Exception {
//Serialize the constructed payload and write it to the file
File f = new File(file);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
out.writeObject(instance);
out.flush();
out.close();
}
public static void payloadTest(String file) throws Exception {
//Read the written payload and deserialize it
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
Object obj = in.readObject();
System.out.println(obj);
in.close();
}
public static void main(String[] args) throws Exception {
// Example to call Person with a Dog
Animal animal = new Dog();
Person person = new Person(animal);
GeneratePayload(person,"test.ser");
payloadTest("test.ser");
// Example to call Person with a Cat
//Animal animal = new Cat();
//Person person = new Person(animal);
//GeneratePayload(person,"test.ser");
//payloadTest("test.ser");
}
}

Hitimisho

Kama unavyoona katika mfano huu wa msingi, "udhaifu" hapa unaonekana kwa sababu ya kazi ya readObject ambayo in aita kazi nyingine zenye udhaifu.

Last updated