Java反序列化Commons-Collection篇05-CC2链

<1> 环境分析

jdk:jdk8u65
CC:Commons-Collections 4.0
pom.xml 添加

1
2
3
4
5
<dependency>  
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
阅读更多

Java反序列化Commons-Collection篇04-CC4链

<1>环境分析

因为 CommonsCollections4 除 4.0 的其他版本去掉了 InvokerTransformer 不再继承 Serializable,导致无法序列化。
同时 CommonsCollections 4的版本 TransformingComparator 继承了 Serializable接口,而CommonsCollections 3里是没有的。这个就提供了一个攻击的路径

jdk:jdk8u65
CC:Commons-Collections 4.0
pom.xml 添加

1
2
3
4
5
<dependency>  
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
阅读更多

Java反序列化Commons-Collection篇03-CC3链

<1> 环境分析

前两条 CC1和CC6利用invoke反射调用Runtime().getRuntime().exec()执行命令 很多时候服务器的代码当中的黑名单会选择禁用 Runtime

CC3是利用类加载机制,动态加载恶意类来实现自动执行恶意类代码的

这里测试环境为:
jdk:jdk8u65
CC:Commons-Collections 3.2.1

阅读更多

Java基础篇-类加载机制

<1>Javac原理

javac是用于将源码文件.java编译成对应的字节码文件.class。
其步骤是:源码——>词法分析器组件(生成token流)——>语法分析器组件(语法树)——>语义分析器组件(注解语法树)——>代码生成器组件(字节码)

<2>类加载过程

先在方法区找class信息,有的话直接调用,没有的话则使用类加载器加载到方法区(静态成员放在静态区,非静态成功放在非静态区),静态代码块在类加载时自动执行代码,非静态的不执行;先父类后子类,先静态后非静态;静态方法和非静态方法都是被动调用,即不调用就不执行

阅读更多

Java反序列化Commons-Collection篇02-CC6链

<1>环境分析

实际上 CC6链子 又是CC1的一个变种 没有版本限制
找到这个漏洞的人又开辟出 一个新的线路 通过 TiedMapEntry.hashcode() 去触发 CC1里的 LazyMap.get()

这里我们是继续沿用的CC1 的项目
jdk版本:jdk8u65
pom.xml内容:

1
2
3
4
5
6
7
8
<dependencies>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
</dependencies>

阅读更多

Java反序列化Commons-Collection篇01-CC1链

<1> 环境配置

因为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
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
</dependencies>
阅读更多

Java基础篇-注解与反射

注解(Annotation)

注解Annotation 是 JDK5.0 引入的一种注释机制

Annotation的作用:

  • 不是程序本身,可以对程序作出解释
  • 可以被其他程序(比如:编译器等)读取

Annotation的作用:

  • 注解是以”@注释名”在代码中存在的,还可以添加一些参数值

Annotation在哪里使用?

  • 可以附加在package、class、method、field上,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问
阅读更多

Java反序列化初探+URLDNS链

摘要:什么是java反序列化&URLDNS链分析

<1> 什么是序列化/反序列化

序列化,其实就是将数据转化成一种可逆的数据结构,自然,它的逆过程就叫做反序列化。

目的: 方便数据的传输与存储

通常我们在编程的时候,我们需要将本地已经实例化的某个对象,通过网络传递到其他机器当中。为了满足这种需求,就有了所谓的序列化和反序列化

不同于php序列化对象 O:4:"test":2:{s:3:"str";s:5:"luoke";s:3:"int";i:10;} 是一串数据,Java序列化之后成了二进制文件 是 字节流

(1) 为什么会产生安全问题?

java反序列化漏洞的关键出现在 readObject 上,反序列化必定执行readObject方法,而在执行java.io.ObjectInputStream.readObject()之前,会先尝试执行 反序列化的类的 readObject方法,如果这个类重构了readObject方法,错误的调用了一些危险方法,则会造成漏洞。

只要服务端反序列化数据,客户端传递类的readObject中代码会自动执行,给予攻击者在服务器上运行代码的能力.

阅读更多