SQL Injection: Unterschied zwischen den Versionen
Etduen (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
K (Kleinigkeiten angepasst.) |
||
Zeile 18: | Zeile 18: | ||
* Für $uid eine beliebige Eingabe, z. B. abc | * Für $uid eine beliebige Eingabe, z. B. abc | ||
* Für $pwd die Eingabe ́ ''OR 1=1 | * Für $pwd die Eingabe ́ '' OR 1=1 -- | ||
Wird keine Prüfung durchgeführt, ergibt sich dadurch die Abfrage: | Wird keine Prüfung durchgeführt, ergibt sich dadurch die Abfrage: | ||
''SELECT * FROM benutzertabelle WHERE benutzername = ́abc ́ AND passwort = | ''SELECT * FROM benutzertabelle WHERE benutzername = ́abc ́ AND passwort = ́ ́ OR 1=1 -- | ||
Da der Gesamte Term durch OR 1=1 immer „true“ als Ergebnis liefert kann der Angreifer sich so authentifizieren. | Da der Gesamte Term durch OR 1=1 immer „true“ als Ergebnis liefert kann der Angreifer sich so authentifizieren. |
Aktuelle Version vom 14. Februar 2020, 07:59 Uhr
Die SQL-Injektion (engl.: SQL injection) bezeichnet eine Angriffsmethode auf Datenbanken, bei der ein Angreifer durch eine fehlende Plausibilisierung der Parameterein- oder -übergabe ein SQL-Statement manipuliert.
Beispielsweise tritt sie dann auf, wenn ein Benutzer nach Eingaben gefragt wird, wie z.B. nach seinem Benutzernamen. Anstelle des Namens gibt der Benutzer eine SQL-Anweisung an, die auf der Datenbank ausgeführt wird. Dies ist dann möglich, wenn die Benutzereingaben, durch eine fehlende Plausibilisierung, auf der Seite des Web-Servers von einem Interpreter als Kommando oder Abfrage interpretiert und ausgeführt werden. Durch diese Schwachstellen kann der Zugriff auf Datenbanken gewährt werden und Daten können beispielsweise gelesen oder manipuliert werden.
Als Gegenmaßnahme können Prüfungen auf die Feldinhalte und die Feldlänge durchgeführt werden. Ein Angreifer kann ohne die Prüfungen folgende Elemente nutzen:
- den SQL String Delimiter ( ́),
- den SQL Statement Concatenation Character (;) und
- die SQL Comment Sequence bzw. Character nutzen (bei Microsoft® SQL Server: --, bei MySQL: #).
Ein Beispiel wäre folgende Abfrage die sich hinter einer Weboberfläche versteckt:
SELECT * FROM benutzertabelle WHERE benutzername = ́$uid ́ AND passwort = ́$pwd ́
Hier wird die Eingabe des Nutzers (Username und Passwort) mit der Datenbank abgeglichen, ob eine passende Kombination vorhanden ist bzw. ob es sich um einen zulässigen Benutzer handelt.
Ein Angreifer könnte nun ein folgende Eingabe tätigen:
- Für $uid eine beliebige Eingabe, z. B. abc
- Für $pwd die Eingabe ́ OR 1=1 --
Wird keine Prüfung durchgeführt, ergibt sich dadurch die Abfrage:
SELECT * FROM benutzertabelle WHERE benutzername = ́abc ́ AND passwort = ́ ́ OR 1=1 --
Da der Gesamte Term durch OR 1=1 immer „true“ als Ergebnis liefert kann der Angreifer sich so authentifizieren.