Ir al contenido

MySQL

Por

Madurezreviewed
Última revisión
Publicado
Última actualización

En MySQL, el servidor habla primero. Su handshake anuncia versión, capacidades, material de autenticación y parte de la negociación antes de que el cliente presente una cuenta. Esa apertura permite identificar el protocolo, pero también puede proceder de MariaDB, un proxy compatible o un banner modificado.

Después del login cambia la unidad de análisis. MySQL autoriza cuentas con la forma usuario@host, mapea la identidad presentada a CURRENT_USER() y aplica privilegios por objeto, schema o servidor. La misma cadena de usuario puede llegar a cuentas efectivas distintas según el origen. Enumerar el servicio significa separar el handshake de esa identidad autorizada y, después, relacionar datos y acceso a archivos con los grants efectivos.

Los ejemplos usan TARGET_IP, USERNAME, DATABASE, TABLE y FILE como placeholders.

Nmap interpreta el handshake sin credenciales. El cliente mysql confirma TLS, plugin de autenticación y acceso real. Las consultas a information_schema, mysql, performance_schema y sys construyen el inventario según los permisos de la cuenta. Usa scripts NSE concretos solo para preguntas preautenticación o para una consulta ya delimitada.

Pregunta Herramienta Resultado que debe confirmarse
¿habla MySQL y qué anuncia? Nmap mysql-info handshake y conexión con el cliente
¿qué identidad acepta el servidor? cliente mysql USER(), CURRENT_USER() y plugin negociado
¿qué datos puede consultar? SQL y catálogos grants efectivos por schema y objeto
¿puede leer o escribir archivos? SQL secure_file_priv, privilegio y ruta efectiva
¿por qué falla otra herramienta? cliente con --verbose TLS, plugin, DNS inverso y código de error

Un banner compatible con MySQL también puede pertenecer a MariaDB, un proxy o un servicio gestionado. Conserva implementación anunciada y comportamiento observado por separado.

MySQL escucha habitualmente en 3306/tcp. El servidor inicia el handshake y puede anunciar versión, connection ID, salt y capacidades. Esa cadena puede estar modificada y no determina por sí sola el nivel de parche real.

Nmap -sV identifica el protocolo. mysql-info analiza el handshake sin iniciar sesión:

Leer el handshake de MySQL
nmap -sV -p 3306 --script mysql-info TARGET_IP

El script mysql-enum hace pruebas adicionales de cuentas y pertenece a categorías más intrusivas. No debe añadirse como rutina a la primera identificación. Primero confirma qué pregunta necesitas responder.

En mysql, -h fija el host, -u el usuario y -p solicita la contraseña de forma interactiva. No añadas el secreto detrás de -p, porque puede quedar expuesto en el historial o en el listado de procesos:

Abrir una sesión MySQL
mysql -h TARGET_IP -u USERNAME -p

El cliente puede negociar TLS si el servidor lo soporta. Para exigirlo, usa --sdoc-mode=REQUIRED. Para verificar también la identidad del servidor hacen falta VERIFY_CA o VERIFY_IDENTITY y una CA adecuada:

Exigir TLS y validar el hostname
mysql -h FQDN -u USERNAME -p \
--sdoc-mode=VERIFY_IDENTITY --sdoc-ca=CA_FILE

Dentro de la sesión, \s muestra estado de conexión, protocolo y cipher. Las consultas SQL terminan con punto y coma:

Registrar versión, identidad y estado
SELECT VERSION();
SELECT USER(), CURRENT_USER();
SHOW STATUS LIKE 'Ssl_cipher';

USER() refleja la identidad aportada por el cliente. CURRENT_USER() muestra la cuenta MySQL usada para autorizar la sesión. Pueden diferir por reglas de host o cuentas anónimas.

Enumerar bases de datos y tablas
SHOW DATABASES;
USE DATABASE;
SHOW TABLES;
DESCRIBE TABLE;

SHOW DATABASES solo devuelve las bases visibles para la cuenta. information_schema presenta metadatos de objetos y privilegios. performance_schema expone instrumentación. sys ofrece vistas que resumen datos de rendimiento y diagnóstico. Son esquemas distintos.

Para mantener la consulta acotada, pide columnas concretas y limita filas:

Inspeccionar una tabla de forma acotada
SELECT COLUMN_NAME, DATA_TYPE
FROM information_schema.columns
WHERE TABLE_SCHEMA = 'DATABASE' AND TABLE_NAME = 'TABLE';
SELECT * FROM DATABASE.TABLE LIMIT 20;

Los datos pueden contener hashes, tokens, connection strings o material personal. Conserva la consulta exacta junto al resultado para poder explicar qué subconjunto se obtuvo.

Las cuentas MySQL se identifican por usuario y host. app@localhost y app@10.% son cuentas diferentes. Si la cuenta permite consultar las tablas del sistema:

Enumerar cuentas y plugins de autenticación
SELECT User, Host, plugin, account_locked
FROM mysql.user;

Para la sesión actual, SHOW GRANTS devuelve privilegios efectivos representados como sentencias:

Mostrar los grants de la cuenta actual
SHOW GRANTS;

Presta atención a privilegios globales, roles, FILE, administración de usuarios y capacidad de ejecutar rutinas. Una cuenta con acceso amplio a datos no implica automáticamente acceso al sistema operativo.

secure_file_priv restringe las rutas que pueden usar operaciones de importación y exportación. Su valor puede ser un directorio, una cadena vacía o NULL:

Consultar la restricción de archivos
SHOW VARIABLES LIKE 'secure_file_priv';

LOAD_FILE() lee un archivo que el proceso del servidor puede abrir si también se cumplen privilegios y límites de tamaño:

Leer un archivo mediante el servidor
SELECT LOAD_FILE('FILE');

SELECT ... INTO OUTFILE crea un archivo nuevo desde el servidor. No sobrescribe uno existente y aplica permisos del proceso de MySQL:

Escribir un resultado en un archivo nuevo
SELECT 'MARKER' INTO OUTFILE 'FILE';

La operación modifica el host. Registra ruta, propietario, modo y contenido. Distingue la ruta del cliente de la ruta vista por el servidor, especialmente con contenedores o almacenamiento remoto.

Las rutas de my.cnf dependen de distribución y empaquetado. El cliente puede mostrar qué archivos busca:

El comando envía la ayuda de mysql a sed. -n evita imprimir todas las líneas y la expresión /inicio/,/fin/p conserva el intervalo comprendido entre ambos textos:

Mostrar rutas de configuración conocidas
mysql --help | sed -n '/Default options are read from/,/Variables and options/p'

Relaciona bind-address, port, skip-name-resolve, TLS, plugins, local_infile, secure_file_priv y includes con las variables efectivas obtenidas mediante SHOW VARIABLES. local_infile habilita una operación iniciada por el cliente y no equivale al privilegio FILE, que actúa desde el proceso del servidor. No presupongas que el archivo principal contiene toda la configuración.

mysql-info obtiene datos del handshake. Con credenciales, mysql-databases, mysql-users, mysql-variables y mysql-query consultan facetas distintas. mysql-enum, mysql-empty-password, mysql-brute, mysql-dump-hashes y mysql-vuln-* cambian el volumen o la naturaleza de la prueba. Selecciona un script por pregunta y comprueba sus argumentos:

Observar el handshake sin autenticar
nmap -sV -n -Pn -p 3306 --script mysql-info TARGET_IP

El plugin de autenticación anunciado, la versión del cliente, TLS y políticas como require_secure_transport pueden hacer que Nmap y mysql obtengan resultados distintos. Conserva ambos errores y la negociación, no solo «login failed».

Relaciona cada capacidad con un privilegio efectivo y con el host donde actúa. FILE puede permitir LOAD_FILE() o SELECT ... INTO OUTFILE, pero también intervienen secure_file_priv, permisos del proceso, AppArmor/SELinux y rutas visibles desde el servidor. UDF, plugins, event scheduler y general log pueden crear caminos hacia ejecución o escritura, pero exigen configuración y privilegios concretos.

Una lectura de credenciales o datos no autoriza a modificar filas. Para validar impacto, prioriza metadatos y una consulta de lectura mínima. Si la prueba necesita crear un objeto, usa un nombre único, registra definición y propietario, y elimínalo tras verificar.

Los servidores pueden limitar conexiones, resolver hostnames, aplicar max_connect_errors, bloquear hosts o usar proxies. Un timeout no equivale a puerto filtrado. MySQL puede registrar conexiones, errores, general log, slow log, audit plugins y consultas en telemetría del sistema. Guarda identidad user@host, TLS, base, grants, consultas exactas, filas mínimas saneadas y hashes de exportaciones. Termina la sesión y revierte objetos o archivos creados.

Amplía la comparación de clientes y scripts en herramientas y automatización. La checklist controla identidad, grants y acceso a archivos. La cheatsheet recupera consultas ya justificadas.