Oracle injection
Servieren Sie diesen Beitrag als Kopie einer gelöschten Version von https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/ über die Wayback Machine.
SSRF
Die Verwendung von Oracle zur Durchführung von Out-of-Band-HTTP- und DNS-Anfragen ist gut dokumentiert, jedoch als Mittel zur Exfiltration von SQL-Daten bei Injektionen. Diese Techniken/Funktionen können immer modifiziert werden, um andere SSRF/XSPA durchzuführen.
Die Installation von Oracle kann sehr mühsam sein, insbesondere wenn Sie eine schnelle Instanz einrichten möchten, um Befehle auszuprobieren. Mein Freund und Kollege bei Appsecco, Abhisek Datta, hat mich auf https://github.com/MaksymBilenko/docker-oracle-12c hingewiesen, mit dem ich eine Instanz auf einer t2.large AWS Ubuntu-Maschine und Docker einrichten konnte.
Ich habe den Docker-Befehl mit der Option --network="host"
ausgeführt, damit ich Oracle als native Installation mit vollem Netzwerkzugriff nachahmen konnte, für den Verlauf dieses Blogposts.
Oracle-Pakete, die eine URL oder eine Hostname/Port-Nummer-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 Database Online-Dokumentation durchgeführt. Speziell
Die Suche ergab die folgenden Ergebnisse (nicht alle können verwendet werden, um ausgehenden Netzwerkverkehr 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 lässt offensichtlich Pakete wie DBMS_LDAP
aus (die das Übergeben eines Hostnamens und einer Portnummer ermöglichen), da die Dokumentationsseite Sie einfach an eine andere Stelle verweist. Es gibt also möglicherweise andere Oracle-Pakete, 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 oben entdeckten und aufgelisteten Pakete.
DBMS_LDAP.INIT
Das Paket DBMS_LDAP
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 bereits dokumentiert, um die Exfiltration von Daten über DNS zu zeigen, wie unten dargestellt
Jedoch, da die Funktion einen Hostnamen und eine Portnummer als Argumente akzeptiert, können Sie dies auch als Portscanner verwenden.
Hier sind ein paar Beispiele:
Ein ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.
zeigt an, dass der Port geschlossen ist, während ein Session-Wert auf den geöffneten Port verweist.
UTL_SMTP
Das UTL_SMTP
-Paket ist für das 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. Für uns ist jedoch interessant, dass Sie einen Host- und Port-Spezifikation angeben können.
Ein einfaches Beispiel wird unten mit der Funktion UTL_SMTP.OPEN_CONNECTION
mit einer Timeout-Zeit von 2 Sekunden gezeigt.
Ein ORA-29276: Übertragungszeitüberschreitung
zeigt an, dass der Port geöffnet ist, aber keine SMTP-Verbindung hergestellt wurde, während ein ORA-29278: SMTP-Transiente Fehler: 421 Dienst nicht verfügbar
darauf hinweist, dass der Port geschlossen ist.
UTL_TCP
Das Paket UTL_TCP
und seine Prozeduren und Funktionen ermöglichen eine TCP/IP-basierte Kommunikation mit Diensten. Wenn es für einen bestimmten Dienst programmiert ist, kann dieses Paket leicht zu einem Zugangspunkt in das 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 Roh-TCP-Verbindung herzustellen, um eine Webseite abzurufen. Wir können es noch etwas vereinfachen und es verwenden, um 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-Metadatendienst aller Cloud-Anbieter abzufragen, da der Methodentyp und zusätzliche Header alle innerhalb der TCP-Anfrage übergeben werden können.
UTL_HTTP und Web-Anfragen
Die wahrscheinlich 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 wie folgt definiert: Das UTL_HTTP-Paket ermöglicht HTTP-Aufrufe von SQL und PL/SQL. Sie können es verwenden, um Daten über HTTP aus dem Internet abzurufen.
Sie können dies auch verwenden, um einige rudimentäre Portscans durchzuführen, indem Sie Abfragen wie die folgenden verwenden:
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 darauf hinweisen, dass der Port geöffnet ist.
Ein weiteres Paket, das ich in der Vergangenheit mit unterschiedlichem Erfolg verwendet habe, ist die GETCLOB()
-Methode des Oracle-Abstrakttyps HTTPURITYPE
, mit der Sie mit einer URL interagieren und Unterstützung für das HTTP-Protokoll erhalten können. 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