'Java反序列化-cc2'
环境
和cc4相同
CC2 这条链实际上是在 CC4 链基础上的修改,目的是为了避免使用 Transformer 数组。
原本的 CC1 链与 CC6 链是通过 Runtime.exec() 进行命令执行的。
而CC3 链这条链子,是使用 类加载机制 来执行恶意代码的。
可以理解为cc1 cc6是命令执行;而cc3是代码执行。
前提知识:利用 ClassLoader#defineClass 直接加载字节码。
忘记的了同学,可以去看,java反序列化-基础中的 类加载流程(调试) 部分。
ClassLoader.loadClass() --> ClassLoader.findClass() --> ClassLoader.defineClass()
cc6的攻击链后面部分(尾部exec方法)也和之前cc1的一样。
特点: CC6 链,可以不受 jdk 版本制约。
LayzMap的get()–>this.factory.transformer()–>ChainedTransformer.transform()–>InvokerTransformer.transform()–>runtime.exec
上一篇我们分析的是TransformedMap的利用链,是此链条传入国内后,国内研究员的分析。
这次我们分析正版yso中的cc1 LazyMap 利用链。LazyMap相比之前的会更加麻烦一些,同时会用到动态代理。
IO是指 Input/Output,即输入和输出。以内存为中心:
代码是在内存中运行的,数据也必须读到内存,最终的表示方式无非是 byte数 组,字符串等,都必须存放在内存里。
Apache Commons是Apache开源的Java通用类项目在Java中项目中被广泛的使用,Apache Commons当中有一个组件叫做Apache Commons Collections,主要封装了Java的Collection(集合)相关类对象。
以下是Collections的包结构和简单介绍,如果你想了解更多的各个包下的接口和实现,请参考Apache Commons Collections 3.2.2 API文档 。
由于我们测试时要用到多个jdk。
所以直接虚拟机安装多个jdk,将jdk目录拷贝到物理机中。在使用时进行切换。
readObject中的代码会自动执行,给予攻击者在服务器上运行代码的能力。
1、直接通过入口类的readObject直接调用危险方法。
2、入口类参数包含可控类,该类有危险方法。
3、继续套娃,入口类包含可控类,该类有调用其他有危险方法的类,readObject时调用。
pojo类中添加代码:
1 | private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException { |
流程:正常进行序列化与反序列化,调用readObject,ObjectInputStream输入流,读取defaultReadObject对象。执行calc命令。