SQL-Injection
SQL-Injection nutzt Webanwendungen aus, die die Benutzereingaben nicht validieren. Hacker können bösartige SQL-Befehle über die Webanwendung an die Backend-Datenbank zur Ausführung übermitteln.
SQL-Injection kann unerlaubten Zugriff auf eine Datenbank erlangen oder Informationen direkt aus der Datenbank abrufen. Viele Datenlecks sind auf SQL-Injection zurückzuführen.
Funktionsweise
Nach Eingabe von Benutzername und Passwort arbeiten die SQL-Abfragen hinter der grafischen Benutzeroberfläche wie folgt:
"SELECT Count(*) FROM Users WHERE Username=' " + txt.User.Text+" ' AND Password=' "+ txt.Password.Text+" ' ";
Angenommen, der Benutzer gibt nun als Benutzernamen: admin und als Passwort: passwd123 ein. Nach dem Klick auf die Login-Schaltfläche wird die SQL-Abfrage wie folgt ausgeführt:
"SELECT Count(*) FROM Users WHERE Username=' admin ' AND Password=' passwd123 ' ";
Wenn die Anmeldedaten korrekt sind, wird dem Benutzer die Anmeldung gestattet, was ein sehr einfaches (und daher unsicheres) System ist. Hacker nutzen diese Unsicherheit, um unberechtigten Zugriff zu erlangen.
Hacker nutzen einen einfachen String, genannt Magical String, zum Beispiel:
Benutzername: admin
Passwort: anything 'or'1'='1
Nach dem Klicken auf die Login-Schaltfläche funktioniert die SQL-Abfrage wie folgt:
"SELECT Count(*) FROM Users WHERE Username=' admin ' AND Password=' anything 'or'1'='1 ' ";
Werfen Sie einen genaueren Blick auf den Passwortabschnitt der obigen Abfrage.
Password=' anything 'or'1'='1 '
Das Passwort ist nicht 'anything', daher führt password=anything zu FALSE, aber '1'='1' ist eine TRUE-Aussage und liefert daher einen TRUE-Wert. Schließlich, aufgrund des OR-Operators, ist der Wert (FALSE OR TRUE) TRUE, sodass die Authentifizierung erfolgreich umgangen wird. Nur wegen eines einfachen Strings (Magical String) wird die gesamte Datenbank kompromittiert.
Wie man es verhindert
Bevor die Abfragen für die Benutzeranmeldeinformationen ausgeführt werden, können einige Änderungen vorgenommen werden, wie die folgenden:
$id = $_GET["id"]
(1) $id = stripslashes($id)
(2) $id = mysql_real_escape_String($id)
Aufgrund von (1) wird jedes einfache Anführungszeichen (') im Eingabestring durch doppelte Anführungszeichen (") ersetzt, und aufgrund von (2) wird vor jedem (') ein (/) hinzugefügt. Der überarbeitete Magical String schlägt beim Umgehen der Authentifizierung fehl, und Ihre Datenbank bleibt sicher.
Siehe auch
- SQL-Injection auf Wikipedia
- Erläuterung der SQL-Injection auf OWASP (Open Web Application Security Project)