Was ist SQL-Injection?

Angriff, der ausnutzt, dass eine Webanwendung SQL-Anweisungen durch einfaches Anfügen von Nutzereingaben zusammensetzt, um mit der Eingabe die Bedeutung des Befehls zu ändern und die Datenbank unbefugt zu manipulieren. Prepared Statements mit Platzhaltern sind die grundlegende Gegenmaßnahme.

Japanische Bezeichnung: SQLインジェクション

„SQL-Injection“ kommt in 3 Übungsfragen aus 1 Themen vor, z. B. Grundlagen der Informationssicherheit.

Fachgebiet: Grundlagen der Informationssicherheit

Wie der Angriff funktioniert

Setzt eine Anwendung eine SQL-Anweisung zusammen, indem sie Zeichenketten wie „… WHERE name = '“, den Eingabewert und „'“ aneinanderhängt, schließt ein Anführungszeichen in der Eingabe die Zeichenkette, und alles Folgende wird als SQL-Befehl interpretiert. Mit der aus Lehrbüchern bekannten Eingabe ' OR '1'='1 wird die stets wahre Bedingung „oder '1' ist gleich '1'“ angehängt, sodass die Authentifizierung umgangen werden kann. Auch das Auslesen, Verändern oder Löschen von Daten kann die Folge sein.

Die grundlegende Gegenmaßnahme

Die grundlegende Gegenmaßnahme sind Prepared Statements mit Platzhaltern (parametrisierte Abfragen). Die Struktur der SQL-Anweisung wird zuerst festgelegt, und die Eingabe wird danach nur als Wert angebunden, sodass sie, gleich welche Zeichen sie enthält, nie Teil eines Befehls wird. Die Datenbankbibliotheken und Frameworks vieler Programmiersprachen bieten diese Funktion. Das Entfernen spezieller Zeichen aus Eingaben ist lückenanfällig, und Eingabeprüfungen im Browser können von Angreifern umgangen werden; keines von beiden ist für sich eine Gegenmaßnahme.

Maßnahmen zur Schadensbegrenzung

Zusätzlich zur grundlegenden Gegenmaßnahme werden weitere Schichten ergänzt: dem Konto, mit dem sich die Anwendung mit der Datenbank verbindet, nur die mindestens nötigen Rechte geben (Prinzip der minimalen Rechte), Nutzern keine detaillierten Fehlermeldungen anzeigen und typische Angriffszeichenketten mit einer WAF (Web Application Firewall) erkennen. Eine WAF ist nur ein Hilfsmittel und kein Ersatz für die Korrektur der Anwendung.

Jetzt üben: Fragen zu SQL-Injection

Warum gelten Prepared Statements mit Platzhaltern (parametrisierte Abfragen) als grundlegendere Gegenmaßnahme gegen SQL-Injection als das Entfernen gefährlicher Zeichen aus der Eingabe?

  1. AWeil die Eingabe verschlüsselt an die Datenbank übergeben wird, sodass Angreifer sie nicht lesen können
  2. BWeil der Browser die Art der eingegebenen Zeichen prüft, sodass schädliche Zeichenketten den Server nie erreichen
  3. CWeil zuerst die Struktur der SQL-Anweisung festgelegt wird und die Eingabe danach nur als Wert übergeben wird, sodass sie, gleich welche Zeichen sie enthält, nie als Teil des Befehls interpretiert wird
Antwort und Erläuterung anzeigen

Antwort: C. Weil zuerst die Struktur der SQL-Anweisung festgelegt wird und die Eingabe danach nur als Wert übergeben wird, sodass sie, gleich welche Zeichen sie enthält, nie als Teil des Befehls interpretiert wird

Bei einem Prepared Statement wird zuerst eine SQL-Anweisung, deren Werte durch Symbole (Platzhalter) ersetzt sind, etwa „SELECT … WHERE id = ? AND password = ?“, an die Datenbank übergeben, um ihre Struktur festzulegen; danach wird die Eingabe nur als Wert angebunden (Binding). Die Eingabe wird von Anfang bis Ende als Daten behandelt und wird daher auch mit Anführungszeichen nie Teil eines Befehls, etwa eines, der eine Bedingung anfügt. Das Entfernen oder Maskieren (Escaping) gefährlicher Zeichen erfordert, sämtliche Detailregeln jedes Datenbanktyps und jeder Zeichenkodierung lückenlos zu behandeln, und schon eine einzige Lücke lässt den Angriff gelingen. Eingabeprüfungen im Browser lassen sich umgehen, wenn der Angreifer Anfragen direkt ohne Browser sendet; sie dienen dem Komfort und sind keine Sicherheitsmaßnahme. Zusätzlich hält es den Schaden klein, dem Konto, mit dem sich die Anwendung mit der Datenbank verbindet, nur minimale Rechte zu geben.

Häufige Fragen

Lässt sich SQL-Injection durch Escaping verhindern?

Escaping kann sie in manchen Fällen verhindern, doch dafür müssen sämtliche Regeln jedes Datenbanktyps und jeder Zeichenkodierung lückenlos behandelt werden, und schon eine einzige Lücke lässt den Angriff gelingen. Grundlegende Gegenmaßnahme sind daher Prepared Statements mit Platzhaltern.

Lässt sich SQL-Injection durch eine Begrenzung der Eingabelänge verhindern?

Nein. Schon kurze Zeichenketten können die Bedeutung eines Befehls ändern. Begrenzungen der Länge oder der zulässigen Zeichen sind ergänzende Maßnahmen; die grundlegende Gegenmaßnahme sind Prepared Statements.

„SQL-Injection“ in den Erläuterungen

Fragen mit „SQL-Injection“ (3)

  1. Warum gelten Prepared Statements mit Platzhaltern (parametrisierte Abfragen) als grundlegendere Gegenmaßnahme gegen SQL-Injection als das Entfernen gefährlicher Zeichen aus der Eingabe?
  2. Welches der folgenden Beispiele ist Social Engineering?
  3. In einer Webanwendung kann man sich ohne Kenntnis des Passworts anmelden, wenn man im Passwortfeld des Anmeldebildschirms eine Zeichenkette wie ' OR '1'='1 eingibt. Wie heißt dieser Angriff?

Verwandte Begriffe

SQL Social Engineering Phishing Cross-Site-Scripting (XSS) Digitale Signatur Hashfunktion Message Authentication Code (Nachrichtenauthentifizierungscode) Multi-Faktor-Authentifizierung (MFA) Prinzip der minimalen Rechte (Least Privilege) Public-Key-Kryptografie (asymmetrische Verschlüsselung)

Zur Glossarübersicht