Oracle injection
Diene diesem Beitrag als Wayback-Maschinenkopie des gelöschten Beitrags von 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 modifizieren, um andere SSRF/XSPA durchzuführen.
Die Installation von Oracle kann wirklich schmerzhaft sein, insbesondere wenn du eine schnelle Instanz einrichten möchtest, um Befehle auszuprobieren. Mein Freund und Kollege bei Appsecco, Abhisek Datta, wies mich auf 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 führte den Docker-Befehl mit dem --network="host"
-Flag aus, damit ich Oracle als native Installation mit vollem Netzwerkzugang nachahmen konnte, für den Verlauf dieses Blogbeitrags.
Oracle-Pakete, die eine URL oder eine Hostname/Portnummer-Spezifikation unterstützen
Um Pakete und Funktionen zu finden, die eine Host- und Port-Spezifikation unterstützen, habe ich eine Google-Suche in der Oracle-Datenbank Online-Dokumentation durchgeführt. Genauer gesagt,
Die Suche ergab die folgenden Ergebnisse (nicht alle können verwendet werden, um ausgehende Netzwerke durchzuführen)
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
Diese grobe Suche überspringt offensichtlich Pakete wie DBMS_LDAP
(das die Übergabe eines Hostnamens und einer Portnummer ermöglicht), da die Dokumentationsseite Sie einfach auf einen anderen Ort verweist. Daher kann es andere Oracle-Pakete geben, die missbraucht werden können, um ausgehende Anfragen zu stellen, die ich möglicherweise übersehen habe.
In jedem Fall lassen Sie uns einige der Pakete ansehen, die wir entdeckt und oben aufgelistet haben.
DBMS_LDAP.INIT
Das DBMS_LDAP
-Paket ermöglicht den Zugriff auf Daten von LDAP-Servern. Die Funktion init()
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
Allerdings, da die Funktion einen Hostnamen und eine Portnummer als Argumente akzeptiert, können Sie dies auch verwenden, um wie ein Portscanner zu arbeiten.
Hier sind einige Beispiele
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 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. 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.
Eine ORA-29276: transfer timeout
zeigt an, dass der Port offen ist, aber keine SMTP-Verbindung hergestellt wurde, während eine ORA-29278: SMTP transient error: 421 Service not available
zeigt, dass der Port geschlossen ist.
UTL_TCP
Das UTL_TCP
-Paket und seine Prozeduren und Funktionen ermöglichen TCP/IP-basierte Kommunikation mit Diensten. Wenn es für einen bestimmten Dienst programmiert ist, kann dieses Paket leicht zu einem Zugang zum Netzwerk werden oder vollständige Server-seitige Anfragen durchführen, da alle Aspekte einer TCP/IP-Verbindung kontrolliert werden können.
Das Beispiel auf der Oracle-Dokumentationsseite zeigt, wie Sie dieses Paket verwenden können, um eine rohe TCP-Verbindung herzustellen, um eine Webseite abzurufen. Wir können es ein wenig vereinfachen und verwenden, um beispielsweise Anfragen an die Metadateninstanz oder an einen beliebigen TCP/IP-Dienst zu stellen.
Interessanterweise kann dieses Paket aufgrund der Möglichkeit, rohe TCP-Anfragen zu erstellen, auch verwendet werden, um den Instanz-Meta-Daten-Dienst 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. 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.
Sie könnten dies zusätzlich verwenden, um auch einige rudimentäre Port-Scans mit Abfragen wie durchzuführen.
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, 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 abzurufen. [select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
Last updated