Unsafe
sun.misc.Unsafe
是Java底层API(仅限Java内部使用,反射可调用
)提供的一个神奇的Java类,Unsafe
提供了非常底层的内存、CAS、线程调度、类、对象
等操作、Unsafe
正如它的名字一样它提供的几乎所有的方法都是不安全的,本节只讲解如何使用Unsafe
定义Java类、创建类实例。
由于Unsafe是禁止外部调用的,我们可以先看看Unsafe的代码片段,看看如何通过反射获取Unsafe实例
1 | import sun.reflect.CallerSensitive; |
获取Unsafe实例
我们从上面的代码可以看到有2种方式获取Unsafe实例,以下分别介绍下这两种方式.
调用私有构造方法
1 | public static void main(String[] args) throws Exception { |
获取私有属性theUnsafe
1 | public static void main(String[] args) throws Exception { |
allocateInstance无视构造方法创建类实例
假设我们有一个叫UnSafeTest
的类,因为某种原因我们不能直接通过反射的方式去创建UnSafeTest
类实例,那么这个时候使用Unsafe
的allocateInstance
方法就可以绕过这个限制了。
1 | package top.longlone; |
Google的库在JSON反序列化的时候就使用这个方式来创建类实例,在渗透测试中也会经常遇到这样的限制,比如RASP限制了类的构造方法导致我们无法读文件或者限制了类的构造方法导致我们无法执行本地命令等。
defineClass直接调用JVM创建类对象
1 | package top.longlone; |