![]() |
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_owner1.Получаем параметр 2.Создаем курсор 3.Парсим курсор 4.Выполняем курсор 5.Вывод на екран. Из php вызывать как Код:
...Вступления и подготовка закончены теперь к делу. Вариант первый: chr(); Код:
SYS' UNION select TABLE_NAME FROM ALL_TABLES '||CHR(119)||'HERE OWNER=''FLOWS_FILES'' --')Как видно выше 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''?=')||' --Footer Данная статья не совсем статья это просто набор советов не более того. Я не использовал base64 сознательно так как в виду популярности данного алгоритма любая нормальная IDS обращает на него внимание да и примеров его использования вы найдете уйму. Я не претендую на то что это единственный способ, наоборот, более того это советы не и предназначены они для того чтоб показать в каком направлении смотреть. P.S Мой русский оставляет желать лучшего, я это знаю и начал над этим работать. (с) 2009 by dsu from Ukrainian Security Community |
| Время: 14:01 |