Java反序列化Commons-Collection篇05-CC2链
<1> 环境分析
jdk:jdk8u65
CC:Commons-Collections 4.0
pom.xml 添加
1 | <dependency> |
Java反序列化Commons-Collection篇05-CC2链
jdk:jdk8u65
CC:Commons-Collections 4.0
pom.xml 添加
1 | <dependency> |
Java反序列化Commons-Collection篇04-CC4链
因为 CommonsCollections4 除 4.0 的其他版本去掉了 InvokerTransformer 不再继承 Serializable,导致无法序列化。
同时 CommonsCollections 4的版本 TransformingComparator 继承了 Serializable接口,而CommonsCollections 3里是没有的。这个就提供了一个攻击的路径
jdk:jdk8u65
CC:Commons-Collections 4.0
pom.xml 添加
1 | <dependency> |
Java反序列化Commons-Collection篇03-CC3链
前两条 CC1和CC6利用invoke反射调用Runtime().getRuntime().exec()执行命令 很多时候服务器的代码当中的黑名单会选择禁用 Runtime
CC3是利用类加载机制,动态加载恶意类来实现自动执行恶意类代码的
这里测试环境为:
jdk:jdk8u65
CC:Commons-Collections 3.2.1
javac是用于将源码文件.java编译成对应的字节码文件.class。
其步骤是:源码——>词法分析器组件(生成token流)——>语法分析器组件(语法树)——>语义分析器组件(注解语法树)——>代码生成器组件(字节码)
先在方法区找class信息,有的话直接调用,没有的话则使用类加载器加载到方法区(静态成员放在静态区,非静态成功放在非静态区),静态代码块在类加载时自动执行代码,非静态的不执行;先父类后子类,先静态后非静态;静态方法和非静态方法都是被动调用,即不调用就不执行

Java反序列化Commons-Collection篇02-CC6链
实际上 CC6链子 又是CC1的一个变种 没有版本限制
找到这个漏洞的人又开辟出 一个新的线路 通过 TiedMapEntry.hashcode() 去触发 CC1里的 LazyMap.get()
这里我们是继续沿用的CC1 的项目
jdk版本:jdk8u65
pom.xml内容:
1 | <dependencies> |
Java反序列化Commons-Collection篇01-CC1链
因为CC1链在jdk 8u71后就修复了 因此我们复现就利用 8u65的版本
去官网下载 jdk8u65
https://www.oracle.com/cn/java/technologies/javase/javase8-archive-downloads.html
然后去 下载openjdk
http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/af660750b2f4/
把下载的openjdk里 /share/classes/ 里面的 sun包 复制到 jdk1.8.0_65里
打开IDEA 新建一个Maven项目 选择 org.apache.maven.archetypes:maven-archetype-webapp
导入commons collections maven依赖
将下面写入到 pom.xml 里
1 | <dependencies> |
注解Annotation 是 JDK5.0 引入的一种注释机制
Annotation的作用:
Annotation的作用:
Annotation在哪里使用?
摘要:什么是java反序列化&URLDNS链分析
序列化,其实就是将数据转化成一种可逆的数据结构,自然,它的逆过程就叫做反序列化。
目的: 方便数据的传输与存储
通常我们在编程的时候,我们需要将本地已经实例化的某个对象,通过网络传递到其他机器当中。为了满足这种需求,就有了所谓的序列化和反序列化
不同于php序列化对象 O:4:"test":2:{s:3:"str";s:5:"luoke";s:3:"int";i:10;} 是一串数据,Java序列化之后成了二进制文件 是 字节流
java反序列化漏洞的关键出现在 readObject 上,反序列化必定执行readObject方法,而在执行java.io.ObjectInputStream.readObject()之前,会先尝试执行 反序列化的类的 readObject方法,如果这个类重构了readObject方法,错误的调用了一些危险方法,则会造成漏洞。
只要服务端反序列化数据,客户端传递类的readObject中代码会自动执行,给予攻击者在服务器上运行代码的能力.