Einführung
In diesem Lab werden Sie sich mit SQL-Injection vertraut machen, einer Technik, die Angreifer nutzen, um Schwachstellen in Webanwendungen auszunutzen, die mit Datenbanken interagieren. SQL-Injection-Angriffe können unbefugten Zugang zu sensiblen Daten ermöglichen, Datenmanipulationen verursachen und sogar zu einem vollständigen Systemkompromiss führen.
Das Ziel dieses Labs besteht darin, praktische Erfahrungen mit SQL-Injection zu sammeln, indem Sie Schwachstellen in einer anfälligen Webanwendung ausnutzen. Sie werden lernen, wie Sie potenzielle SQL-Injection-Schwachstellen identifizieren, bösartige SQL-Abfragen erstellen und sensible Informationen aus der Datenbank extrahieren können. Darüber hinaus werden Sie über Verteidigungsmechanismen und bewährte Verfahren zur Eindämmung von SQL-Injection-Angriffen erfahren.
Lab-Umgebung einrichten
In diesem Schritt werden Sie die Lab-Umgebung einrichten, die eine anfällige Webanwendung und einen Datenbankserver umfasst.
Öffnen Sie das Terminal und navigieren Sie in das Verzeichnis
/home/labex/project.cd /home/labex/projectIm
project-Verzeichnis befinden sich zwei Python-Dateien:app.pyundsetup_db.py. Die Dateiapp.pyenthält den Quellcode für die anfällige Webanwendung, und die Dateisetup_db.pyenthält den Code zur Einrichtung der Datenbank.Führen Sie das Skript
setup_db.pyaus, um die Datenbank zu erstellen und sie mit Beispieldaten zu füllen.python3 setup_db.pyStarten Sie den Webanwendungsserver.
python3 app.py
Sie sollten eine Meldung sehen, die angibt, dass der Server auf http://localhost:5000 läuft.
SQL-Injection-Schwachstellen identifizieren
In diesem Schritt werden Sie lernen, wie Sie potenzielle SQL-Injection-Schwachstellen in der Webanwendung identifizieren können.
- Öffnen Sie einen Webbrowser und navigieren Sie zu
http://localhost:5000.
- Suchen Sie nach Eingabefeldern, in denen Benutzerdaten an den Server gesendet werden, wie z. B. Suchfeldern.
- Versuchen Sie, Sonderzeichen oder SQL-Schlüsselwörter (z. B.
',",--,;) in die Eingabefelder einzugeben und beobachten Sie das Verhalten der Anwendung. - Wenn die Anwendung Fehlermeldungen anzeigt oder sich unerwartet verhält, kann dies auf eine potenzielle SQL-Injection-Schwachstelle hinweisen.
Wenn Sie in das Suchfeld ein einfaches Anführungszeichen (') eingeben und auf die Schaltfläche "Suchen" klicken, zeigt die Anwendung einfachKeine Ergebnisse gefundenohne Fehlermeldung an. Dieses Verhalten deutet darauf hin, dass die Anwendung möglicherweise anfällig für SQL-Injection ist.
Ausnutzen von SQL-Injection-Schwachstellen
In diesem Schritt werden Sie lernen, wie Sie die identifizierten SQL-Injection-Schwachstellen ausnutzen können, um sensible Informationen aus der Datenbank zu extrahieren.
Finden Sie das anfällige Eingabefeld oder den anfälligen Parameter, der im vorherigen Schritt identifiziert wurde.
Versuchen Sie, verschiedene SQL-Injection-Payloads in das Eingabefeld oder den Parameter einzufügen.
Versuchen Sie, sensible Informationen aus der Datenbank mithilfe von SQL-Injection-Payloads zu extrahieren. Beispielsweise können Sie den folgenden Payload verwenden, um Daten aus der Datenbank zu extrahieren:
' UNION SELECT username, password FROM users --Der obige Payload kann verwendet werden, um die Benutzernamen und Passwörter aus der Tabelle
usersin der Datenbank abzurufen.Beobachten Sie die Antwort der Anwendung und suchen Sie nach angezeigten sensiblen Informationen oder Fehlern, die möglicherweise Informationen über die Datenbankstruktur oder -inhalte preisgeben.
SQL-Injection-Schwachstellen abmildern
In diesem Schritt werden Sie über Verteidigungsmechanismen und bewährte Verfahren zur Eindämmung von SQL-Injection-Schwachstellen erfahren.
Prüfen Sie den Quellcode der anfälligen Webanwendung und identifizieren Sie die Bereiche, in denen Benutzerinput in Datenbankabfragen ohne angemessene Reinigung verwendet wird.
Implementieren Sie Techniken zur Eingabevalidierung und -reinigung, wie z. B.:
- Parametrisierte Abfragen oder vorbereitete Anweisungen (prepared statements)
- Eingabevalidierung und -reinigung (z. B. Entfernen oder Escaping von Sonderzeichen)
- Prinzip des geringsten Privilegs für Datenbankkonten
Aktualisieren Sie den Code der Anwendung, um parametrisierte Abfragen oder vorbereitete Anweisungen zu verwenden, wenn Sie Datenbankabfragen mit Benutzerinput ausführen. Ändern Sie die Datei
app.pyvon:sql_query = "SELECT username, password FROM users WHERE username LIKE '%{}%' OR '{}'".format(query, query) cur.execute(sql_query)in:
sql_query = "SELECT username, password FROM users WHERE username LIKE?" cur.execute(sql_query, ('%' + query + '%',))Und verschieben Sie
results = cur.fetchall()unter die Zeilelogging.info(f"Search query: {query}").logging.info(f"Search query: {query}") results = cur.fetchall()Speichern Sie die Datei nach den obigen Änderungen und starten Sie den Webanwendungsserver neu.
Verwenden Sie
ctrl+c, um den Server zu stoppen, und starten Sie ihn dann erneut mit:python3 app.pyTesten Sie die aktualisierte Anwendung, um sicherzustellen, dass SQL-Injection-Angriffe nicht mehr möglich sind.
Zusammenfassung
In diesem Lab haben Sie sich mit SQL-Injection vertraut gemacht, einer Technik, die Angreifer nutzen, um Schwachstellen in Webanwendungen auszunutzen, die mit Datenbanken interagieren. Sie haben eine anfällige Webanwendung und einen Datenbankserver eingerichtet, potenzielle SQL-Injection-Schwachstellen identifiziert und diese ausgenutzt, um sensible Informationen aus der Datenbank zu extrahieren. Darüber hinaus haben Sie über Verteidigungsmechanismen und bewährte Verfahren zur Eindämmung von SQL-Injection-Angriffen gelernt, wie z. B. Eingabevalidierung, -reinigung und die Verwendung von parametrisierten Abfragen oder vorbereiteten Anweisungen (prepared statements).
Durch diese praktische Erfahrung haben Sie ein tieferes Verständnis von SQL-Injection-Angriffen und wie man sie in Webanwendungen verhindern kann gewonnen. Sie haben auch gelernt, wie wichtig sichere Codierungspraktiken sind und welche potenziellen Folgen es haben kann, wenn Benutzerinput bei der Interaktion mit Datenbanken nicht richtig gereinigt wird.