Was ist SQL-Injection (SQLi)?
SQL-Injection (SQLi) ist eine Art von Angriff, bei dem Angreifer bösartige SQL-Anweisungen in ein Eingabefeld eingeben, um die Datenbank zu manipulieren.
Dieser Angriff zielt auf Anwendungen ab, die die Validierung und Benutzereingaben nicht ordnungsgemäß behandeln, wodurch unbefugter Zugriff auf sensible Daten wie Passwörter oder Kreditkartendetails ermöglicht wird.
Wie SQL-Injection funktioniert
Wenn eine Anwendung Benutzereingaben direkt in eine Datenbankabfrage einfügt, ohne ordnungsgemäße Validierung, können Angreifer das Verhalten der Abfrage ändern, um eine bösartige SQL-Anweisung einzugeben.
Zum Beispiel:
SELECT * FROM users WHERE username = 'admin' AND password = '12345';
Ein Angreifer könnte eingeben:
' OR '1'='1
Ergebnis:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';
Dies gibt immer true zurück und gewährt unbefugten Zugriff.
Warum SQL-Injection in der Cybersicherheit wichtig ist
SQL-Injection ist die gefährlichste und älteste Technik in der Cybersicherheit. Diese Art von Angriff wird konsequent in den OWASP Top 10 aufgeführt.
Selbst kleine Schwachstellen ermöglichen einem Angreifer zu:
- Zugriff auf, Änderung oder Löschung von Daten
- Umgehung der Authentifizierung
- Ausführung administrativer Operationen auf der Datenbank.
- Kompromittierung des gesamten Systems.
Häufige Arten von SQL-Injection
- Klassische SQLi : Direkte Injection über Webformulare oder URL-Parameter.
- Blind SQLi : Angreifer leiten indirekt Datenbankinformationen ab (z.B. über Fehlermeldungen oder Antwortzeiten).
- Union-basierte SQLi : Verwendet den UNION-Operator, um Ergebnisse aus mehreren Abfragen zu kombinieren.
- Fehlerbasierte SQLi : Stützt sich auf Datenbankfehlermeldungen, um Informationen zu extrahieren.
- Zeitbasierte Blind SQLi : Nutzt Serverantwortverzögerungen aus, um Abfrageergebnisse zu erraten.
Wie man SQL-Injection verhindert
1. Verwendung von parametrierten Abfragen (Prepared Statements)
Stellen Sie sicher, dass SQL-Befehle Benutzereingaben als Daten und nicht als ausführbaren Code behandeln.
cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
2. Eingabevalidierung und -sanitierung
Validieren Sie alle Eingaben von Benutzern und erlauben Sie nur erwartete Zeichen.
3. Verwendung von ORM-Frameworks
Frameworks wie Prisma, Hibernate usw. reduzieren den direkten Umgang mit SQL.
4. Prinzip der geringsten Privilegien
Beschränken Sie Benutzerberechtigungen und geben Sie nur die benötigten Berechtigungen.
5. Regelmäßige Sicherheitstests
Verwenden Sie Anwendungssicherheitstest-Tools wie SAST, DAST oder IAST, um Injektionsfehler frühzeitig zu erkennen.
Beispiel in der realen Welt
Eine Website eines Online-Shops erlitt einen Sicherheitsvorfall, bei dem Angreifer eine SQL-Injektion in einem Anmeldeformular nutzten, um Kreditkartendaten aus ihrer Datenbank zu extrahieren.
Verwandte Begriffe
- XSS (Cross-Site Scripting)
- DAST (Dynamic Application Security Testing)
- OWASP Top 10
- Application Security Testing