SQL-Injection-Experimente in Nmap durchführen

Beginner

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

Einführung

SQL-Injection ist eine beliebte Technik, die Angreifer nutzen, um Webanwendungen zu exploiteren, indem sie bösartige Eingaben erstellen und beliebige SQL-Anweisungen in der Backend-Datenbank ausführen. In diesem Lab werden wir eine SQL-Injection-Umgebung einrichten, indem wir die sqli-labs mit Docker verwenden, und praktische Experimente durchführen, um die Prinzipien und Exploitationsmethoden von SQL-Injection-Schwachstellen zu verstehen.


Skills Graph

Identifizieren von Einfügungspunkten

Willkommen in unserem Einführungskurs zum Web-Sicherheitstesting, der sich speziell auf die Identifizierung potenzieller SQL-Injection-Schwachstellen konzentriert. SQL-Injection ist ein häufiges und potenziell verheerendes Sicherheitsrisiko in Webanwendungen, aber mit den richtigen Kenntnissen können Sie lernen, wie Sie es identifizieren und verhindern.

Was ist SQL-Injection?

SQL-Injection ist eine Technik, bei der ein Angreifer bösartigen SQL-Code in eine Datenbankabfrage einer Webanwendung einfügt. Wenn die Webanwendung die Benutzereingaben nicht ordnungsgemäß bereinigt, kann dies zu Datenschutzverletzungen, Datenverlust oder anderen ernsthaften Problemen führen.

Identifizieren potenzieller SQL-Injection-Punkte

Webanwendungen, die mit einer Datenbank interagieren, haben oft URLs, die Parameter enthalten. Diese Parameter können potenziell ausgenutzt werden, wenn sie nicht ordnungsgemäß bereinigt werden. Beispielsweise könnten Sie eine URL sehen, die so aussieht:

http://some-website.com/page.php?id=XX

In dieser URL ist id ein Parameter, der mit der Datenbank interagiert. Jede Webseite, die solche Parameter verwendet, könnte potenziell anfällig für SQL-Injection sein, wenn die Eingabe nicht ordnungsgemäß bereinigt wird.

Testen auf SQL-Injection: Die Einzelanführungszeichen-Technik

Eine einfache Möglichkeit, auf SQL-Injection-Schwachstellen zu testen, ist die Verwendung der Einzelanführungszeichen-Technik. So geht es vor:

  1. Fügen Sie ein einzelnes Anführungszeichen (') an den Parameterwert in der URL an. Beispielsweise könnten Sie die URL so ändern, dass sie wie folgt aussieht: http://some-website.com/page.php?id=1'
  2. Wenn die Webseite nach Drücken der Eingabetaste einen Fehler anzeigt, könnte dies bedeuten, dass die Seite anfällig für SQL-Injection ist.

Der Grund, warum dies funktioniert, ist, dass sowohl numerische als auch Zeichenketten-Datentypen in SQL einen Syntaxfehler generieren, wenn ein unausgeglichenes einzelnes Anführungszeichen eingefügt wird. Dieser Fehler kann das Vorhandensein einer SQL-Injection-Schwachstelle aufdecken.

Wichtiger Hinweis

Wenn kein Fehler angezeigt wird, wenn Sie ein einzelnes Anführungszeichen anhängen, bedeutet dies nicht unbedingt, dass es keine SQL-Injection-Schwachstelle gibt. Es ist möglich, dass die Anwendung einzelne Anführungszeichen herausfiltert, was es erforderlich machen würde, andere Techniken zum Testen auf Schwachstellen zu verwenden. Machen Sie sich keine Sorgen, wir werden diese fortgeschrittenen Techniken in einer zukünftigen Lektion behandeln.

Denken Sie daran, dass ethisches Hacking darum geht, die Sicherheit zu verbessern. Respektieren Sie immer die Privatsphäre und die Gesetze bei Ihren Testversuchen. Viel Spaß beim Lernen!

Bestimmen des SQL-Injection-Typs

Super Arbeit beim Identifizieren potenzieller SQL-Injection-Punkte! Jetzt gehen wir zum nächsten Schritt über: Bestimmen des Typs der SQL-Injection-Schwachstelle. Es gibt zwei Haupttypen, auf die wir uns konzentrieren werden: numerische und zeichenbasierte (string-based) SQL-Injection.

Numerische SQL-Injection

Wenn der Eingabeparameter (nennen wir ihn x) von der Webanwendung als Ganzzahl behandelt wird, könnte die SQL-Abfrage so aussehen:

select * from <table_name> where id = x

Um eine numerische SQL-Injection zu identifizieren, verwenden wir zwei einfache logische Bedingungen: and 1=1 und and 1=2. So geht es vor:

  1. Geben Sie http://some-website.com/page.php?id=x and 1=1 in Ihren Browser ein. Wenn die Seite wie erwartet lädt, gehen Sie zum nächsten Schritt über.
  2. Versuchen Sie nun http://some-website.com/page.php?id=x and 1=2. Wenn die Seite einen Fehler zurückgibt oder sich anders verhält, könnte dies auf eine numerische SQL-Injection-Schwachstelle hinweisen.

Warum funktioniert das?

Wenn Sie and 1=1 eingeben, lautet die resultierende SQL-Abfrage:

select * from <table_name> where id = x and 1=1

Die Bedingung 1=1 ist immer wahr, also wenn die Seite normal lädt, deutet dies darauf hin, dass die Eingabe direkt in die SQL-Abfrage eingefügt wird.

Wenn Sie and 1=2 eingeben, lautet die resultierende SQL-Abfrage:

select * from <table_name> where id = x and 1=2

Die Bedingung 1=2 ist immer falsch, also wenn die Seite sich anders verhält (z.B. einen Fehler zurückgibt), deutet dies darauf hin, dass unsere Eingabe die SQL-Abfrage beeinflusst, was auf eine potenzielle SQL-Injection-Schwachstelle hinweist.

Zeichenbasierte (string-based) SQL-Injection

In einigen Fällen wird der Eingabeparameter x als Zeichenkette behandelt. Die SQL-Abfrage könnte so aussehen:

select * from <table_name> where id = 'x'

Um eine zeichenbasierte Injection zu identifizieren, verwenden wir einen ähnlichen Ansatz wie bei der numerischen Injection, aber mit Zeichenkettenbedingungen: and '1'='1' und and '1'='2'. So geht es vor:

  1. Geben Sie http://some-website.com/page.php?id=x' and '1'='1 in Ihren Browser ein. Wenn die Seite wie erwartet lädt, gehen Sie zum nächsten Schritt über.
  2. Versuchen Sie nun http://some-website.com/page.php?id=x' and '1'='2. Wenn die Seite einen Fehler zurückgibt oder sich anders verhält, könnte dies auf eine zeichenbasierte SQL-Injection-Schwachstelle hinweisen.

Warum funktioniert das?

Wenn Sie and '1'='1' eingeben, lautet die resultierende SQL-Abfrage:

select * from <table_name> where id = 'x' and '1'='1'

Die Bedingung '1'='1' ist immer wahr, also wenn die Seite normal lädt, deutet dies darauf hin, dass die Eingabe direkt in die SQL-Abfrage eingefügt wird.

Wenn Sie and '1'='2' eingeben, lautet die resultierende SQL-Abfrage:

select * from <table_name> where id = 'x' and '1'='2'

Die Bedingung '1'='2' ist immer falsch, also wenn die Seite sich anders verhält (z.B. einen Fehler zurückgibt), deutet dies darauf hin, dass unsere Eingabe die SQL-Abfrage beeinflusst, was auf eine potenzielle SQL-Injection-Schwachstelle hinweist.

In beiden Fällen denken Sie daran, dass eine ungewöhnliche Antwort der Webanwendung ein Hinweis darauf sein kann, dass Sie einen SQL-Injection-Punkt gefunden haben. Stellen Sie jedoch immer sicher, dass Sie die Erlaubnis haben, diese Tests durchzuführen, und nutzen Sie Ihre Fähigkeiten verantwortungsvoll. Viel Spaß beim Lernen!

Ausnutzen von SQL-Injection zur Umgehung der Authentifizierung

In diesem Lab werden wir tiefer in die SQL-Injection-Schwachstellen eintauchen. Unser Fokus liegt darauf, wie man diese Schwachstellen ausnutzen kann, um die Anmeldeauthentifizierung zu umgehen, eine Technik, die oft als "Universelles Passwort"-Angriff bezeichnet wird.

Vorbereitung der Lab-Umgebung

Um loszulegen, müssen wir unsere Lab-Umgebung vorbereiten. Wir werden die Damn Vulnerable Web Application (DVWA) verwenden - eine PHP/MySQL-Webanwendung, die absichtlich unsicher gestaltet wurde und somit ein ideales Lernwerkzeug für das Verständnis der Sicherheit von Webanwendungen ist.

  1. Download des sqli-labs Docker-Images: Das sqli-labs Docker-Image kann auf Docker Hub heruntergeladen werden. Verwenden Sie den folgenden Befehl in Ihrem Terminal, um es herunterzuladen:

    docker pull acgpiano/sqli-labs
  2. Starten des sqli-labs Docker-Containers: Nach dem Herunterladen des Images starten Sie es mit dem folgenden Befehl:

    docker run -it -d --name sqli-labs -p 80:80 -p 13306:3306 acgpiano/sqli-labs

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

Indem Sie diese Schritte befolgen, haben Sie die erforderliche Lab-Umgebung erfolgreich eingerichtet.

Nachdem die Einrichtung abgeschlossen ist, öffnen Sie Firefox und geben Sie http://localhost in die Adressleiste ein.

Wenn Sie http://localhost zum ersten Mal besuchen, klicken Sie bitte auf Setup/reset Database for lab, um das Lab vorzubereiten, und aktualisieren Sie dann die Webseite.

Identifizieren von SQL-Injection

Wenn Sie auf Less-11 klicken, sollten Sie jetzt eine einfache Anmeldeseite sehen. Versuchen Sie, einen beliebigen Benutzernamen 123 und ein Passwort 123 einzugeben.

Die Fehlerseite wird Sie informieren: "Ungültiger Benutzername oder Passwort."

Entziffern des Backend-Codes

Schauen wir uns den Backend-Code an, der für den Authentifizierungsprozess verantwortlich ist:

// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
	$uname=$_POST['uname'];
	$passwd=$_POST['passwd'];

	//logging the connection parameters to a file for analysis.
	$fp=fopen('result.txt','a');
	fwrite($fp,'User Name:'.$uname);
	fwrite($fp,'Password:'.$passwd."\n");
	fclose($fp);

	// connectivity
	@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
	$result=mysql_query($sql);
	$row = mysql_fetch_array($result);
....
}

Die tatsächliche SQL-Abfrage, die ausgeführt wird, lautet:

SELECT * FROM users WHERE username='123' AND password='123' LIMIT 0,1

Diese Abfrage ist einfach zu verstehen: Wenn sie eine Zeile zurückgibt, in der sowohl der username als auch das password übereinstimmen, ist die Anmeldung erfolgreich.

Ausnutzen der Schwachstelle

Basierend auf den Kenntnissen aus dem vorherigen Lab versuchen wir, die folgende Payload einzugeben:

Benutzername: 123' or 1=1 #
Passwort: 123' or 1=1 #

Interessanterweise können wir uns damit erfolgreich anmelden! Der Grund dafür ist, dass die tatsächliche SQL-Abfrage, die ausgeführt wird, lautet:

SELECT * FROM users WHERE username='123' or 1=1 #' AND password='123' or 1=1 #'

In MySQL wird das #-Symbol verwendet, um den Rest der Zeile auszukommentieren, sodass die Abfrage effektiv wird:

SELECT * FROM users WHERE username='123' or 1=1

Da die Bedingung or 1=1 immer wahr ist, wird die Abfrage immer ein Ergebnis zurückgeben, was zu einer erfolgreichen Anmeldung führt.

Wir können auch mit einer Variation experimentieren, die das Kommentarsymbol nicht verwendet:

Benutzername: 123' or '1'='1
Passwort: 123' or '1'='1

Die SQL-Abfrage, die dann ausgeführt wird, lautet:

SELECT * FROM users WHERE username='123' or '1'='1' AND password='123' or '1'='1'

In diesem Fall stellen die beiden or-Bedingungen sicher, dass die and-Bedingung zwischen ihnen immer wahr ist, was zu einer erfolgreichen Anmeldung führt.

Fazit

Wie oben gezeigt, gibt es zahlreiche Techniken, mit denen man SQL-Injection-Schwachstellen ausnutzen und die Authentifizierung umgehen kann. Fühlen Sie sich frei, verschiedene Payloads zu erkunden und zu experimentieren. Das Ziel hierbei ist es, diese Schwachstellen zu verstehen, damit Sie Ihre eigenen Anwendungen besser vor ihnen schützen können. Happy ethisches Hacking!

Zusammenfassung

In diesem Lab haben wir gelernt, wie man SQL-Injection-Schwachstellen mithilfe der Einzelanführungszeichen-Technik identifiziert und wie man den Typ der SQL-Injection (numerisch oder zeichenbasierend) mithilfe spezifischer Payloads bestimmt. Wir haben auch die Ausnutzung von SQL-Injection-Schwachstellen zur Umgehung der Anmeldeauthentifizierung untersucht, ein häufiges Szenario, das als "Universelles Passwort"-Angriff bekannt ist. Durch praktische Experimente haben wir praktische Erfahrungen beim Verstehen und Ausnutzen von SQL-Injection-Schwachstellen gesammelt, die in Webanwendungen weit verbreitet sind, wenn die Bereinigung von Eingaben nicht ordnungsgemäß implementiert ist.