SQL-Injection-Schwachstellen in Nmap ausnutzen

Beginner

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Willkommen in diesem interaktiven Lab! Wir befassen uns hier mit SQL-Injection-Schwachstellen - einer weit verbreiteten und ernsten Gefahr für Webanwendungen. Kurz gesagt, treten SQL-Injection-Angriffe auf, wenn eine Anwendung Daten erhält, die nicht richtig überprüft oder kodiert wurden, und diese Daten in eine SQL-Abfrage aufgenommen werden. Dieser Sicherheitslücke kann es Cyberangreifern ermöglichen, schädliche SQL-Befehle auszuführen, was zu unbefugtem Zugang zu vertraulichen Daten oder anderen schädlichen Handlungen führen kann.

Das Ziel dieses Labs ist zweigeteilt. Erstens möchten wir die Kernkonzepte von SQL-Injection-Schwachstellen aufklären und sie in verständliche Teile zerlegen. Zweitens bieten wir praktische Übungen an, um Ihnen zu helfen, zu lernen, wie Sie diese Schwachstellen ausnutzen können - nicht mit bösartigem Vorsatz, sondern um sie besser zu verstehen und zu verhindern. Dieser praktische Ansatz wird Sie mit den Kenntnissen und Fähigkeiten ausstatten, Ihre Anwendungen vor solchen Bedrohungen zu schützen.


Skills Graph

Einrichten der Lab-Umgebung

In diesem Abschnitt führen wir Sie durch den Prozess der Einrichtung einer Lab-Umgebung, in der Sie SQL-Injection-Angriffe üben können.

  1. Holen Sie sich das DVWA Docker-Image:
    Das DVWA Docker-Image ist auf Docker Hub verfügbar. Sie können es mit dem folgenden Befehl herunterladen:

    docker pull vulnerables/web-dvwa
  2. Starten Sie den DVWA Docker-Container:
    Nachdem Sie das Image heruntergeladen haben, können Sie es mit dem folgenden Befehl starten:

    docker run -d -p 80:80 --name dvwa vulnerables/web-dvwa

    Dieser Befehl startet einen neuen Container und bildet Port 80 im Container auf Port 80 auf Ihrem Host-Rechner ab.

Die obigen Schritte bereiten die erforderliche Umgebung für das Lab vor. Nach Abschluss der Einrichtung starten Sie den Firefox-Browser auf Ihrem Desktop und geben die folgende URL ein: http://localhost.

Nach kurzer Zeit gelangen Sie auf die Anmeldeseite. Die Standard-Anmeldeinformationen lauten wie folgt: Benutzername - "admin" und Passwort - "password".

Sie gelangen auf die DVWA (Damn Vulnerable Web Application)-Webseite. Klicken Sie auf die Schaltfläche "Create/Reset Database", um eine neue Datenbank für die Anwendung zu erstellen.

Wichtiger Hinweis: Für das Zweck dieses Labs setzen wir die Sicherheitsstufe auf "low" (niedrig). Diese Einstellung macht die SQL-Injection-Schwachstellen deutlicher. Um dies zu tun, wählen Sie "low" aus der Dropdown-Liste "Security Level" aus und klicken Sie dann auf die Schaltfläche "Submit".

Identifizieren des SQL-Injection-Punktes

In diesem Modul werden wir die Existenz einer SQL-Injection-Schwachstelle in einer Anwendung aufdecken.

Im linken Menü der Anwendung finden Sie einen Link mit der Bezeichnung "SQL Injection". Klicken Sie auf diesen Link, um zur SQL-Injection-Seite zu gelangen. Hier sehen Sie ein Formular, in dem Sie eine Benutzer-ID eingeben können.

Schritt 2: Geben Sie eine Beispiel-Benutzer-ID ein

Versuchen wir, eine Benutzer-ID einzugeben, um zu sehen, was passiert.

Beispiel-Eingabe:

1

Geben Sie "1" in das Formular ein und klicken Sie auf die Schaltfläche "Submit". Die Ausgabe sollte Details über einen Benutzer mit der ID 1 anzeigen.

Schritt 3: Prüfen Sie den Quellcode

Indem Sie auf die Schaltfläche "View Source" klicken, können Sie den Quellcode der Seite prüfen. Sie sollten etwas wie den folgenden PHP-Code sehen:

$id = $_GET['id'];
$sql = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($conn, $sql);

Dieser Code zeigt, dass die Anwendung eine SQL-Abfrage erstellt, indem sie die Eingabe des Benutzers direkt an die SQL-Anweisung anhängt. Dies ist ein häufiger Fehler, der potenziell SQL-Injection-Schwachstellen schafft.

Schritt 4: Bestätigen Sie die SQL-Injection-Schwachstelle

Um die Existenz einer SQL-Injection-Schwachstelle zu überprüfen, versuchen wir, nach dem Wert "1" ein einfaches Anführungszeichen (') einzufügen. Geben Sie Folgendes in das Formular ein:

1'

Wenn Sie eine Datenbankfehlermeldung sehen, bedeutet dies, dass die Anwendung tatsächlich anfällig für SQL-Injection-Angriffe ist. Dies ist ein wichtiger Schritt bei der Identifizierung und anschließenden Behebung solcher Schwachstellen.

Bestimmung des SQL-Injection-Typs und des Datenbanktyps

In diesem Abschnitt führen wir Sie durch den Prozess der Identifizierung des Typs der SQL-Injection-Schwachstelle und des Typs der von einer bestimmten Anwendung verwendeten Datenbank.

Unser erstes Ziel ist es, die Anzahl der von der ursprünglichen SQL-Abfrage zurückgegebenen Spalten zu bestimmen. Dazu verwenden wir die ORDER BY-Klausel.

Beispielcode:

1' ORDER BY 1#
1' ORDER BY 2#
1' ORDER BY 3#

Geben Sie die obigen SQL-Anweisungen nacheinander in das Formular ein. Wenn die Anwendung wie erwartet funktioniert, werden die ersten beiden Abfragen ohne Fehler ausgeführt, während die dritte fehlschlagen wird. Dieser Fehler zeigt an, dass die ursprüngliche SQL-Abfrage zwei Spalten zurückgibt.

Danach können wir den UNION-Operator verwenden, um zusätzliche Daten aus der Datenbank zu extrahieren.

Beispielcode:

1' UNION SELECT version(), @@version_compile_os#

Diese SQL-Anweisung ruft die Version der Datenbank und die Version des Betriebssystems ab, auf dem sie ausgeführt wird.

Nach der Ausführung dieser Abfrage sollte die Ausgabe die Informationen zur Datenbankversion und zum Betriebssystem anzeigen.

Abrufen des Datenbanknamens

In dieser Lektion führen wir Sie durch den Prozess des Abrufens des Namens der Datenbank, die eine Anwendung verwendet. Dies ist eine essentielle Fähigkeit, insbesondere wenn Sie die Struktur und Organisation einer Datenbank verstehen möchten.

Beispielcode:

1' UNION SELECT database(), user()#

Die obige SQL-Abfrage ist ein Beispiel für eine Technik namens "SQL Injection" (SQL-Einschleusung). Es handelt sich um eine Code-Einschleusungstechnik, die Angreifer nutzen, um eine Sicherheitslücke in der Datenbankebene einer Anwendung auszunutzen. Diese spezifische Abfrage ruft den Namen der aktuellen Datenbank und den Benutzer ab, der die Abfrage ausführt.

So funktioniert es:

  • 1' UNION: Dies ist der erste Teil der SQL-Einschleusung. Der Teil 1' dient dazu, die Abfrage, die die Anwendung wahrscheinlich ausführt, zu vervollständigen. Das Schlüsselwort UNION wird verwendet, um die Ergebnisse von zwei oder mehr SELECT-Anweisungen zu kombinieren, ohne doppelte Zeilen zurückzugeben.
  • SELECT database(), user()#: Dieser Teil der Abfrage ist die Nutzlast, die Sie einschleusen. Die Funktion database() ruft den Namen der aktuellen Datenbank ab, und die Funktion user() ruft den Namen des Benutzers ab, der die Abfrage ausführt.

Nachdem Sie die Abfrage gesendet haben, sollten Sie erwarten, den Datenbanknamen und die Benutzerinformationen in der Ausgabe zu sehen. Diese Informationen können für das weitere Verständnis der Datenbankstruktur und der Berechtigungen des Benutzers im Kontext der Anwendung von entscheidender Bedeutung sein.

Denken Sie daran, dass das Verständnis dieser Techniken nicht nur bei der Ausnutzung von Schwachstellen hilft, sondern auch bei der Erstellung sicherer Anwendungen, indem Sie wissen, wohgegen Sie sich schützen müssen.

Abrufen von Tabellennamen

In dieser Lektion gehen wir einen Schritt weiter und erkunden die Struktur der Datenbank, indem wir die Namen der darin enthaltenen Tabellen abrufen. Das Verständnis der Tabellenstruktur ist entscheidend, wenn Sie versuchen, Daten in einer Datenbank zu extrahieren oder zu manipulieren.

Beispielcode:

1' UNION SELECT table_name, table_schema FROM information_schema.tables WHERE table_schema = 'dvwa'#

Die obige SQL-Abfrage nutzt weiterhin die SQL-Injection-Technik. Diesmal wird sie verwendet, um die Namen der Tabellen in der Datenbank und ihr jeweiliges Datenbankschema abzurufen.

Hier ist die Aufschlüsselung:

  • 1' UNION: Wie bereits erklärt, dient dieser Teil dazu, die wahrscheinliche Abfrage der Anwendung zu vervollständigen und sie mit unserer eingeschleusten Nutzlast zu kombinieren.
  • SELECT table_name, table_schema FROM information_schema.tables WHERE table_schema = 'dvwa': Dieser Teil der Abfrage ist unsere eingeschleuste Nutzlast. Sie ruft die Tabellennamen und ihr jeweiliges Datenbankschema aus der Systemtabelle information_schema.tables ab, speziell für das 'dvwa'-Schema.

Die information_schema.tables ist eine Systemtabelle, die Informationen über alle Tabellen in der Datenbank enthält. Das table_schema bezieht sich auf den Namen der Datenbank, zu der die Tabelle gehört, und table_name ist der Name der Tabelle.

Nachdem Sie die Abfrage gesendet haben, sollten Sie erwarten, die Tabellennamen und ihr jeweiliges Datenbankschema in der Ausgabe zu sehen. Diese Informationen können als Leitfaden für die weitere Erkundung oder Ausnutzung der Datenbank dienen.

Wie immer: Denken Sie daran, dass das Verständnis dieser Techniken nicht nur für die Ausnutzung von Schwachstellen wichtig ist, sondern auch für die Entwicklung sicherer Anwendungen, indem Sie wissen, wohgegen Sie sich schützen müssen.

Abrufen von Spaltennamen und Daten

In dieser Lektion werden wir tiefer in die Datenbankstruktur eintauchen, indem wir die Spaltennamen einer bestimmten Tabelle abrufen. Mit diesen Informationen können wir dann potenziell sensible Daten aus der Tabelle extrahieren.

Beispielcode:

1' UNION SELECT 1, group_concat(column_name) FROM information_schema.columns WHERE table_name = 'users'#

Die obige SQL-Abfrage nutzt SQL-Injection, um die Spaltennamen der Tabelle 'users' abzurufen. Sie verkettet diese Spaltennamen zu einer einzigen Zeichenkette, um die Ansicht zu vereinfachen.

Hier ist die Aufschlüsselung:

  • 1' UNION: Wie bereits erklärt, dient dieser Teil dazu, die wahrscheinliche Abfrage der Anwendung zu vervollständigen und sie mit unserer eingeschleusten Nutzlast zu kombinieren.
  • SELECT 1, group_concat(column_name) FROM information_schema.columns WHERE table_name = 'users': Dieser Teil der Abfrage ist unsere eingeschleuste Nutzlast. Sie ruft die Spaltennamen aus der Tabelle 'users' ab und verkettet sie zu einer einzigen Zeichenkette mithilfe der Funktion group_concat.

Nachdem Sie die Abfrage gesendet haben, sollten Sie erwarten, die Spaltennamen in der Ausgabe zu sehen.

Jetzt, da wir die Spaltennamen haben, können wir sensible Daten aus der Tabelle 'users' abrufen.

Beispielcode:

1' UNION SELECT user, password FROM users#

Diese SQL-Abfrage nutzt SQL-Injection, um die Spalten 'user' und 'password' aus der Tabelle 'users' abzurufen.

Nachdem Sie die Abfrage gesendet haben, sollten Sie erwarten, die Benutzernamen und gehashten Passwörter in der Ausgabe zu sehen. Diese Informationen können äußerst sensibel sein, und das Verständnis, wie sie extrahiert werden können, ist sowohl für die Ausnutzung von Schwachstellen als auch für den Schutz vor solchen Angriffen von entscheidender Bedeutung.

Denken Sie daran, dass das Ziel des Verständnisses dieser Techniken zweifach ist: potenzielle Schwachstellen zu identifizieren und sicherere Anwendungen zu entwickeln.

Zusammenfassung

In diesem Lab haben Sie sich mit SQL-Injection-Schwachstellen vertraut gemacht und gelernt, wie Sie diese durch praktische Übungen ausnutzen können. Sie haben eine anfällige Webanwendung eingerichtet, den SQL-Injection-Punkt identifiziert, den Typ der SQL-Injection und den Typ der Datenbank bestimmt und sensible Informationen aus der Datenbank abgerufen, indem Sie die SQL-Injection-Schwachstelle ausgenutzt haben.

Durch die Absolvierung dieses Labs haben Sie praktische Erfahrungen in der Erkennung und Ausnutzung von SQL-Injection-Schwachstellen gesammelt, die zu den häufigsten und gefährlichsten Schwachstellen in Webanwendungen gehören. Dieses Wissen wird Ihnen helfen, solche Schwachstellen in realen Szenarien zu identifizieren und zu bekämpfen und somit Ihre Fähigkeiten in Bezug auf die Sicherheit von Webanwendungen zu verbessern.