Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Injection - Verwenden Sie die SELECT-Abfrage zum UPDATE/LÖSCHEN

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 oder INTO 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 im mysql Home-Verzeichnis des Benutzers und dann SSHing oder Überschreiben von mysqld 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 ), um mysqld 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.