SQL Injection

Ähnlich wie beim Cross Site Scripting wird durch eine von außen kommende Eingabe die Anwendung (in dem Fall ein Angriff auf die MySQL-Datenbank) angegriffen. Dies kann vom Authentifizieren ohne Zugangsdaten über Auslesen der kompletten Datenbank bis zum Löschen der Datenbank (klarer Fall, der rechtlich hart verfolgt werden kann, allerdings aufwendig wird, wenn der Täter im Ausland sitzt) führen kann.

Eine SQL-Anweisung in der Form:

mysql_query("SELECT FROM zugangsdaten WHERE nutzer=\"$nutzer\" AND 
passwort=\"$passwort\");

ist prädestiniert für die Schwachstelle. Der Angreifer muss nur dieser SQL-Anweisung unterjubeln, dass nach dem Bereich nutzer=\"$nutzer\" nichts mehr kommt. Und schon ist man durch Kenntnis des Nutzernamens eingeloggt, ohne das eigentliche Passwort zu kennen. Das Ende einer SQL-Anweisung wird mit ; übergeben.

Als findiger Programmierer könnte man ja darauf kommen, die Reihenfolge umzustellen:

mysql_query("SELECT FROM zugangsdaten WHERE passwort=\"$passwort\" AND 
nutzer=\"$nutzer\");

I.d.R. sind die Angreifer auch „findig“ und deaktivieren den Bereich für das Passwort. Denken Sie mal in die Richtung, dass es bei SQL-Anweisungen ja durchaus logische Operatoren gibt wie beispielsweise „or“ und solche Bedingungen, die immer wahr sind wie „1=1“ oder „2=2“.

Vorgehensweise ist, die von außen kommenden Daten mit dem PHP-Befehl „mysql_real_escape_string“ und Konsorten unwirksam zu machen. Allerdings muss man daran denken, dass beim Auslesen der Daten aus der Datenbank mit dem PHP-Befehl stripslashes gearbeitet werden kann und dann die Gefährlichkeit wieder da ist.

Dazu finden sich sehr schön unter http://www.php.net/manual/de/security.database.sql-injection.php die entsprechenden weiterführenden Hinweise.