SQL-Injection ist eine der gefährlichsten und am häufigsten ausgenutzten Sicherheitslücken in Webanwendungen. Sie entsteht, wenn Angreifer bösartigen SQL-Code in Eingabefelder einschleusen können, der dann unkontrolliert an die Datenbank weitergeleitet und ausgeführt wird. Dabei manipulieren sie die Logik der Datenbankabfrage, um unberechtigten Zugriff zu erhalten, Daten auszulesen, zu verändern oder sogar zu löschen.
Wie funktioniert SQL-Injection?
In einer typischen Anwendung wird vom Entwickler eine SQL-Anweisung formuliert, die beispielsweise einen bestimmten Datensatz aus der Datenbank abruft. Ein Beispiel für eine normale, ungefährliche SQL-Abfrage:
SELECT * FROM users WHERE username = 'max' AND password = 'geheim';Dabei wird angenommen, dass max und geheim die Eingaben eines echten Benutzers sind. Das Problem entsteht, wenn Eingaben direkt, ohne Prüfung, in die SQL-Abfrage eingebaut werden. Ein Angreifer kann z.B. als Benutzernamen folgenden Wert eingeben:
' OR '1'='1Dadurch entsteht eine modifizierte SQL-Abfrage:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '...';Die Bedingung '1'='1' ist immer wahr, was dazu führt, dass die Abfrage alle Benutzer zurückgibt, womit der Angreifer Zugriff bekommt, ohne gültige Credentials zu haben. Noch gefährlicher sind Fälle, in denen durch solche manipulierten SQL-Anweisungen Daten gelöscht oder manipuliert werden können.
Was kann ein Angreifer mit SQL-Injection erreichen?
- Auslesen vertraulicher Daten wie Benutzernamen, Passwörter, Kreditkartendaten.
- Ändern oder Löschen von Daten in der Datenbank.
- Einschleusen von Schadcode, der die Kontrolle über die Datenbank oder sogar den ganzen Server ermöglicht.
- Umgehen von Authentifizierung und Zugriffsschutz.
Schutzmaßnahmen für Entwickler
Um SQL-Injection zu verhindern, sollten Entwickler folgende Prinzipien beachten:
- Parametrisierte Queries (Prepared Statements):
Die Eingabedaten werden nicht direkt in den SQL-Code eingebaut, sondern als separate Parameter übergeben. Die Datenbank behandelt sie rein als Daten, nicht als Code. So kann keine Manipulation stattfinden. - Eingabewerte validieren und filtern:
Eingaben sollten vom Typ und Inhalt her geprüft werden, sodass keine unerwarteten Zeichenketten durchkommen. - Verwenden von ORM-Frameworks:
Objekt-Relational-Mapping-Tools wie Entity Framework (für C#) abstrahieren SQL und reduzieren die Fehlerquelle durch manuelles SQL-Schreiben. - Rechte beschränken:
Der Datenbanknutzer der Webanwendung sollte nur die minimal notwendigen Rechte haben, um Schäden im Fall einer Kompromittierung zu begrenzen. - Keine dynamischen SQL-Strings aus Benutzereingaben:
Vermeide, SQL-Befehle durch Konkatenation von Strings zu bauen.
C# Beispiel für parametrisierten SQL-Code zum Schutz gegen SQL-Injection
string userName = TextBoxUserName.Text;
string password = TextBoxPassword.Text;
string query = "SELECT * FROM Users WHERE UserName = @userName AND Password = @password";
using (SqlCommand cmd = new SqlCommand(query, sqlConnection))
{
cmd.Parameters.AddWithValue("@userName", userName);
cmd.Parameters.AddWithValue("@password", password);
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
// Benutzer gefunden, Authentifizierung erfolgreich
}
else
{
// Ungültige Zugangsdaten
}
}Hier werden die Werte userName und password getrennt vom SQL-Befehl als Parameter übergeben, wodurch eine Manipulation der Abfrage durch den Benutzer unmöglich wird.
Zusammengefasst ist SQL-Injection eine Manipulation der Datenbankabfragen durch unsichere Verarbeitung von Benutzereingaben, die schwerwiegende Sicherheitsprobleme verursachen kann. Sichere Programmierung mit parametrisierten Queries, Eingabevalidierung und Prinzipien wie „Least Privilege“ sind die effektivsten Gegenmaßnahmen, die Entwickler einsetzen müssen.
Diese Maßnahmen sind Pflicht für jeden Entwickler, der sichere Webanwendungen bauen möchte. So schützt du deine Anwendungen und die Daten deiner Nutzer wirksam vor SQL-Injection-Angriffen.
[Quelle: cloudflare.com, wikipedia.org, enginsight.com, ionos.de]
- https://www.cloudflare.com/de-de/learning/security/threats/sql-injection/
- https://de.wikipedia.org/wiki/SQL-Injection
- https://enginsight.com/de/blog/sql-injection/
- https://learn.microsoft.com/de-de/sql/relational-databases/security/sql-injection?view=sql-server-ver17
- https://www.ionos.de/digitalguide/server/sicherheit/sql-injection-grundlagen-und-schutzmassnahmen/
- https://www.php.net/manual/de/security.database.sql-injection.php


Schreibe einen Kommentar