phpMyAdmin 5.2.3 - Alta - Remota - SQLi - identificador del plugin de autenticación sin comillas
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-auth-plugin-unquoted
Clase: SQLi Alcance: Remoto
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
Cambiar contraseña está activado por defecto. UserPassword.php copia el POST authentication_plugin en ALTER USER ... IDENTIFIED WITH sin lista de permitidos y sin comillas. El nombre de usuario, el host y la contraseña en la misma sentencia pasan por escapeString. En MySQL 8 la cláusula WITH se emite cuando el plugin enviado difiere del actual.
Un usuario de phpMyAdmin con sesión iniciada inyecta SQL en su propio ALTER USER a través del formulario de cambio de contraseña. El SQL extra en el campo del plugin es SQL, no un nombre de plugin.
| ID | aún sin CVE |
| Clase | SQLi |
| Alcance | Remoto (inicio de sesión autenticado con cookie; cambio de contraseña activado) |
| CWE | CWE-89 |
| CVSS | Alto: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Producto | phpMyAdmin |
| Afectado | 5.2.3 etiqueta RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| Autenticación | inicio de sesión autenticado con cookie. $cfg['ShowChgPassword'] por defecto true. El tipo de autenticación no es config |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1 |
Un usuario de phpMyAdmin con sesión iniciada puede inyectar SQL en su propio ALTER USER a través del formulario de cambio de contraseña.
| Privilegio | Método / sink | Reconocimiento / integridad / disponibilidad | Probado en laboratorio o inferido |
|---|---|---|---|
Enviar SQL extra en IDENTIFIED WITH | POST index.php?route=/user-password con authentication_plugin | Integridad de la sentencia que construye phpMyAdmin | Probado en laboratorio. El POST en bruto sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ aparece sin comillas en el cuadro SQL |
| Hacer que MySQL analice ese SQL extra como SQL | La misma sentencia llega a mysqld | Integridad de la conexión del usuario | Probado en laboratorio. El registro general conservó el plugin sha256_password y descartó el comentario. 1227 porque este usuario no tiene CREATE USER |
| Cláusulas extra o cuentas extra si el escape se analiza | Mismo sink; las consultas apiladas dependen del driver | Integridad de otras cuentas | Inferido. Este laboratorio no ejecuta una segunda sentencia ni crea otra cuenta |
| La misma concatenación en añadir/editar usuario | Privileges.php IDENTIFIED WITH / MariaDB VIA | Integridad de las sentencias construidas por el otorgante | Hermano inferido. El POST del laboratorio es solo de cambio de contraseña |
Cerrado en esta ruta: uso no autenticado (se requiere inicio de sesión con cookie), autenticación config (el cambio de contraseña está oculto), RCE, cambio de plugin sin GRANT exitoso en MySQL 8 (1227 sin CREATE USER). El nombre de usuario, el host y la contraseña permanecen escapados. La contraseña propia no necesita GRANT; lo que queda es el campo del plugin sin comillas, no un intercambio de plugin libre.
Mismo pin: WebAuthn CustomServer leftover.
Fijé phpmyadmin/phpmyadmin RELEASE_5_2_3. PMASA-2025-1/2/3 ya están en 5.2.2. El cambio de contraseña todavía construye:
return 'ALTER USER \'' . $dbi->escapeString($username)
. '\'@\'' . $dbi->escapeString($hostname)
. '\' IDENTIFIED WITH ' . $authPlugin . ' BY '
$authPlugin es $_POST['authentication_plugin']. MySQL 5.7.37+ y 8.0 omiten WITH a menos que el plugin haya cambiado. Envía por POST un nombre diferente y la cláusula vuelve.
Caminos equivocados ya registrados: tratar MySQL 1227 como fallo de lo que queda (es la prueba de que el SQL extra se analizó); afirmar un cambio de plugin sin GRANT en MySQL 8; tratar la autenticación config como dentro del alcance; una reverse shell. Teatro.
python3 phpmyadmin-auth-plugin-unquoted-Abraxas-Labs.py
# or: cd lab && ./run.sh
Objetivo solo http://127.0.0.1:19260. Imágenes phpmyadmin:5.2.3 y mysql:8.0. Proyecto de Compose phpmyadmin-auth-plugin-unquoted. El stack se desmonta tras la ejecución.
Inicio de sesión con cookie como appuser. POST /user-password con authentication_plugin=sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/. Cuadro de consulta SQL de PMA: ALTER USER 'appuser'@'%' IDENTIFIED WITH sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ BY '***'. El registro general de MySQL analiza el comentario y almacena IDENTIFIED WITH 'sha256_password'. El nombre de usuario está entre comillas.
SUCCESS phpmyadmin-auth-plugin-unquoted how=live unquoted=yes escaped-user=yes plugin=sha256_password PMA-AUTH-PLUGIN-UNQUOTED-WITNESS
Lista de permitidos de nombres de plugin desde SHOW PLUGINS. Nunca interpolar el POST en IDENTIFIED WITH, VIA o plugin=.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/UserPassword.phplibraries/classes/Server/Privileges.phpGNU Affero GPL v3.0. Ver LICENSE. Solo laboratorio en loopback. Sin garantía.