Cross-Site Scripting und SQL-Injection

Angriff auf Datenbanken: SQL-Injection

Anders als beim XSS geht es bei der SQL -Injection (Einschleusung von SQL-Code) nicht darum, einen anderen Anwender einer Webseite anzugreifen. Vielmehr wird das SQL-Injection-Verfahren verwendet, um direkt die Datenbank hinter einem Webserver anzugreifen. Als Resultat des Angriffs kann der Angreifer unter Umständen Code auf der Datenbank ausführen, Zugriff auf geschützte Daten erlangen oder zumindest Schaden in der Datenbank anrichten.

Der Kern des Angriffs ist aber ähnlich gelagert wie bei XSS. Das Verfahren basiert darauf, dass der Angreifer passende Daten in den Webserver schmuggelt, indem er Scripts mit entsprechenden Daten füttert. Das geht meist über Formfelder, zum Beispiel einem Login-Feld der Webanwendung. Werden die dort eingegebenen Daten einfach ungefiltert an die Datenbank weitergegeben, dann ist die Datenbank per SQL-Injection angreifbar.

Das geht so: Angenommen Ihre Webseite hat ein ganz normales Formular, mit dessen Hilfe sich die Benutzer Ihrer Site anmelden können. Der HTML-Code für das Formular könnte folgendermaßen aussehen:

<form action="login.aspx">
<input type="textbox" name="username">
<input type="password" name="password">
<br/>
<input type="submit">
</form>

Der ASP(X)-Code zur Weiterverarbeitung der Benutzereingaben würde dann ungefähr den folgenden Aufbau haben:

Dim SQL As String = "SELECT Count(*) FROM Users WHERE UserName = '" & username.text & "' AND Password = '" & password.text & "'"
Dim tCommand As SQLCommand = New SQLCommand(SQL, Connection)
Dim thisCount As Integer = tCommand.ExecuteScalar()

Der Code setzt zunächst einen SQL-String zusammen und führt diesen dann auf der Datenbank aus. Ob der Anwender einen passenden User-Namen und ein gültiges Passwort angegeben hat, können Sie am von der Funktion ExecuteScalar zurück gelieferten Integer ablesen. Sofern Sie einen Linux-Server mit MySQL und PHP verwenden, sähe der Code auch nicht viel anders aus:

$query = "select count(*) from users where username=" . $username . " and password=" . $password . " limit 1";
$result = mysql_db_query( "database", $query, $connection);
$num = mysql_num_rows( $result);