Cross-Site Scripting und SQL-Injection

Gefahren durch Benutzereingaben

Egal ob PHP oder ASP(X) - im Wesentlichen wird also immer eine SQL-Abfrage zusammengesetzt und dann an den SQL-Server gesendet. Das Problem liegt hier an einer ähnlichen Stelle wie beim XSS: Die Benutzereingaben, die in den Variablen username und password stehen, werden einfach ungetestet benutzt. Das bedeutet aber auch, dass der Angreifer dort beliebige Texte eintragen kann, die unbesehen an den Datenbank-Server weitergegeben werden.

Das kann fatale Folgen haben, wenn ein Benutzer beispielsweise folgenden Text in der Textbox für den Benutzernamen einträgt:

' or 0=0 --

Bevor wir die Konsequenzen dieses Textes vom Standpunkt der Sicherheit erläutern, noch ein Rat: Wenn Ihnen der vorab abgebildete Ausdruck nichts sagt, sollten Sie zunächst ein gutes Buch oder eine Webseite über SQL-Queries und die Verwendung von Sonderzeichen konsultieren. Das wird Ihnen mit Sicherheit in Zukunft eine Menge Ärger ersparen.

Doch weiter mit dem Sicherheitsaspekt des Textes. Da der Text einfach in den SQL-Querystring eingebaut wird, sieht dieser nun wie folgt aus:

Select count(*) from users where username=' or 0=0 - - and password= limit 1

Dabei ist es wichtig zu wissen, wofür die beiden Minus-Zeichen (- -) im Query-string stehen. Sie kommentieren nämlich den Rest der Abfragebedingungen aus: Von diesen Zeichen an ignoriert der Server alle weiteren Zeichen.

Effektiv gibt es also ein Select, das immer den Wert true annimmt - denn die Auswahl des leeren User-Namens spielt keine Rolle, da der Ausdruck "0 = 0" immer wahr ist und damit die Oder-Verknüpfung das Ergebnis "wahr" hat. Die Abfrage evaluiert also zu "true" - und der Angreifer hat sich erfolgreich bei Ihrer Anwendung eingeloggt, ohne auch nur einen Benutzer zu kennen - geschweige denn sein Passwort. Das mag auf den ersten Blick noch nicht so schlimm wirken: Was kann der Angreifer schon groß tun, denn schließlich hat er ja keinen Zugriff auf "echte" Account-Daten.