Adminer: Pfad-Traversal im `sql-log`-Plugin ermöglicht beliebiges Schreiben von `.sql`-Dateien
Ein authentifizierter Nutzer schreibt über den unsanierten ns-Parameter des sql-log-Plugins beliebige .sql-Dateien außerhalb des Web-Roots auf den Adminer-Host.
Advisory-ID: TP-2026-076
Produkt: Adminer (eindateiiges PHP-Datenbank-Frontend)
Schwachstellentyp: Pfad-Traversal / beliebiges Dateischreiben (CWE-22)
CVE: nicht beantragt
CVSS 3.1: 5.4 (Mittel) · CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L
Betroffene Versionen: 5.3.0 bis 5.4.2
Behoben in: 5.4.3
Hersteller-Advisory: GHSA-75xm-qwfq-9wp5
Gemeldet: 4. Juli 2026
Zusammenfassung
Adminer ist ein eindateiiges PHP-Datenbank-Frontend. Das mitgelieferte sql-log-Plugin baut seinen Log-Dateipfad ungeprüft aus dem Request-Parameter $_GET["ns"] (dem PostgreSQL-Schema-Selektor) und schreibt jede ausgeführte Abfrage dorthin. Wird keine Datenbank ausgewählt, entfällt die einzige Validierung von ns, das Pfad-Präfix kollabiert, und ein Wert wie /../../../tmp/x löst sich zu einem absoluten Pfad außerhalb des Web-Roots auf. Ein authentifizierter Nutzer, der Adminer auf eine eigene Datenbank richtet, legt so beliebige .sql-Dateien mit angreiferkontrolliertem Inhalt auf dem Host an, ohne Betreiber-DB-Zugang oder Admin-Rolle. turingpoint hat den Ablauf verifiziert und verantwortungsvoll gemeldet; der Hersteller hat ihn in 5.4.3 behoben.
Ursache
Das sql-log-Plugin bildet $this->filename ungeprüft aus Adminer\adminer()->database() . ($_GET["ns"] != "" ? ".$_GET[ns]" : "") . ".sql" (plugins/sql-log.php:29). Es öffnet diesen Pfad mit fopen($this->filename, "a") (plugins/sql-log.php:31) und schreibt jede ausgeführte Abfrage per fwrite($fp, $query) wörtlich hinein (plugins/sql-log.php:33). Der Parameter ns wird nur durch set_schema() validiert, das ausschließlich im durch DB != "" && $_GET["ns"] !== "" bewachten Block erreicht wird (include/connect.inc.php:120). Ohne ausgewählte Datenbank liefert database() einen leeren String, der Block wird übersprungen, das Präfix kollabiert zu einem einzelnen ., und ns=/../../../tmp/x wird zu einem absoluten Pfad außerhalb des Web-Roots. Der Angreifer richtet Adminer auf eine selbst kontrollierte Datenbank (jeder Host auf Ports >= 1024 laut Priv-Port-Prüfung) und meldet sich mit eigenen Zugangsdaten an, sodass weder Betreiber-DB-Zugang noch Admin-Rolle nötig sind.
Proof of Concept
Auf dem offiziellen Image adminer:5.4.2 mit ADMINER_PLUGINS=sql-log, angemeldet an einer eigenen MySQL-Instanz mit leerem auth[db]:
POST /?server=mysql&username=root&sql=&ns=/../../../tmp/adminer_pwn
query=SELECT '<marker>'
-> legt /tmp/adminer_pwn.sql mit dem byte-genauen Abfragetext an.
Weil ohne ausgewählte Datenbank das database().-Präfix entfällt, wirkt der ns-Wert als absoluter Pfad, und der .sql-Log wird außerhalb des Web-Roots geschrieben.
Auswirkung
- Anlegen beliebiger
.sql-Dateien mit angreiferkontrolliertem Inhalt außerhalb des Web-Roots. - Denial of Service durch Volllaufen der Festplatte, da Schreibvorgänge anhängend erfolgen.
- Zweitrangige SQL-Ausführung, falls ein Betreiber später eine vergiftete
.sql-Datei importiert.
Referenzen
Steckt so etwas in Ihrer Software?
Diese Schwachstelle hat unser Team im Rahmen seiner Arbeit gefunden. Lassen Sie Ihre Anwendungen von denselben Spezialisten prüfen, mit einem Penetrationstest von turingpoint.
