如何利用原生库和JNI实现H2数据库漏洞利用


本篇文章给大家分享的是有关如何利用原生库和JNI实现H2数据库漏洞利用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。通过使用原生库(.dll或.so)和Java原生接口(JNI),找到一种新的方法来执行任意Java代码,而无需在目标服务器上使用Java编译器。假设我们不能使用CREATE ALIAS … AS …命令,因为Java编译器不可用。原因可能是它不是Java Development Kit(JDK)而是Java Runtime Environment(JRE),因此没有编译器。或是由于未正确设置PATH环境变量,导致无法找到Java编译器javac。但是,CREATE ALIAS … FOR …命令可以使用:当引用一个方法时,类必须已经被编译并包含在运行数据库的类路径中。仅支持静态Java方法;类和方法都必须是公共的。因此各个公共静态方法都可以使用。最坏的情况是,只有h3-1.2.141.jar和JRE可用。此外,只有受支持的数据类型可用于嵌套函数调用。在Java运行时库rt.jar中浏览candidates时,我们发现System.load(String)方法允许加载原生库。这意味着我们可以通过库的入口点函数来执行代码。但如何将库加载到H2服务器上呢?虽然Windows上的Java支持UNC路径并提取文件,但其拒绝实际加载它。而且这在Linux上也不起作用。那么,如何将文件写入H2服务器呢?在查看和研究了一些H2函数后,我们发现了一个FILE_WR免费云主机域名ITE文件写入函数。不幸的是,FILE_WRITE是在1.4.190中引入的。而我们需要的是在1.2.141中可用的函数。最终我们找到了一个名为CSVWRITE的函数,这也是唯一一个名称中带“ write”的函数。快速测试显示了CSV列标头也被打印了出来。查看CSV选项,可以看到有一个writeColumnHeader选项可用于禁用写入列标头。不幸的是,writeColumnHeader选项仅被添加在了1.3/1.4.177上。但是在查看其他受支持的选项fieldSeparator,fieldDelimiter,escape,null和lineSeparator时,我蹦出了一个想法:如果我们将它们全部清空,并使用CSV列标头写入我们的数据,会怎样?如果H2数据库引擎允许列具有任意长度的任意名称,那么我们就能够写入任意数据。查看H2的列语法,列的columnName可以是带引号的名称,定义如下:” anything “
带引号的名称区分大小写,并且可以包含空格。没有最大名称长度。两个双引号可用于在标识符内创建一个单双引号。这听起来很完美。让我们看看我们是否可以在其中放入任意内容,以及CSVWRITE是否具有二进制安全机制。首先,让我们生成涵盖所有8-bit octet的测试数据:现在我们生成一系列CHAR(n)函数调用,它们将在SQL查询中生成我们的二进制数据:然后,我们在以下CSVWRITE调用中使用它:最后,我们测试写入的文件是否具有相同的校验和:可以看到,文件应该是相同的!既然我们可以使用内置函数CSVWRITE,将原生库写入磁盘并通过为System.load(String)创建别名来加载它,我们就可以使用库的入口点来实现代码执行。让我们更进一步,看看是否有办法从SQL执行任意命令/代码。Java Native Interface(JNI)允许原生代码和Java虚拟机(JVM)之间的交互。因此,在这种情况下,它将允许我们与运行H2数据库的JVM进行交互。现在,我的想法是使用JNI通过ClassLoader.defineClass(byte[], int, int)将自定义Java类注入到运行的JVM中。这将允许我们创建一个别名并从SQL调用它。使用 JNI 调用 JVM首先,我们需要获得正在运行的JVM的句柄。这可以通过JNI_GetCreatedJavaVMs函数来完成。然后,将当前线程附加到VM,并获得JNI接口指针(JNIEnv)。 使用该指针,我们可以与JVM交互并调用JNI函数,例如FindClass,GetStaticMethodID/GetMethodID>和 CallStaticMethod/CallMethod。 计划是通过ClassLoader.getSystemClassLoader()获取系统类加载器并调用defineClass:这基本上是模仿了以下Java代码:自定义Java类JNIScriptEngine只有一个公共静态方法,它使用可用的ScriptEngine实例评估传递的脚本:最终,整合在一起的代码如下:这样我们就可以从SQL执行任意的JavaScript代码了。以上就是如何利用原生库和JNI实现H2数据库漏洞利用,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注云编程开发博客行业资讯频道。

相关推荐: 如何利用树莓派3和RTL-SDR V3搭建一个低成本的QRP小功率监测点

小编给大家分享一下如何利用树莓派3和RTL-SDR V3搭建一个低成本的QRP小功率监测点,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!QRP是无线电通讯简语中的小功率通讯的代词,像FT8,JT9,JT65和WSPR这些数字模式是被设计用来在…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/03 13:23
下一篇 02/03 13:24