Glossar · Sicherheit
SQL-Injection
Englisch: SQL injection
Auch genannt: SQLi, SQL-Einschleusung
Definition
Eine Schwachstelle, bei der Nutzereingaben in eine SQL-Abfrage verkettet werden, sodass ein Angreifer deren Logik ändern und Daten lesen, ändern oder löschen kann.
SQL-Injection (SQLi) tritt auf, wenn eine Anwendung eine SQL-Anweisung baut, indem sie Nutzereingaben in den Abfragestring einfügt. Enthält die Eingabe SQL-Syntax, führt die Datenbank sie als Teil der Abfrage aus. Je nach Abfrage und Datenbankberechtigungen kann ein Angreifer einen Login umgehen, Daten anderer Nutzer lesen, Datensätze ändern oder im schlimmsten Fall Befehle auf dem Server ausführen. In den OWASP Top 10 2021 gehört sie zu A03 Injection.
Beispiel
Verwundbarer Java-Code:
String sql = "SELECT * FROM users WHERE email = '" + email + "'";
ResultSet rs = conn.createStatement().executeQuery(sql);
Ist email gleich ' OR '1'='1, wird daraus die Abfrage:
SELECT * FROM users WHERE email = '' OR '1'='1'
Die Bedingung ist immer wahr, also liefert die Abfrage alle Nutzer. Die Lösung ist eine parametrisierte Abfrage, bei der die Eingabe getrennt vom SQL-Text gesendet wird und dessen Struktur niemals ändern kann:
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE email = ?");
ps.setString(1, email);
ResultSet rs = ps.executeQuery();
Was ein Tester prüft
Mit schriftlicher Genehmigung und in einer Testumgebung:
- Die Syntax brechen. Geben Sie ein einzelnes Anführungszeichen
'in jedes Textfeld, jeden URL-Parameter, jeden Header und jeden JSON-Wert ein, der eine Abfrage erreichen könnte. Ein500-Fehler, eine Datenbankfehlermeldung oder eine veränderte Zahl von Ergebnissen deuten darauf hin, dass die Eingabe ungefiltert im SQL landet. - Die Logik ändern. Vergleichen Sie
value' AND '1'='1mitvalue' AND '1'='2. Unterscheiden sich die beiden Antworten auf eine Weise, die der einfache Wert nicht erklärt, wird die Eingabe interpretiert. - Weniger offensichtliche Eingaben ansehen. Sortierspalten, Filterfelder, Suchfelder und Report-Parameter werden oft dynamisch gebaut, weil Spaltennamen nicht als Parameter gebunden werden können.
- Die Fehlerbehandlung prüfen. Datenbankfehler, Tabellennamen oder Stacktraces in Antworten sind für sich genommen schon ein Befund.
Tools wie sqlmap automatisieren tiefergehende Untersuchungen. Führen Sie sie aber nur gegen Systeme aus, die Sie ausdrücklich testen dürfen, denn sie können Daten ändern oder löschen.
Schutzmaßnahmen, die Sie verifizieren sollten
Parametrisierte Abfragen oder ein überall korrekt verwendetes ORM; Allow-Lists für dynamische Bezeichner wie Sortierspalten; ein Datenbankkonto mit minimalen Rechten (Least Privilege); und generische Fehlermeldungen. Eingabevalidierung hilft, ist aber kein Ersatz für Parametrisierung.