Die drei Arten der SQL-Injektion sind: 1. Numerische Injektion. Wenn der Eingabeparameter eine Ganzzahl ist, liegt möglicherweise eine Sicherheitsanfälligkeit für die numerische Injektion vor. 2. Wenn der Eingabeparameter eine Zeichenfolge ist, liegt möglicherweise ein Zeichentyp vor Injektions-Schwachstelle; 3. Such-Typ-Injektion, die Suchparameter werden bei der Datensuche nicht gefiltert.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, MySQL-Version 8.0, Dell G3-Computer.
SQL-Injection-Angriffe beziehen sich auf die Erstellung spezieller Eingaben als Parameter und deren Übergabe an Webanwendungen. Bei den meisten dieser Eingaben handelt es sich um einige Kombinationen in der SQL-Syntax. Durch die Ausführung von SQL-Anweisungen führt der Angreifer die gewünschte Operation aus Der Grund dafür ist, dass das Programm die vom Benutzer eingegebenen Daten nicht sorgfältig filtert, was dazu führt, dass illegale Daten in das System eindringen.
1. Numerische Injektion
Wenn der Eingabeparameter eine Ganzzahl ist, liegt möglicherweise eine Sicherheitslücke bei der numerischen Injektion vor.
Angenommen, es gibt eine URL: HTTP://www.aaa.com/test.php?id=1
Sie können die Hintergrund-SQL-Anweisung wie folgt erraten:
SELECT * FROM table WHERE id=1
Beurteilen Sie die Zahl SQL-Injektionspunkt vom Typ Schwachstelle:
① Geben Sie zunächst ein einfaches Anführungszeichen „
“ in das Eingabefeld ein. Die SQL-Anweisung lautet:
SELECT * FROM table WHERE id=1“,
entspricht nicht der Syntax , also Diese Anweisung wird definitiv schief gehen, was dazu führt, dass das Skript keine Daten aus der Datenbank abrufen kann, was zu einer Ausnahme auf der Originalseite führt.
② Geben Sie und 1 = 1 in das Eingabefeld ein
Die SQL-Anweisung wird zu:
SELECT * FROM table WHERE id=1 und 1 = 1
Die Anweisung ist korrekt und wird normal ausgeführt. Es gibt keinen Unterschied zwischen den zurückgegebenen Daten und die ursprüngliche Anfrage.
③ Geben Sie und 1 = 2 in die Datenbank ein
Die SQL-Anweisung lautet:
SELECT * FROM table WHERE id=1 und 1 = 2
Obwohl die Syntax korrekt ist und die Anweisung normal ausgeführt wird, ist die Logik falsch, weil 1 = 2 Es ist dauerhaft falsch, daher unterscheiden sich die zurückgegebenen Daten von der ursprünglichen Anfrage.
Wenn alle oben genannten drei Schritte erfüllt sind, weist das Programm möglicherweise eine numerische SQL-Injection-Schwachstelle auf.
2. Zeicheninjektion
Wenn der Eingabeparameter eine Zeichenfolge ist, liegt möglicherweise eine Sicherheitslücke bei der Zeicheninjektion vor. Der größte Unterschied zwischen numerischer und Zeicheninjektion besteht darin, dass numerische Typen nicht in einfache Anführungszeichen gesetzt werden müssen, während Zeichentypen im Allgemeinen in einfache Anführungszeichen gesetzt werden müssen.
Das Wichtigste bei der Zeicheninjektion ist das Schließen der SQL-Anweisung und das Auskommentieren des redundanten Codes.
Angenommen, die Hintergrund-SQL-Anweisung lautet wie folgt:
SELECT * FROM table WHERE username = 'admin'
Bestimmen Sie den SQL-Injektionspunkt der Zeichentyp-Schwachstelle:
① Oder geben Sie zum Testen zuerst das einfache Anführungszeichen admin' ein
eine solche SQL-Anweisung wird zu:
SELECT * FROM table WHERE username = 'admin''.
Die Seite ist abnormal.
② Eingabe: admin' und 1 = 1 --
Hinweis: Nach admin steht ein einfaches Anführungszeichen ', das zum Schließen der Zeichenfolge verwendet wird, und am Ende befindet sich ein Kommentarzeichen (es gibt ein Leerzeichen). nach den beiden Takten!
Die SQL-Anweisung lautet:
SELECT * FROM table WHERE username = 'admin' and 1 = 1 --
Die Seite wird korrekt angezeigt.
③ Eingabe: admin' und 1 = 2 --
SQL-Anweisung wird zu:
SELECT * FROM table WHERE username = 'admin' und 1 = 2 --
Seitenfehler.
Wenn die oben genannten drei Schritte erfüllt sind, liegt möglicherweise eine Zeichen-SQL-Injection vor.
3. Suchinjektion
Dies ist eine besondere Art der Injektion. Diese Art der Injektion bezieht sich hauptsächlich darauf, dass die Suchparameter bei der Durchführung von Datensuchen nicht gefiltert werden. Im Allgemeinen steht „keyword=keyword“ in der Linkadresse, sondern wird direkt über das Suchfeldformular übermittelt. Der Prototyp der von dieser Art von Injektionspunkt übermittelten SQL-Anweisung lautet ungefähr: Wählen Sie * aus dem Tabellennamen aus, wobei das Feld „%keyword%“ lautet. Wenn eine Injektion vorliegt, können wir zum Sprengen eine SQL-Injektionsanweisung ähnlich der folgenden erstellen: Wählen Sie * aus der Tabelle Der Name des Felds ist wie „%test%“ und „%1%“=„%1%“.
Im Folgenden sind einige gebräuchliche Injektionsnamen aufgeführt:
POST-Injektion: Das Injektionsfeld befindet sich in den POST-Daten
Cookie-Injektion: Das Injektionsfeld befindet sich in den Cookie-Daten.
Verzögerte Injektion: Wird mithilfe der Datenbankverzögerungsfunktion eingefügt Die injizierte Zeichenfolge muss mit Base64 verschlüsselt sein
Häufige Datenbankinjektionen
Dateien lesen und schreiben
Befehle ausführen
Bei der Programminjektion führen Angreifer diese drei Dinge unabhängig von einer Datenbank aus, aber die in verschiedene Datenbanken injizierten SQL-Anweisungen sind unterschiedlich.
① Zählen Sie die aktuelle Tabelle oder Spalte auf.
Nehmen Sie an, dass eine solche Tabelle vorhanden ist:
Fragen Sie die Details des Root-Benutzers wie folgt ab:
SELECT * FROM user WHERE username = 'root ' UND Passwort = 'root'
Ein Angreifer kann SQL Server-Funktionen verwenden, um an vertrauliche Informationen zu gelangen. Geben Sie die folgende Anweisung in das Eingabefeld ein:
' mit 1 = 1 --
Die endgültige ausgeführte SQL-Anweisung lautet:
SELECT * FROM user WHERE username = 'root' AND password = 'root' HAVING 1 = 1 --
Dann wirft der SQL-Executor möglicherweise einen Fehler aus:
Der Angreifer kann feststellen, dass der aktuelle Tabellenname user, und die Feld-ID existiert.
Der Angreifer kann diese Funktion verwenden, um weiterhin andere Spaltennamen abzurufen. Geben Sie die folgende Anweisung ein:
' GROUP BY users.id HAVING 1 = 1 --
Dann wird die SQL-Anweisung zu:
SELECT * FROM user WHERE username = ' root' AND password = 'root' GROUP BY users.id HAVING 1 = 1 --
löst den Fehler aus:
Daran können Sie erkennen, dass der Spaltenname username enthalten ist. Sie können eine rekursive Abfrage einmal ausführen, bis keine Fehlermeldung mehr zurückgegeben wird. Sie können also die HAVING-Klausel verwenden, um alle Spaltennamen der aktuellen Tabelle abzurufen.
Hinweis: Jede durch Select angegebene Spalte sollte in der Group By-Klausel erscheinen, es sei denn, für diese Spalte wird eine Aggregatfunktion verwendet
② Extrahieren Sie Daten mithilfe von Datentypfehlern
Wenn Sie versuchen, eine Zeichenfolge mit einer Nicht-Zeichenfolge zu vergleichen oder eine Zeichenfolge in einen anderen inkompatiblen Typ konvertieren, löst der SQL-Editor eine Ausnahme aus.
Die folgende SQL-Anweisung:
SELECT * FROM user WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users)
Executor-Fehlermeldung:
This You kann den Benutzernamen root des Benutzers abrufen. Denn in der Unterabfrage SELECT TOP 1 username FROM wird der zuerst abgefragte Benutzername vom Typ varchar zurückgegeben und dann mit 1 vom Typ int verglichen. Es wird ein Fehler gemeldet führte zu einer Datenpanne.
Verwenden Sie diese Methode, um alle Kontoinformationen rekursiv abzuleiten:
SELECT * FROM Users WHERE Username = 'abc' AND Password = 'abc' AND 1 > (SELECT TOP 1 Username FROM Users WHERE not in ('root')) .
Sie können den nächsten Benutzernamen erhalten, indem Sie diese Anweisung erstellen. Wenn Sie den Benutzernamen in der Unterabfrage durch andere Spaltennamen ersetzen, können Sie die Informationen anderer Spalten abrufen, die hier nicht beschrieben werden.
2. Metadaten abrufen
Zum Beispiel:
SELECT *** FROM *** WHERE id = *** UNION SELECT 1, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
Wenn die Anzahl der Spalten in der aktuellen Tabelle 2 beträgt, können Sie die UNION-Anweisung verwenden um die aktuelle Datenbanktabelle zu erhalten. Wie Sie die Anzahl der Spalten in der aktuellen Tabelle erraten können, wird später beschrieben.
Einige häufig verwendete Systemdatenbankansichten:
Beschreibung | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Alle Datenbanken in SQL Server | |||||||||||||||||||
Alles im SQL Server-Anmeldenamen | |||||||||||||||||||
Alle Datentabellen in der aktuellen Benutzerdatenbank | |||||||||||||||||||
Alle Spalten in der aktuellen Benutzerdatenbank | |||||||||||||||||||
Benutzerdefiniert und Systemobjekte Union aller Spalten | |||||||||||||||||||
Per Berechtigungen oder Spaltenausnahmeberechtigungen in der Datenbank | |||||||||||||||||||
In der Datenbank gespeicherte Datenbankdateien | |||||||||||||||||||
in der Datenbank erstellt Objekt (einschließlich Einschränkungen, Protokolle und gespeicherte Prozeduren) |
Beschreibung | sp_dropuser | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
xp_enumgroups | Stellt eine lokale Microsoft Windows-Gruppenliste bereit oder definiert eine globale Gruppenliste in einer angegebenen Windows-Domäne | ||||||||||||||||||
xp_regread | Liest die Registrierung | ||||||||||||||||||
xp_servicecontrol | |||||||||||||||||||
Rollen | Berechtigungen |
---|---|
Bulkadmin | kann BULK INSERT-Anweisungen ausführen |
dbcreator | kann erstellen, ändern, löschen und wiederherstellen Datenbank |
diskadmin | kann Festplattendateien verwalten |
processadmin | kann Instanzen anlegen, die in der Datenbank-Engine ausgeführt werden |
securityadmin | kann Anmeldungen und deren Attribute verwalten; kann GRANT, DENY und REVOKE Server nutzen. Berechtigungen auf Datenbankebene; Sie können auch die Berechtigungen auf Datenbankebene GRANT, DENY und REVOKE nutzen; Sie können auch das Passwort für Ihre SQL Server-Anmeldung zurücksetzen |
serveradmin | Kann serverweite Konfigurationsoptionen ändern und den Server herunterfahren |
setupadmin | kann Verbindungsserver hinzufügen und löschen und bestimmte gespeicherte Systemprozeduren ausführen |
sysadmin | kann jede Aktivität in der Datenbank-Engine ausführen |
SQL Server unterstützt die dynamische Ausführung Anzahl der Anweisungen kann der Benutzer eine Zeichenfolge senden, um eine SQL-Anweisung auszuführen.
Zum Beispiel: exec('SELECT Benutzername, Passwort FROM Benutzer')
Sie können auch eine hexadezimale SQL-Anweisung definieren und die exec-Funktion verwenden, um sie auszuführen. Die meisten Webanwendungen und Firewalls filtern einfache Anführungszeichen. Die Verwendung von exec zum Ausführen hexadezimaler SQL-Anweisungen kann viele Firewalls und Anti-Injection-Programme durchbrechen, wie zum Beispiel:
declare @query varchar(888) select @query=0x73656C6563742031 exec(@query)
oder:
declare/**/@Abfrage/**/varchar (888) /**/wählen/**/@query=0x73656C6563742031/**/exec(@query)
Verwandte Empfehlungen: „MySQL-Tutorial“
Das obige ist der detaillierte Inhalt vonWelche drei Möglichkeiten der SQL-Injektion gibt es?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!