Oracle injection
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.
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,
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
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:
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.
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.
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.
Możesz dodatkowo użyć tego do wykonania podstawowego skanowania portów za pomocą zapytań takich jak:
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;
Last updated