Oracle injection
Надайте цьому посту копію з машини часу видаленого посту з https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.
SSRF
Використання Oracle для виконання запитів Out of Band HTTP та DNS добре задокументовано, але як засіб виведення даних SQL в ін'єкціях. Ми завжди можемо модифікувати ці техніки/функції для виконання інших SSRF/XSPA.
Встановлення Oracle може бути дуже болісним, особливо якщо ви хочете швидко налаштувати екземпляр для спроби виконання команд. Мій друг та колега з Appsecco, Abhisek Datta, направив мене на https://github.com/MaksymBilenko/docker-oracle-12c, що дозволило мені налаштувати екземпляр на машині AWS Ubuntu t2.large та Docker.
Я виконав команду docker з прапорцем --network="host"
, щоб я міг імітувати Oracle як встановлення на місці з повним мережевим доступом, на протязі цього блогпосту.
Пакети Oracle, які підтримують URL або вказання імені хоста/номера порту
Для пошуку будь-яких пакетів та функцій, які підтримують вказівку хоста та порту, я виконав пошук Google у Онлайн-документації Oracle Database. Конкретно,
Пошук повернув наступні результати (не всі можуть бути використані для виконання вихідної мережі)
DBMS_NETWORK_ACL_ADMIN
UTL_SMTP
DBMS_XDB
DBMS_SCHEDULER
DBMS_XDB_CONFIG
DBMS_AQ
UTL_MAIL
DBMS_AQELM
DBMS_NETWORK_ACL_UTILITY
DBMS_MGD_ID_UTL
UTL_TCP
DBMS_MGWADM
DBMS_STREAMS_ADM
UTL_HTTP
Цей грубий пошук очевидно пропускає пакети, такі як DBMS_LDAP
(який дозволяє передавати ім'я хоста та номер порту), оскільки сторінка документації просто вказує вас на інше місце. Таким чином, можуть існувати інші пакети Oracle, які можна використовувати для виконання вихідних запитів, які я можу пропустити.
У будь-якому випадку, давайте розглянемо деякі з пакетів, які ми виявили та перерахували вище.
DBMS_LDAP.INIT
Пакет DBMS_LDAP
дозволяє отримувати доступ до даних з LDAP-серверів. Функція init()
ініціалізує сеанс з LDAP-сервером та приймає ім'я хоста та номер порту як аргумент.
Цю функцію раніше документували для показу витоку даних через DNS, як показано нижче
Однак, оскільки функція приймає хост та номер порту як аргументи, ви можете використати це для роботи як сканер портів.
Ось кілька прикладів
Помилка ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.
показує, що порт закритий, тоді як значення сеансу вказує на те, що порт відкритий.
UTL_SMTP
Пакет UTL_SMTP
призначений для відправлення електронних листів через SMTP. Приклад, наведений на сайті документації Oracle, показує, як ви можете використовувати цей пакет для відправлення електронної пошти. Однак для нас цікава можливість вказати хост та порт.
Нижче показаний приклад з функцією UTL_SMTP.OPEN_CONNECTION
, з таймаутом 2 секунди.
Помилка ORA-29276: тайм-аут передачі
показує, що порт відкритий, але з'єднання SMTP не було встановлено, тоді як помилка ORA-29278: тимчасова помилка SMTP: 421 Служба недоступна
показує, що порт закритий.
UTL_TCP
Пакет UTL_TCP
та його процедури та функції дозволяють комунікацію на основі TCP/IP з послугами. Якщо програмувати для конкретної служби, цей пакет може легко стати шляхом у мережу або виконувати повні запити на сервер, оскільки всі аспекти з'єднання TCP/IP можна контролювати.
Приклад на сайті документації Oracle показує, як ви можете використовувати цей пакет для встановлення прямого з'єднання TCP для отримання веб-сторінки. Ми можемо спростити це ще більше і використовувати його для виконання запитів до екземпляра метаданих, наприклад, або до довільної служби TCP/IP.
Цей пакет можна використовувати для запиту служби метаданих екземпляра всіх хмарних постачальників, оскільки тип методу та додаткові заголовки можуть бути передані в межах запиту TCP.
UTL_HTTP та веб-запити
Можливо, найпоширеніша та широко документована техніка в кожному посібнику з Oracle SQL Injection Out of Band - це пакет UTL_HTTP
. Цей пакет визначений документацією як - Пакет UTL_HTTP здійснює виклики протоколу передачі гіпертексту (HTTP) з SQL та PL/SQL. Ви можете використовувати його для доступу до даних в Інтернеті через HTTP.
Ви також можете використовувати це для виконання деякого примітивного сканування портів за допомогою запитів такого типу:
Помилка ORA-12541: TNS:no listener
або TNS:operation timed out
свідчить про те, що TCP-порт закритий, тоді як помилка ORA-29263: HTTP protocol error
або дані свідчать про те, що порт відкритий.
Ще один пакет, який я використовував у минулому з різним успіхом, - це GETCLOB()
метод абстрактного типу Oracle HTTPURITYPE
, який дозволяє взаємодіяти з URL та надає підтримку протоколу HTTP. Метод GETCLOB()
використовується для отримання відповіді GET з URL у вигляді типу даних CLOB.[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
Last updated