字体对话框java实验_Java Web安全 || Java基础 sun.misc.Unsafe
点击上方“凌天实验室”,“星标或置顶公众号”
漏洞、技术还是其他,我都想第一时间和你分享
“
【历史】已连载更新全部内容:【菜单栏】-【JAVA SEC】
sun.misc.Unsafe
是Java底层API(仅限Java内部使用,反射可调用
)提供的一个神奇的Java类,Unsafe
提供了非常底层的内存、CAS、线程调度、类、对象
等操作、Unsafe
正如它的名字一样它提供的几乎所有的方法都是不安全的,本节只讲解如何使用Unsafe
定义Java类、创建类实例。
如何获取Unsafe对象
Unsafe
是Java内部API,外部是禁止调用的,在编译Java类时如果检测到引用了Unsafe
类也会有禁止使用的警告:Unsafe是内部专用 API, 可能会在未来发行版中删除
。
sun.misc.Unsafe
代码片段:
import sun.reflect.CallerSensitive;import sun.reflect.Reflection;
public final class Unsafe {
private static final Unsafe theUnsafe;
static { theUnsafe = new Unsafe(); 省去其他代码...... }
private Unsafe() { }
@CallerSensitivepublic static Unsafe getUnsafe() { Class var0 = Reflection.getCallerClass();if (var0.getClassLoader() != null) {throw new SecurityException("Unsafe"); } else {return theUnsafe; } }
省去其他代码......}
由上代码片段可以看到,Unsafe
类是一个不能被继承的类且不能直接通过new
的方式创建Unsafe
类实例,如果通过getUnsafe
方法获取Unsafe
实例还会检查类加载器,默认只允许Bootstrap Classloader
调用。
既然无法直接通过Unsafe.getUnsafe()
的方式调用,那么可以使用反射的方式去获取Unsafe
类实例。
反射获取Unsafe
类实例代码片段:
// 反射获取Unsafe的theUnsafe成员变量
当然我们也可以用反射创建Unsafe
类实例的方式去获取Unsafe
对象:
// 获取Unsafe无参构造方法Constructor constructor = Unsafe.class.getDeclaredConstructor();
// 修改构造方法访问权限constructor.setAccessible(true);
// 反射创建Unsafe类实例,等价于 Unsafe unsafe1 = new Unsafe();Unsafe unsafe1 = (Unsafe) constructor.newInstance();
获取到了Unsafe
对象我们就可以调用内部的方法了。
allocateInstance无视构造方法创建类实例
假设我们有一个叫com.anbai.sec.unsafe.UnSafeTest
的类,因为某种原因我们不能直接通过反射的方式去创建UnSafeTest
类实例,那么这个时候使用Unsafe
的allocateInstance
方法就可以绕过这个限制了。
UnSafeTest代码片段:
public class UnSafeTest {
private UnSafeTest() {// 假设RASP在这个构造方法中插入了Hook代码,我们可以利用Unsafe来创建类实例 System.out.println("init..."); }
}
使用Unsafe创建UnSafeTest对象:
// 使用Unsafe创建UnSafeTest类实例UnSafeTest test = (UnSafeTest) unsafe1.allocateInstance(UnSafeTest.class);
Google的GSON
库在JSON反序列化的时候就使用这个方式来创建类实例,在渗透测试中也会经常遇到这样的限制,比如RASP限制了java.io.FileInputStream
类的构造方法导致我们无法读文件或者限制了UNIXProcess/ProcessImpl
类的构造方法导致我们无法执行本地命令等。
defineClass直接调用JVM创建类对象
ClassLoader
章节我们讲了通过ClassLoader
类的defineClass0/1/2
方法我们可以直接向JVM中注册一个类,如果ClassLoader
被限制的情况下我们还可以使用Unsafe
的defineClass
方法来实现同样的功能。
Unsafe
提供了一个通过传入类名、类字节码的方式就可以定义类的defineClass
方法:
public native Class defineClass(String var1, byte[] var2, int var3, int var4);
public native Class> defineClass(String var1, byte[] var2, int var3, int var4, ClassLoader var5, ProtectionDomain var6);
使用Unsafe创建TestHelloWorld对象:
// 使用Unsafe向JVM中注册com.anbai.sec.classloader.TestHelloWorld类Class helloWorldClass = unsafe1.defineClass(TEST_CLASS_NAME, TEST_CLASS_BYTES, 0, TEST_CLASS_BYTES.length);
或调用需要传入类加载器和保护域的方法:
// 获取系统的类加载器ClassLoader classLoader = ClassLoader.getSystemClassLoader();
// 创建默认的保护域ProtectionDomain domain = new ProtectionDomain(new CodeSource(null, (Certificate[]) null), null, classLoader, null);
// 使用Unsafe向JVM中注册com.anbai.sec.classloader.TestHelloWorld类Class helloWorldClass = unsafe1.defineClass( TEST_CLASS_NAME, TEST_CLASS_BYTES, 0, TEST_CLASS_BYTES.length, classLoader, domain);
Unsafe
还可以通过defineAnonymousClass
方法创建内部类,这里不再多做测试。
注意:
这个实例仅适用于Java 8
以前的版本如果在Java 8
中应该使用应该调用需要传类加载器和保护域的那个方法。Java 11
开始Unsafe
类已经把defineClass
方法移除了(defineAnonymousClass
方法还在),虽然可以使用java.lang.invoke.MethodHandles.Lookup.defineClass
来代替,但是MethodHandles
只是间接的调用了ClassLoader
的defineClass
,所以一切也就回到了ClassLoader
。
**如果您在阅读文章的时候发现任何问题都可以通过Vchat与我们联系,也欢迎大家加入javasec微信群一起交流。
Vchat获取方式:对话框发送“javasec”
凌天实验室
凌天实验室,是安百科技旗下针对应用安全领域进行攻防研究的专业技术团队,其核心成员来自原乌云创始团队及社区知名白帽子,团队专业性强、技术层次高且富有实战经验。实验室成立于2016年,发展至今团队成员已达35人,在应用安全领域深耕不辍,向网络安全行业顶尖水平攻防技术团队的方向夯实迈进。
字体对话框java实验_Java Web安全 || Java基础 sun.misc.Unsafe相关推荐
- 【Java报错】记录一次 sun.misc.Unsafe.park(Native Method) Conflicting setter definitions for property 导致的内存泄露
1. 报错信息 2021-10-29 08:44:56 WARN [,,,] [main] o.a.c.loader.WebappClassLoaderBase - The web applicati ...
- java unsafe park_在sun.misc.Unsafe.park(本机方法)中等待
我的一个应用程序在负载下运行一段时间后挂起,有人知道是什么会导致jstack中的此类输出: "scheduler-5" prio=10 tid=0x00007f49481d0000 ...
- java unsafe park_java – WAITING at sun.misc.Unsafe.park(Native Method)
我的一个应用程序在一段负载运行的时间内挂起,有谁知道在jstack中可能会导致这样的输出: "scheduler-5" prio=10 tid=0x00007f49481d0000 ...
- java实验2总结心得,java实验的心得体会
java实验的心得体会 java实验心得体会篇一:java实验总结 1. 设计一个Person类,包含:姓名,年龄,性别.要求:该类至多只能创建一男.一女两个对象! 2. 设计一个测试类Test,创建 ...
- Java实验报告一:Java环境使用配置
Java实验报告一:Java开发环境的安装与配置 一. 实验目的 1.熟练掌握Java开发环境的安装配置和程序调试过程. 二. 实验内容 1.实验步骤: ⑴. 在Windows操作系统下安装JDK6. ...
- 云南大学软件学院java实验九_云南大学java实验9
java实验 (9) 6页 2下载券 Java实验9 4页 2下载券 JAVA实验9 7页 1下载券 java 实验9 暂无评价 1页 免费 Java上机实验9 4页 免费 云大JAVA 实验9图形. ...
- 聊聊高并发(十七)解析java.util.concurrent各个组件(一) 了解sun.misc.Unsafe类
了解了并发编程中锁的基本原理之后,接下来看看Java是如何利用这些原理来实现各种锁,原子变量,同步组件的.在开始分析java.util.concurrent的源代码直接,首先要了解的就是sun.mis ...
- 在Java 9中使用sun.misc.Unsafe
Java 9 EA版本已经发布,现在我们可以看到如何使用sun.misc.Unsafe. 我领导了公开运动,以保留对Java 9的访问,该访问最终成功,从而导致对JEP 260的修订. 那么,事情如何 ...
- JVM 的 Finalization Delay 引起的 OOM(java.lang.OutOfMemoryError:null at sun.misc.Unsafe.allocateMemory.)
今天在压力测试环境某一个服务出现crash了,经过一番检查,终于发现是由于JVM的Finalization Delay引起的,这个问题比较特殊,这里记录一下. 这个服务是用Java写的,主要完成的功能 ...
最新文章
- java界面设计素材_9.java图形用户界面设计.ppt
- 基于 python + WebDriverAgent 的“跳一跳”小程序高分教程
- numpy.arange详解
- android 如何重载函数,android - 如何在Frida中使用“ int”重载函数 - 堆栈内存溢出...
- 注意力机制可视化_Attention isn’t all you need!BERT的力量之源远不止注意力
- Linux基础——操作系统框架
- 拖得太久了 美运营商ATT取消三星折叠手机Galaxy Fold预购订单
- 天猫标的就是虚价,果然败家节啊
- 网页布局02 盒子模型
- wamp环境下php命令运行时出现错误:无法启动此程序,因为计算机中丢失OCI.dll。尝试重新安装该程序以解决此问题...
- 4.2 录制第一个jmeter性能测试脚本(http协议)
- Python unrar解压rar压缩文件
- 商业调查——您可以下载 16 个免费问卷模板
- Codeforces Round #429 (Div. 2) B. Godsend
- 归档命令(5)——shar
- 2023北方民族大学计算机考研信息汇总
- 激光通过散射介质的聚焦
- 什么叫分销商_分销是什么意思「详细介绍」带你秒懂
- 超详细c语言简化tcp通信接口(多线程实现一个服务端处理多个客户端服务)
- antd_Ant Design Pro_Vue打包问题:使用静态本地文件路径访问
热门文章
- How is an SAP OData Batch request handled in the backend
- different color in Chrome Development Tool
- 从bsp redirect到ui5_ui5
- 代码改动和配置文件相分离
- ABAP Decimal byte
- Kubernetes pod状态出现CrashLoopBackOff 的原因
- SAPGUI系统登录页面配置的SAProuter有什么用 2
- 系统接口对接的进度工作应该谁来干_第三方分账系统开发的那些坑,给你节省几十万...
- uniapp 定时执行_ftp上传,完成ftp定时上传、下载只需3步
- 怎么获取php文件,学习猿地-php怎么获取文件修改时间?