In MySQL-Datenbanken besteht normalerweise eine SQL-Kürzungsanfälligkeit. Diese Sicherheitsanfälligkeit wurde erstmals in CVE-2008-4106 beschrieben, das sich auf WordPress CMS bezieht.
Wie SQL-Trunkierungsangriffe funktionieren
Dieser Angriff funktioniert aufgrund des Abschneidens von Benutzereingaben in Datenbanken mit den Funktionen "Auswahl" und "Einfügung".
- Bei Eingaben in das Formularfeld prüft die Funktion 'Auswählen' auf Redundanz entsprechend den Eingaben in der Datenbank.
- Nach der Prüfung auf Redundanz überprüft die Funktion 'Einfügung' die Länge der Eingabe, und die Benutzereingabe wird abgeschnitten, wenn die Länge überschritten wird.
Angenommen, ein Entwickler erstellt die Tabelle „users“ über die folgende Abfrage:
Tabellenbenutzer erstellen (user_id INT NOT NULL AUTO_INCREMENT,
Benutzername VARCHAR(20) NICHT NULL,
Passwort VARCHAR(40) NICHT NULL,
PRIMÄRSCHLÜSSEL ( user_id )
);
Verwenden dieses Schemas, wenn der Entwickler ein Administratorkonto mit den folgenden Merkmalen erstellt:
user_name = 'admin'Passwort = „secret_p4ssw0ord“
Offensichtlich sind diese Anmeldeinformationen nicht öffentlich. Es gibt nur ein Admin-Konto in der Datenbank, und wenn ein Angreifer versucht, ein anderes Konto mit dem Benutzernamen 'admin' zu registrieren, schlägt der Angreifer aufgrund der Redundanzprüfungen der Datenbank fehl. Der Angreifer kann diese Redundanzprüfung immer noch umgehen, um ein weiteres Administratorkonto hinzuzufügen, indem er die Sicherheitsanfälligkeit durch SQL-Abkürzung ausnutzt. Angenommen, der Angreifer registriert ein anderes Konto mit der folgenden Eingabe:
Benutzername = 'adminxxxxxxxxxxxxxxxzufällig'(x sind die Leerzeichen)
&
Passwort = "RandomUser"
Die Datenbank nimmt den 'user_name' (26 Zeichen) und prüft, ob dieser bereits existiert. Dann wird die Eingabe des Benutzernamens abgeschnitten und 'admin' ('admin' mit Leerzeichen) wird in die Datenbank eingegeben, was zu zwei doppelten Admin-Benutzern führt.
Der Angreifer kann dann einen 'admin'-Benutzer mit eigenem Passwort erstellen. Jetzt hat die Datenbank zwei Admin-'Benutzername'-Einträge, jedoch mit unterschiedlichen Passwörtern. Der Angreifer kann sich mit den neu erstellten Zugangsdaten anmelden, um ein Admin-Panel zu erhalten, da beide Benutzernamen „admin“ und „admin“ für die Datenbankebene gleich sind. Nun schauen wir uns ein Beispiel für einen praktischen Angriff an.
Beispielangriff
In diesem Beispiel nehmen wir ein Szenario von der Website overthewire.org. Die Overthewire-Community stellt Wargame-CTFs zur Verfügung, an denen wir unsere Sicherheitskonzepte üben können. Das Szenario der SQL-Kürzung tritt im Natas-Spiel Level 26->27 auf. Wir können wie folgt auf die Ebene zugreifen:
URL: http://natas27.nata.Labore.über den Draht.orgBenutzername: natas27
Passwort: 55TBjpPZUUJgVP5b3BnbG6ON9uDPVzCJ
Dieses Level ist verfügbar unter: https://overthewire.org/wargames/natas/natas27.html. Ihnen wird eine Anmeldeseite angezeigt, die anfällig für einen SQL Truncation-Angriff ist.
Bei der Überprüfung des Quellcodes werden Sie feststellen, dass der Benutzername 64 beträgt, wie unten gezeigt.
Ein Benutzer namens 'natas28' existiert bereits. Unser Ziel ist es, mithilfe des SQL_truncation-Angriffs einen weiteren Benutzer namens 'natas28' zu erstellen. Also geben wir natas28 ein, gefolgt von 57 Leerzeichen und einem zufälligen Alphabet (in unserem Fall a), Benutzernamen und einem beliebigen Passwort. Der Buchstabe 'a' ist im Screenshot wegen des 65-stelligen Benutzernamens nicht sichtbar. Nach der Erstellung des Benutzerkontos sehen Sie die 'ein.'
Wenn die Datenbank eine sql_truncation-Schwachstelle enthält, sollte die Datenbank jetzt zwei 'natas28'-Benutzernamen haben. Ein Benutzername enthält unser Passwort. Lassen Sie uns versuchen, die Anmeldeinformationen auf der Anmeldeseite einzugeben.
Jetzt sind wir als 'natas28'-Benutzer angemeldet.
Schadensbegrenzung
Um diesen Angriff abzuwehren, müssen wir mehrere Faktoren berücksichtigen.
- Wir sollten die Duplizierung kritischer Identitäten wie des Benutzernamens nicht zulassen. Wir sollten diese Identitäten zu Primärschlüsseln machen.
- Die Truncate-Funktion sollte für alle Felder von Frontend-Formularen sowie für Backend-Code implementiert werden, damit Datenbanken abgeschnittene Eingaben erhalten.
- Der strikte Modus sollte auf Datenbankebene aktiviert werden. Ohne aktivierten strikten Modus geben Datenbanken nur Warnungen im Backend aus, speichern aber trotzdem die duplizierten Daten. Im strikten Modus geben Datenbanken im Falle einer Duplizierung Fehler und vermeiden das Speichern von Daten.
Lassen Sie uns zum Beispiel mit der folgenden Abfrage nach dem strikten Modus suchen:
mysql> wähle @@sql_mode
Wir erstellen eine Datenbank und die Tabelle 'Benutzer.'
mysql> DATENBANK ERSTELLEN testenAbfrage OK, 1 Zeile betroffen (0.02 Sek.)
mysql> Test verwenden
Datenbank geändert
mysql> CREATE TABLE-Benutzer (Benutzername VARCHAR(10), Kennwort VARCHAR(10));
Abfrage OK, 0 Zeilen betroffen (0.05 Sek.)
Als Nächstes erstellen wir einen Admin-Benutzer mit Anmeldeinformationen mithilfe der INSERT-Abfrage.
mysql> INSERT IN TO users VALUES ('admin', 'password1');Abfrage OK, 1 Zeile betroffen (0.01 Sek.)
Wir können die Tabelleninformationen "Benutzer" mit der Option "Auswählen * von Benutzern" anzeigen'.
Die Länge des Benutzernamens beträgt 10 Zeichen. Jetzt werden wir den SQL-Trunkation-Angriff versuchen.
Wenn wir versuchen, Folgendes einzugeben:
Benutzername = 'adminxxxxxxa'(x sind die Leerzeichen)
&
Passwort = 'pass2'
Wir erhalten einen Fehler, was bedeutet, dass der strikte Modus absolut effektiv ist.
mysql> INSERT INTO Benutzerwerte('admin a', 'pass2')FEHLER 1406 (22001): Daten zu lang für Spalte 'Benutzername' in Zeile 1
Wenn der strikte Modus nicht aktiviert ist, gibt die Datenbank Warnungen aus, fügt die Daten jedoch trotzdem in die Tabelle ein.
Fazit
Angreifer können Zugriff auf Konten mit hohen Rechten erlangen, wenn die Sicherheitslücke sql_trunction in Ihrer Anwendung vorhanden ist. Der Angreifer kann mit den kritischen Feldern leicht Informationen über einen Benutzernamen und seine Datenbanklänge erhalten und dann denselben Benutzernamen erstellen, gefolgt von Leerzeichen und zufälligem Alphabet nach der Mindestlänge, was zur Erstellung mehrerer Konten mit hohen Berechtigungen führt. Diese Sicherheitsanfälligkeit ist kritisch, kann jedoch vermieden werden, wenn Sie einige Sicherheitsvorkehrungen treffen, z. B. den strikten Modus für Benutzereingaben aktivieren und das sensible Feld zum Primärschlüssel in der Datenbank machen.