Zuletzt aktualisiert am 04.12.2025 5 Minuten Lesezeit

SQL Injection

SQL Injection (SQLi) ist eine der aeltesten und gefaehrlichsten Sicherheitsluecken in Webanwendungen. Bei diesem Angriff schleusen Angreifer schadhaften SQL-Code in Eingabefelder ein, um unbefugt auf Datenbanken zuzugreifen, Daten zu manipulieren oder zu loeschen. Die OWASP (Open Web Application Security Project) listet SQL Injection seit Jahren unter den kritischsten Sicherheitsrisiken fuer Webanwendungen.

SQL Injection funktioniert, weil viele Anwendungen Benutzereingaben direkt in SQL-Abfragen einbauen, ohne diese vorher zu pruefen oder zu bereinigen. Stell dir vor, ein Login-Formular nimmt deinen Benutzernamen und baut daraus eine Datenbankabfrage. Wenn niemand prueft, ob du tatsaechlich nur einen Namen eingegeben hast, kannst du stattdessen SQL-Befehle einschleusen, die die Abfrage veraendern.

So funktioniert ein SQL-Injection-Angriff

Um SQL Injection zu verstehen, schauen wir uns ein typisches Beispiel an. Eine Webanwendung hat ein Login-Formular, das Benutzername und Passwort abfragt. Im Hintergrund wird folgende SQL-Abfrage ausgefuehrt:

SELECT * FROM users WHERE username = 'eingabe' AND password = 'passwort';

Ein Angreifer gibt nun als Benutzernamen nicht einen normalen Namen ein, sondern:

admin' --

Die resultierende SQL-Abfrage sieht dann so aus:

SELECT * FROM users WHERE username = 'admin' -- ' AND password = 'beliebig';

Das Doppelminus (--) ist ein SQL-Kommentar. Alles danach wird ignoriert, also auch die Passwortpruefung. Der Angreifer erhaelt Zugang zum Admin-Konto, ohne das Passwort zu kennen. Mit diesem einfachen Trick umgeht er die komplette Authentifizierung.

Arten von SQL-Injection-Angriffen

Je nach Angriffstechnik und Rueckmeldung der Anwendung unterscheidet man verschiedene SQL-Injection-Typen. Das Verstaendnis dieser Varianten hilft dir, Sicherheitsluecken besser zu erkennen und zu beheben.

In-Band SQL Injection (klassisch)

Bei der klassischen SQL Injection erhaelt der Angreifer die Ergebnisse direkt in der Antwort der Webanwendung. Eine verbreitete Technik ist die UNION-basierte Injection: Der Angreifer nutzt den UNION-Operator, um zusaetzliche Abfragen anzuhaengen und Daten aus anderen Tabellen auszulesen.

SELECT name, preis FROM produkte WHERE id = 1 UNION SELECT username, password FROM users --

Diese Abfrage haengt die Benutzer-Tabelle an die Produktabfrage an. Die Benutzernamen und Passwoerter erscheinen dann in der normalen Produktansicht.

Blind SQL Injection

Bei Blind SQL Injection zeigt die Anwendung keine Fehlermeldungen oder Abfrageergebnisse direkt an. Der Angreifer muss stattdessen indirekt auf den Erfolg seiner Abfragen schliessen. Es gibt zwei Hauptvarianten:

  • Boolean-Based: Der Angreifer stellt Ja/Nein-Fragen an die Datenbank und beobachtet, ob sich die Seite aendert. Zeigt die Seite bei 1=1 (wahr) andere Inhalte als bei 1=2 (falsch), ist die Anwendung anfaellig.
  • Time-Based: Der Angreifer fuegt Befehle ein, die die Datenbank verzoegern (z.B. SLEEP(5)). Dauert die Antwort laenger, weiss er, dass sein Code ausgefuehrt wurde.

Stored SQL Injection (Second-Order)

Bei Stored SQL Injection wird der schadhafe Code zunaechst in der Datenbank gespeichert und erst spaeter ausgefuehrt. Ein Angreifer traegt beispielsweise einen manipulierten Namen bei der Registrierung ein. Wenn ein Administrator spaeter die Benutzerliste abruft, wird der eingebettete SQL-Code ausgefuehrt. Diese Variante ist besonders tueckisch, weil zwischen Einschleusung und Ausfuehrung Zeit vergeht.

Moegliche Schaeden durch SQL Injection

Die Auswirkungen einer erfolgreichen SQL Injection koennen verheerend sein. Je nach Datenbankberechtigungen und Systemkonfiguration kann ein Angreifer:

  • Daten auslesen: Kundendaten, Passwoerter, Geschaeftsgeheimnisse, personenbezogene Daten (Verstoss gegen DSGVO)
  • Daten manipulieren: Preise aendern, Kontodaten faelschen, Berechtigungen erweitern
  • Daten loeschen: Komplette Datenbanken leeren (DROP TABLE)
  • Systembefehle ausfuehren: Bei manchen Datenbanksystemen koennen Angreifer ueber SQL auch Betriebssystembefehle ausfuehren
  • Weitere Systeme angreifen: Die kompromittierte Datenbank als Sprungbrett fuer Angriffe auf andere Server nutzen

Schutzmassnahmen gegen SQL Injection

SQL Injection laesst sich mit den richtigen Programmiertechniken zuverlaessig verhindern. Die wichtigste Massnahme sind Prepared Statements, ergaenzt durch weitere Schutzmechanismen.

Prepared Statements (parametrisierte Abfragen)

Prepared Statements sind der wirksamste Schutz gegen SQL Injection. Bei dieser Technik wird die SQL-Struktur von den Benutzerdaten getrennt. Die Datenbank erhaelt zuerst die Abfrage mit Platzhaltern, dann die Werte. Die Datenbank behandelt die Werte dadurch immer als Daten, niemals als ausfuehrbaren Code.

Hier ein Beispiel in PHP mit PDO:

// UNSICHER - anfaellig fuer SQL Injection
$sql = "SELECT * FROM users WHERE username = '" . $_POST['user'] . "'";

// SICHER - mit Prepared Statement
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_POST['user']]);

Auch andere Programmiersprachen bieten Prepared Statements: In Java mit JDBC, in Python mit DB-API, in C# mit ADO.NET. Die OWASP SQL Injection Prevention Cheat Sheet bietet Beispiele fuer alle gaengigen Sprachen.

Weitere Schutzmassnahmen

Neben Prepared Statements solltest du weitere Massnahmen umsetzen, um die Informationssicherheit deiner Anwendung zu erhoehen:

  • Eingabevalidierung: Pruefe Benutzereingaben auf erlaubte Zeichen, Laenge und Format. Eine Postleitzahl sollte nur Ziffern enthalten, eine E-Mail-Adresse muss ein bestimmtes Format haben.
  • Principle of Least Privilege: Der Datenbankbenutzer der Anwendung sollte nur die minimal notwendigen Rechte haben. Eine Webanwendung braucht selten DROP- oder DELETE-Rechte auf allen Tabellen.
  • Fehlerbehandlung: Zeige Benutzern niemals technische Fehlermeldungen mit SQL-Details an. Diese helfen Angreifern, ihre Attacken zu verfeinern. Logge Fehler serverseitig und zeige dem Benutzer nur generische Meldungen.
  • Web Application Firewall (WAF): Eine WAF kann bekannte SQL-Injection-Muster erkennen und blockieren. Sie ist eine sinnvolle Ergaenzung, ersetzt aber nicht sichere Programmierung.

SQL Injection erkennen und testen

Um Schwachstellen in deinen eigenen Anwendungen zu finden, gibt es verschiedene Testmethoden. Wichtig: Teste nur Anwendungen, fuer die du eine Berechtigung hast. Unautorisierte Tests sind strafbar.

  • Manuelle Tests: Gib in Eingabefelder Sonderzeichen wie ', ", --, ; DROP TABLE ein und beobachte die Reaktion
  • Automatisierte Scanner: Tools wie OWASP ZAP oder SQLMap pruefen Webanwendungen automatisch auf SQL-Injection-Schwachstellen
  • Code-Review: Durchsuche den Quellcode nach direkter String-Verkettung in SQL-Abfragen
  • Statische Code-Analyse: Tools wie SonarQube erkennen unsichere Datenbankzugriffe automatisch

SQL Injection in der Praxis

SQL Injection ist ein zentrales Thema in der IT-Sicherheit. Wer als Fachinformatiker fuer Anwendungsentwicklung Webanwendungen entwickelt, muss sichere Datenbankzugriffe beherrschen. Prepared Statements sollten zur Standardpraxis gehoeren. Auch Fachinformatiker fuer Systemintegration benoetigen dieses Wissen, um Web Application Firewalls zu konfigurieren und Sicherheitsaudits durchzufuehren.

Trotz des Alters dieser Angriffsmethode bleiben SQL-Injection-Schwachstellen weit verbreitet. Die OWASP listet Injection-Angriffe seit ueber 20 Jahren unter den Top-10-Sicherheitsrisiken. Viele erfolgreiche Hackerangriffe auf Unternehmen und Behoerden nutzen diese Luecke.

Quellen und weiterfuehrende Links