Oracle injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Serve this post a wayback machine copy of the deleted post from https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.
Використання Oracle для виконання Out of Band HTTP та DNS запитів добре задокументовано, але як засіб ексфільтрації SQL даних в ін'єкціях. Ми завжди можемо модифікувати ці техніки/функції для виконання інших SSRF/XSPA.
Встановлення Oracle може бути дійсно болісним, особливо якщо ви хочете налаштувати швидкий екземпляр для випробування команд. Мій друг і колега з Appsecco, Abhisek Datta, вказав мені на https://github.com/MaksymBilenko/docker-oracle-12c, що дозволило мені налаштувати екземпляр на t2.large AWS Ubuntu машині та Docker.
Я запустив команду docker з прапором --network="host"
, щоб я міг імітувати Oracle як рідну установку з повним доступом до мережі, протягом цього блогу.
Щоб знайти будь-які пакети та функції, які підтримують специфікацію хоста та порту, я провів пошук в Google на Oracle Database Online Documentation. Конкретно,
Результати пошуку повернули наступні результати (не всі можуть бути використані для виконання вихідної мережі)
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, як нижче
Однак, враховуючи, що функція приймає ім'я хоста та номер порту як аргументи, ви можете використовувати це, щоб працювати як сканер портів.
Ось кілька прикладів
A ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.
вказує на те, що порт закритий, тоді як значення сесії вказує на те, що порт відкритий.
UTL_SMTP
Пакет UTL_SMTP
призначений для надсилання електронних листів через SMTP. Приклад, наведений на сайті документації Oracle, показує, як ви можете використовувати цей пакет для надсилання електронного листа. Для нас, однак, цікавою є можливість вказати хост і специфікацію порту.
Нижче наведено грубий приклад з функцією UTL_SMTP.OPEN_CONNECTION
, з тайм-аутом 2 секунди.
A ORA-29276: transfer timeout
показує, що порт відкритий, але жодне SMTP з'єднання не було встановлено, тоді як ORA-29278: SMTP transient error: 421 Service not available
показує, що порт закритий.
UTL_TCP
Пакет UTL_TCP
та його процедури і функції дозволяють TCP/IP на основі зв'язку з сервісами. Якщо він запрограмований для конкретного сервісу, цей пакет може легко стати шляхом у мережу або виконати повні запити на стороні сервера, оскільки всі аспекти TCP/IP з'єднання можуть бути контрольовані.
Приклад на сайті документації Oracle показує, як ви можете використовувати цей пакет для створення сирого TCP з'єднання для отримання веб-сторінки. Ми можемо трохи спростити це і використовувати його для виконання запитів до екземпляра метаданих, наприклад, або до довільного TCP/IP сервісу.
Цікаво, що завдяки можливості створювати сирі TCP запити, цей пакет також можна використовувати для запитів до служби метаданих екземпляра всіх постачальників хмарних послуг, оскільки тип методу та додаткові заголовки можуть бути передані в межах TCP запиту.
UTL_HTTP та веб-запити
Мабуть, найпоширеніша та найдокументованіша техніка в кожному навчальному посібнику з Out of Band Oracle SQL Injection - це UTL_HTTP
package. Цей пакет визначається документацією як - The UTL_HTTP package makes Hypertext Transfer Protocol (HTTP) callouts from SQL and PL/SQL. You can use it to access data on the Internet over HTTP.
Ви також можете використовувати це для виконання деякого елементарного сканування портів за допомогою запитів, таких як
ORA-12541: TNS:no listener
або TNS:operation timed out
є ознакою того, що TCP порт закритий, тоді як ORA-29263: HTTP protocol error
або дані є ознакою того, що порт відкритий.
Інший пакет, який я використовував у минулому з різним успіхом, це GETCLOB()
метод абстрактного типу HTTPURITYPE
Oracle, який дозволяє взаємодіяти з URL і надає підтримку для HTTP протоколу. Метод GETCLOB()
використовується для отримання GET відповіді з URL як CLOB типу даних.[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)