Blind SQL Injection Techniques Tutorial

Blind SQL Injection Techniques Tutorial

Was ist SQL -Injektion?

Die SQL -Injektion ist eine Art Datenbankangriff, bei dem ein Angreifer versucht, Informationen aus der Datenbank einer Webanwendung zu stehlen. Dies kann sogar zur Ausführung der Remotecode führen, abhängig von der Webanwendungsumgebung und der Datenbankversion.

Die SQL -Injektion erfolgt aufgrund einer schlechten Desinfektion der Benutzereingabe. Wenn Sie in einer Codierungssprache (PHP, ASP) Eingaben vom Benutzer aufnehmen.NET) und übergeben Sie sie direkt an die Datenbank des Servers, ohne einen Filter auf die Eingabe anzuwenden. Dies kann zu einer SQL -Injektionsanfälligkeit führen.

Beispielsweise ist der folgende PHP -Code für den SQL -Injektionsangriff anfällig, da er die Benutzereingabe direkt an die Datenbank übergibt. Angreifer kann eine eigene böswillige Datenbankabfrage herstellen, um Daten aus der Datenbank zu extrahieren.

// Der UserInput wird in der ID -Variablen gespeichert
$ id = $ _get ['id'];
// Der UserInput wird direkt in der Datenbank ausgeführt
$ getId = "SELECT FIRST_NAME, last_name von Benutzern wobei user_id = '$ id'";
// Im Fehler oder Erfolg werden die Ergebnisse an den Benutzer zurückgegeben
$ result = mysql_query ($ getid) oder sterben ('
'' . MySQL-Fehler() . ''
');
$ num = mysql_numrows ($ result);

Andererseits wird ein sicherer Code -Beispiel für einen solchen Code zur Interaktion mit der Datenbank angegeben. Die Benutzereingabe und filtert böswillige Zeichen daraus und übergeben sie dann an die Datenbank.

$ id = $ _get ['id'];
$ id = stripLashes ($ id);
$ id = mysql_real_escape_string ($ id);

Normale gegen blinde SQL -Injektion

Normale SQL -Injektion

In der normalen SQL -Injektion, wenn ein Angreifer versucht, ein einzelnes Zitat (') als Eingabe einzulegen, antwortet die Datenbank mit einem Fehler, wenn dieses einzelne Zitat in der Datenbank ausgeführt wird. Der Fehler wird im Browser des Angreifers gedruckt.

Der für diesen Fehler verantwortliche Code ist

// Wenn die Datenbank mit einem Fehler antwortet, wird die Funktion „oder Die ()“ ausgeführt
Um den Fehler zu drucken
$ result = mysql_query ($ getid) oder sterben ('
'' . MySQL-Fehler() . ''
');

In der normalen SQL -Injektion kann Angreifer die Fehlerergebnisse und die leicht zu identifizierende und nutzende Ausnutzung sehen.

Blind SQL Injection

Im Falle einer blinden SQL -Injektion wird der Datenbankfehler, wenn eine böswillige Abfrage wie ein einzelnes Zitat ausgeführt wird.

Der dafür verantwortliche Backend -Code ist unten angegeben

$ result = mysql_query ($ getId); // 'oder sterben' entfernt, um MySQL -Fehler zu unterdrücken

Bei der blinden SQL -Injektion kann Angreifer die vollständigen Ergebnisse nicht erkennen, daher ist diese Art von SQLI schwer zu identifizieren und zu nutzen, aber es hat das gleiche Risikoniveau wie der normale SQLI.

Techniken zum Erkennen der blinden SQL -Injektion

Während eine normale SQL -Injektion durch Senden eines einzelnen Zitats (') als Eingang und Untersuchung des Ausgabefehlers erkannt werden kann, kann die blinde SQL -Injektion mit dieser Technik nicht erkannt werden. Es gibt viele Techniken, um eine blinde SQL -Injektion zu erkennen, einige von ihnen werden wie folgt angegeben

Wahre und falsch basierte Erkennung

Eines der Eigenschaften von Datenbanken einschließlich MySQL ist das unterschiedliche Verhalten bei wahren und falschen Aussagen. Auch wenn die Datenbank keine Fehler anzeigt, können wir die Verwendung von echten und falschen Anweisungen entscheiden. Betrachten Sie das folgende Szenario,

Die folgende Seite ist anfällig für die blinde SQL -Injektion, so dass eine echte Anweisung alle Einträge in der Datenbank angezeigt wird

1 'oder 1 = 1##

Wenn Sie eine falsche Abfrage als Eingabe angeben, werden keine Daten angezeigt.

1 'oder 1 = 2#

Sogar die Webseite zeigt keine Fehler an, der Unterschied zwischen den beiden Seiten zeigt, dass unsere Abfragen erfolgreich in der Datenbank ausgeführt werden.

Zeitbasierte Erkennung

Es gibt eine Funktion in Datenbanken, einschließlich MySQL, MS-SQL und anderen für Verzögerungen. Wir können die Sleep () -Funktion in unserer Abfrage verwenden. Wenn die Antwort der Datenbank langsam ist, bedeutet dies, dass unsere Abfrage erfolgreich ausgeführt wird und die Webseite anfällig für blinde SQL -Injektion ist.

1 'und Schlaf (15)#

Es gibt eine andere zeitaufwändige Funktion „Benchmark“, mit der die Datenbankantwort verzögert werden kann

1 'und Benchmark (10000000, SHA1 (1337))#

Die obige Zeile führt die SHA1 () -Funktion 10000000 -mal in der Datenbank aus, wodurch eine erhebliche Verzögerung bei der Antwort hinzugefügt wird.

Zeitbasierte blinde SQL -Injektion in anderen Datenbanken

Frau SQL: Id = 1; Waitfor Delay '0: 0: 10'-

Oracle SQL: Und [randnum] = dbms_pipe.Empfangen_message ('[randstr]', [Schlafzeit])

PostgreSQL: Und [randnum] = (select [randnum] aus pg_sleep ([schlafen]))

SQLite: Und [Randnum] = Like ('abcdefg', ober (hex (randomblob ([schlaf] 0000000000/2))))

Datenbankinformationen extrahieren

Der erste Schritt zum Extrahieren der Datenbank besteht darin, die Spaltenzahlen in der Datenbank zu bestimmen. Versuchen Sie dann, gefährdete Spalten zu finden, um weitere Daten zu extrahieren.

Blinde SQL Injection verhält sich mit unterschiedlichen Spaltenzahlen in "Order By" -Anfrage unterschiedlich.

1 'Bestellung von 1##

Die obige Anweisung ist wahr, da in einer Datenbank immer mindestens 1 Spalte vorhanden ist. Versuchen Sie nun mit einer sehr großen Anzahl.

1 'Bestellung von 10000#

Die Datenbankantwort unterscheidet sich von der vorherigen. Versuchen Sie nun mit 2 Spalten.

Die Anweisung hat funktioniert, dh die Datenbank hat 2 oder mehr Spalten. Versuchen Sie nun mit 3 Spalten.

1 'Bestellung von 3#

Die Datenbank hat keine Antwort gesendet, dh die Datenbank hat nur 2 Spalten. Jetzt werden wir versuchen, die Tabellenliste in der Datenbank zu entfernen. Wir werden die folgende Abfrage dafür verwenden

1 'Union All Select 1, Group_Concat (table_name) aus Information_Schema.
Tabellen wobei table_schema = database ()#

In der Backend -Datenbank "Gästebuch & Benutzer" befinden sich zwei Tabellen. Die Tabelle „Benutzer“ kann Benutzernamen und Passwörter enthalten. Um Spaltennamen aus der Tabelle zu extrahieren, fügen Sie die folgende Abfrage ein.

1 'Union All Select 1, Group_Concat (column_name) aus Information_Schema.
Spalten, wobei table_schema = datenbank ()#

Jetzt haben wir Spaltennamen extrahiert, dies schließt Benutzer- und Kennwortspalten ein. Diese Spalten speichern Kunden Benutzernamen und ihre Passwörter.

Jetzt werden wir versuchen, die Daten mithilfe der folgenden Abfrage zu extrahieren

1 'Gewerkschaft alle auswählen 1, Group_Concat (Benutzer, Passwort) von Benutzern#

Und so können Sie die blinde SQL -Injektion ausnutzen, ohne sich auf Fehler zu verlassen. Ausgabekennwörter werden die meiste Zeit gehasht, was mit Tools wie John the Ripper oder Hashcat entschlüsselt werden kann.

Abschluss:

Blind SQL Injection ist die Art von SQLI, die keine Datenbankfehler anzeigt oder mit einer sehr generischen Nachricht antwortet. Deshalb ist es sehr schwierig, die Schwachstellen der blinden SQL -Injektion in einer Webseite zu identifizieren. Nach der Erkennung können Sie es einfach mit manuellem oder automatisiertem Prozess mit SQLMAP ausnutzen.