SQL-Injection ist das Ausnutzen einer Sicherheitslücke in Zusammenhang mit SQL-Datenbanken. Die Sicherheitslücke entsteht durch einen Programmierfehler in einem Programm, das auf die Datenbank zugreift.
Angenommen, es gibt eine Website, auf der Benutzer ihre E-Mail-Adresse eingeben können, um ihre persönlichen Informationen abzurufen. Die E-Mail-Adresse wird als Parameter in einer SQL-Abfrage verwendet, um die entsprechenden Informationen aus der Datenbank abzurufen. Die SQL-Abfrage könnte folgendermaßen aussehen:
SELECT * FROM users WHERE email = '<user_input>';
Der Wert von <user_input> wird vom Benutzer bereitgestellt. Ein Angreifer könnte versuchen, die SQL-Abfrage zu manipulieren, indem er absichtlich bösartigen Code in das Eingabefeld eingibt wie z.B:
' OR '1'='1
Wenn sie genau diese Eingabe in den Platzhalter einsetzen sieht die manipulierte Abfrage so aus:
SELECT * FROM users WHERE email = '' OR '1'='1';
Da
'1'='1'
immer wahr ist, würde die Abfrage alle Benutzer in der Tabelle „users“ zurückgeben, anstatt nur den Benutzer mit der spezifizierten E-Mail-Adresse.
Die Idee hinter dieser Methode besteht darin, dass die Fehlermeldungen der Datenbank wertvolle Informationen preisgeben können. Zum Beispiel könnten Fehlermeldungen Details über den Datenbanktyp, Tabellennamen oder Spaltennamen enthalten. Diese Informationen können dem Angreifer dabei helfen, weitere Angriffe vorzubereiten oder die Datenbankstruktur besser zu verstehen.
Ein Beispiel für eine „error-based“ SQL-Injection-Technik ist das Einfügen eines zusätzlichen Anführungszeichens ('), um einen SQL-Fehler zu provozieren. Wenn die Webanwendung nicht ausreichend vorbereitet ist, kann dies zu einer fehlerhaften SQL-Abfrage führen, die eine Fehlermeldung zurückgibt. Diese Fehlermeldung kann vom Angreifer analysiert werden, um weitere Informationen zu erhalten und den Angriff fortzusetzen.
SELECT name, password FROM USER'
Um diese Methode verwenden zu können, müssen Sie in der Lage sein, Datenbankfehlermeldungen in Seitenantworten anzuzeigen.
Bei „Stacked queries“ fügt der Angreifer nach dem Einschleusen des schadhaften Codes in die Benutzereingabe einen zusätzlichen SQL-Befehl hinzu, der normalerweise durch ein Semikolon (;) getrennt ist. Dadurch können mehrere Befehle hintereinander ausgeführt werden. Zum Beispiel könnte ein Angreifer versuchen, eine SQL-Injection-Lücke in einer Login-Funktion auszunutzen, um zusätzlich zur ursprünglichen Abfrage einen Befehl zum Auslesen von Daten einzufügen:
SELECT * FROM users WHERE username = 'admin' AND password = 'password'; SELECT * FROM sensitive_data;
Bei einer Union-Abfrage werden Ergebnisse aus mehreren SELECT-Abfragen kombiniert, um eine einzige Ergebnismenge zu erzeugen. Ein Angreifer kann UNION-Abfragen verwenden, um zusätzliche Daten aus der Datenbank abzurufen, die normalerweise nicht zugänglich wären. Dabei nutzt er aus, dass UNION-Abfragen die gleiche Anzahl von Spalten in den SELECT-Abfragen erfordern und die Daten in den Spalten aufeinander abgestimmt werden.
Ein Beispiel für eine UNION-basierte SQL-Injection könnte wie folgt aussehen:
SELECT name, email FROM users WHERE id = '123' UNION ALL SELECT username, password FROM admin_users
Das zusätzliche Ergebnis wird an das Ergebnis Array angehängt.
name | |
---|---|
User 1 | user1@domain.com |
user1 | t0ps3cr3t |
Sie müssen die Ergebnisse der ursprünglichen SELECT-Abfrage (und damit Ihrer UNION) in der Seitenantwort sehen können, damit diese Methode verwendet werden kann.
Diese Technik verwendet Inline-Datenbankabfragen, um Daten abzurufen – im Wesentlichen eine Abfrage, die in eine andere Abfrage eingebettet ist
SELECT (SELECT password FROM USER) FROM product
Sie müssen in der Lage sein das Ergebnis der Inline-Abfragen in der Seitenantwort zu sehen.
Hiermit werden Daten aus der Datenbank abgerufen, indem eine Reihe von Fragen im Wahr/Falsch-Stil in Ihren Injektionen gestellt und das Ergebnis (Wahr oder Falsch) basierend auf identifizierbaren Änderungen in der Antwort bestimmt wird. Um diese Option zu verwenden, müssen Sie in der Lage sein, eine Art identifizierbarer Zustandsänderung im HTTP-Antwortinhalt von logisch unterschiedlichen, aber syntaktisch korrekten Datenbankabfragen auszulösen (z. B. eine andere Seitenantwort, die nur aus einer ungültigen Datenbankabfrage resultiert, nicht zählen hier). Diese Technik erfordert mehr Anforderungen und mehr Zeit als die zuvor aufgelisteten, da die Daten indirekt über boolesche Inferenz abgerufen werden müssen.
Diese Technik ähnelt dem booleschen Blind, da sie Daten abruft, indem sie eine Reihe von Fragen im Wahr/Falsch-Stil an die Datenbank stellt, aber anstatt die Antworten auf diese Fragen über den Inhalt einer Antwort zu bestimmen, Dies geschieht anhand der Zeit, die eine Antwort benötigt. Dies geschieht durch das Zuordnen von absichtlichen Verzögerungen zu bestimmten Antworten über Datenbankanweisungen, die merklich viel Zeit in Anspruch nehmen, wie beispielsweise Schlaf. Dies ist die zeitaufwändigste Methode zum Abrufen von Daten und ist empfindlich gegenüber Fehlern, die durch die Netzwerklast verursacht werden. Ohne sorgfältige benutzerdefinierte Konfiguration werden Sie möglicherweise feststellen, dass sqlmap diese Technik für kniffligere Injektionsschwachstellen auswählt, die mit effizienteren Mitteln ausgenutzt werden können.
# Enumerate databases sqlmap --dbms=mysql -u "$URL" --dbs # Enumerate tables sqlmap --dbms=mysql -u "$URL" -D "$DATABASE" --tables # Dump table data sqlmap --dbms=mysql -u "$URL" -D "$DATABASE" -T "$TABLE" --dump # Specify parameter to exploit sqlmap --dbms=mysql -u "http://www.example.com/param1=value1¶m2=value2" --dbs -p param2 # Specify parameter to exploit in 'nice' URIs sqlmap --dbms=mysql -u "http://www.example.com/param1/value1*/param2/value2" --dbs # exploits param1 # Get OS shell sqlmap --dbms=mysql -u "$URL" --os-shell # Get SQL shell sqlmap --dbms=mysql -u "$URL" --sql-shell # SQL query sqlmap --dbms=mysql -u "$URL" -D "$DATABASE" --sql-query "SELECT * FROM $TABLE;" # Use Tor Socks5 proxy sqlmap --tor --tor-type=SOCKS5 --check-tor --dbms=mysql -u "$URL" --dbs