SQL Injection
SQL Injection ist ein Angriff, bei dem ein Angreifer schädlichen SQL-Code in Eingabefelder oder Parameter einer Webanwendung einschleust, um unautorisierten Zugang zur Datenbank zu erhalten oder Daten zu manipulieren.
SQL Injection (SQLi) gehört seit Jahren zu den häufigsten und kritischsten Web-Sicherheitslücken und steht seit den ersten OWASP Top 10 (2003) auf der Liste. Ein erfolgreicher SQLi-Angriff kann zur vollständigen Datenbankoffenlegung, Authentifizierungs-Bypass, Datenmanipulation oder sogar zu Remote Code Execution führen.
Wie SQL Injection funktioniert
Eine verwundbare Login-Abfrage:
SELECT * FROM users WHERE username = '$input_user' AND password = '$input_pass'
Eingabe: username = ' OR '1'='1' --
Resultierende Abfrage:
SELECT * FROM users WHERE username = '' OR '1'='1' -- AND password = '...'
'1'='1' ist immer wahr, -- kommentiert den Rest aus. Ergebnis: Login ohne gültiges Passwort.
SQL Injection Varianten
In-band SQLi: Direkte Rückgabe der Daten in der HTTP-Antwort
- Union-based: Zusammenführung mit anderen Tabellendaten
- Error-based: Datenbankfehler liefern Informationen
Blind SQLi: Keine direkte Rückgabe, aber Verhaltensunterschiede erkennbar
- Boolean-based: Unterschiedliche Antworten je nach true/false-Bedingung
- Time-based: Verzögerte Antworten durch
SLEEP()-Funktionen
Out-of-band SQLi: Daten werden über externen Kanal (DNS, HTTP) exfiltriert
Schutzmaßnahmen
Prepared Statements / Parameterized Queries sind die wichtigste Gegenmaßnahme:
cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))
Weitere Maßnahmen:
- Input Validation und Whitelisting
- Least-Privilege-Datenbanknutzer (kein
rootodersa) - Web Application Firewall (WAF) als zusätzliche Schicht
- Regelmäßige Penetrationstests und Code Reviews