16.02.2006, 20:39 Uhr
Webapps vor SQL-Injection geschützt
Computerworld-Sicherheitsexperte Simon Wepfer erklärt, wie man sich vor SQL-Injection schützt.
Jede Woche beantworten Sicherheitsexperten Leserfragen und geben Ratschläge, wie sich die Sicherheit in einem Unternehmen erhöhen lässt.
Frage: Ich habe den Auftrag erhalten, eine Webapplikation vor «SQL-Injection» zu schützen. Wie funktioniert dieser Angriff und wie kann ich meine Applikation davor bewahren?
SQL-Injection ist ein Angriff auf Datenbank-basierte Applikationen. Ähnlich wie beim «Buffer Overflow» wird eine Schwachstelle im Code ausgenutzt, welche es erlaubt, Benutzereingaben in Befehle zu verwandeln. Bei der SQL-Injection werden dabei die SQL Befehle manipuliert, welche die Applikation an die Datenbank sendet.
Beispiel
Oft sind Webapplikationen von SQL-Injection betroffen, da diese öffentlich zugänglich sind. Eine geschlossene Webapplikation verlangt einen Benutzernamen und ein Passwort, um den Benutzer zu authentifizieren. Dieser gibt in den beiden Eingabefeldern seine Daten ein, etwa "jdoe" und "topsecret". Daraus erstellt die Anwendung eine SQL-Abfrage, um festzustellen, ob die Eingaben korrekt sind. Diese wird an die Datenbank geschickt und sieht in der Regel etwa folgendermassen aus: «SELECT id FROM users WHERE username = "jdoe" and password = "topsecret"». Gibt die Datenbank nun einen gültigen Eintrag zurück, weiss die Applikation, dass der Benutzer existiert und das Passwort korrekt eingegeben wurde. Selbstverständlich sollten Passwörter in Datenbanken verschlüsselt abgelegt werden, worauf aus praktischen Gründen in diesem Beispiel verzichtet wird. Was passiert nun, wenn der Benutzer statt "jdoe" und "topsecret" folgendes eingibt: «" OR ""="»? Falls der Programmierer die SQL-Befehle durch Strings zusammensetzt und die Applikation anfällig ist, wird der finale SQL-Befehl wie folgt aussehen: «SELECT id FROM users WHERE username = "" OR ""="" AND password = "" OR ""=""». mDamit wird eine Anfrage an die Datenbank geschickt, welche sämtliche Benutzer-IDs retourniert. Mit grosser Wahrscheinlichkeit wird die erste ID sogar die eines privilegierten Benutzers sein. Da die Applikation wahrscheinlich nur eine oder keine ID erwartet, bleiben die restlichen Einträge unbemerkt und der Benutzer wird authentifiziert.
Oft sind Webapplikationen von SQL-Injection betroffen, da diese öffentlich zugänglich sind. Eine geschlossene Webapplikation verlangt einen Benutzernamen und ein Passwort, um den Benutzer zu authentifizieren. Dieser gibt in den beiden Eingabefeldern seine Daten ein, etwa "jdoe" und "topsecret". Daraus erstellt die Anwendung eine SQL-Abfrage, um festzustellen, ob die Eingaben korrekt sind. Diese wird an die Datenbank geschickt und sieht in der Regel etwa folgendermassen aus: «SELECT id FROM users WHERE username = "jdoe" and password = "topsecret"». Gibt die Datenbank nun einen gültigen Eintrag zurück, weiss die Applikation, dass der Benutzer existiert und das Passwort korrekt eingegeben wurde. Selbstverständlich sollten Passwörter in Datenbanken verschlüsselt abgelegt werden, worauf aus praktischen Gründen in diesem Beispiel verzichtet wird. Was passiert nun, wenn der Benutzer statt "jdoe" und "topsecret" folgendes eingibt: «" OR ""="»? Falls der Programmierer die SQL-Befehle durch Strings zusammensetzt und die Applikation anfällig ist, wird der finale SQL-Befehl wie folgt aussehen: «SELECT id FROM users WHERE username = "" OR ""="" AND password = "" OR ""=""». mDamit wird eine Anfrage an die Datenbank geschickt, welche sämtliche Benutzer-IDs retourniert. Mit grosser Wahrscheinlichkeit wird die erste ID sogar die eines privilegierten Benutzers sein. Da die Applikation wahrscheinlich nur eine oder keine ID erwartet, bleiben die restlichen Einträge unbemerkt und der Benutzer wird authentifiziert.
Simon Wepfer