Bevor Sie die Frage direkt beantworten, ist es erwähnenswert, dass selbst wenn ein Angreifer nur lesen kann Daten, zu denen er nicht in der Lage sein sollte, das ist normalerweise immer noch sehr schlecht. Berücksichtigen Sie dies, indem Sie JOIN
verwenden s und SELECT
ing aus Systemtabellen (wie mysql.innodb_table_stats
), ein Angreifer, der mit einem SELECT
beginnt Injektion und keine sonstigen Kenntnisse Ihrer Datenbank kann Ihr Schema abbilden und dann die Gesamtheit der Daten, die Sie in MySQL haben, exfiltrieren. Für die überwiegende Mehrheit der Datenbanken und Anwendungen ist das bereits stellt eine katastrophale Sicherheitslücke dar.
Aber um die Frage direkt zu beantworten:Es gibt ein paar Möglichkeiten, die ich kenne, durch die Injektion in ein MySQL SELECT
kann verwendet werden, um Daten zu ändern. Glücklicherweise erfordern sie alle angemessen ungewöhnliche Umstände möglich sein. Alle nachstehenden Beispielinjektionen werden relativ zu der injizierbaren Beispielabfrage aus der Frage angegeben:
SELECT id, name, message FROM messages WHERE id = $_GET['q']
1. "Gestapelte" oder "gestapelte" Abfragen.
Die klassische Injektionstechnik, einfach eine ganz andere Aussage nach der zu setzen, in die injiziert wird. Wie in eine weitere Antwort hier
vorgeschlagen , könnten Sie $_GET['q']
setzen zu 1; DELETE FROM users; --
so dass die Abfrage zwei Anweisungen bildet, die nacheinander ausgeführt werden, wobei die zweite alles in users
löscht Tabelle.
Minderung
Die meisten MySQL-Konnektoren - insbesondere einschließlich mysql_*
von PHP (veraltet). und (nicht veraltet) mysqli_*
Funktionen - unterstützen überhaupt keine gestapelten oder gestapelten Abfragen, daher funktioniert diese Art von Angriff einfach nicht. Einige tun es jedoch - insbesondere einschließlich des PDO-Konnektors von PHP (obwohl die Unterstützung deaktiviert werden kann, um die Sicherheit zu erhöhen
). ).
2. Nutzung benutzerdefinierter Funktionen
Funktionen können von einem SELECT
aufgerufen werden , und kann Daten ändern. Wenn in der Datenbank eine datenverändernde Funktion erstellt wurde, können Sie SELECT
ausführen Rufen Sie es beispielsweise auf, indem Sie 0 OR SOME_FUNCTION_NAME()
übergeben als Wert von $_GET['q']
.
Minderung
Die meisten Datenbanken enthalten keine benutzerdefinierten Funktionen - geschweige denn datenverändernde - und bieten daher überhaupt keine Möglichkeit, diese Art von Exploit durchzuführen.
3. Schreiben in Dateien
Wie in Muhaimin Dzulfakars (etwas anmaßend benanntem) Artikel Fortgeschrittene MySQL-Nutzung
, können Sie INTO OUTFILE
verwenden oder INTO DUMPFILE
-Klauseln auf einem MySQL-Select, um das Ergebnis in eine Datei zu kopieren. Da durch die Verwendung einer UNION
, jedes beliebige Ergebnis kann SELECT
sein ed erlaubt dies das Schreiben neuer Dateien mit beliebigem Inhalt an jedem Ort, an dem der Benutzer mysqld
ausführt kann Zugreifen. Es ist denkbar, dass dies ausgenutzt werden kann, um nicht nur Daten in der MySQL-Datenbank zu ändern, sondern um Shell-Zugriff auf den Server zu erhalten, auf dem sie läuft - zum Beispiel indem ein PHP-Skript an die Webroot geschrieben und dann eine Anfrage an sie gestellt wird, falls dies der Fall ist Der MySQL-Server wird gemeinsam mit einem PHP-Server gehostet.
Minderung
Viele Faktoren reduzieren die praktische Ausnutzbarkeit dieses ansonsten beeindruckend klingenden Angriffs:
- MySQL wird niemals lassen Sie
INTO OUTFILE
verwenden oderINTO DUMPFILE
um eine vorhandene Datei zu überschreiben oder in einen Ordner zu schreiben, der nicht vorhanden ist. Dies verhindert Angriffe wie das Erstellen einer.ssh
Ordner mit einem privaten Schlüssel immysql
Home-Verzeichnis des Benutzers und dann SSHing oder Überschreiben vonmysqld
Binary selbst mit einer schädlichen Version und wartet auf einen Serverneustart. - Jedes halbwegs anständige Installationspaket richtet einen speziellen Benutzer ein (normalerweise mit dem Namen
mysql
), ummysqld
auszuführen , und geben Sie diesem Benutzer nur sehr eingeschränkte Berechtigungen. Als solches sollte es nicht in der Lage sein, an die meisten Orte im Dateisystem zu schreiben - und sicherlich sollte es normalerweise nicht in der Lage sein, Dinge wie das Schreiben in das Webroot einer Webanwendung zu tun. - Moderne Installationen von MySQL werden mit
--secure-file-priv
standardmäßig gesetzt, wodurch MySQL daran gehindert wird, irgendwo anders als in ein bestimmtes Datenimport-/-exportverzeichnis zu schreiben, und dadurch diesen Angriff fast vollständig wirkungslos macht ... es sei denn, der Eigentümer des Servers hat ihn absichtlich deaktiviert. Glücklicherweise würde niemand ein solches Sicherheitsfeature jemals einfach komplett deaktivieren, denn das wäre offensichtlich - oh warte, egal .
4. Aufruf von sys_exec()
Funktion von lib_mysqludf_sys
um beliebige Shell-Befehle auszuführen
Es gibt eine MySQL-Erweiterung namens lib_mysqludf_sys
das - nach seinen Sternen auf GitHub
zu urteilen und eine schnelle Stack Overflow-Suche
- hat mindestens ein paar hundert Benutzer. Es fügt eine Funktion namens sys_exec
hinzu die Shell-Befehle ausführt. Wie in #2 erwähnt, können Funktionen innerhalb eines SELECT
aufgerufen werden; die Implikationen sind hoffentlich offensichtlich. Um aus der Quelle
zu zitieren , diese Funktion "kann ein Sicherheitsrisiko darstellen" .
Minderung
Auf den meisten Systemen ist diese Erweiterung nicht installiert.