phpMyAdmin 5.2.3 - Élevé - À distance - SQLi - identifiant du plugin d'authentification non échappé
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-auth-plugin-unquoted
Classe : SQLi Portée : Distante
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
Le changement de mot de passe est activé par défaut. UserPassword.php copie le POST authentication_plugin dans ALTER USER ... IDENTIFIED WITH sans liste d'autorisation ni mise entre guillemets. Le nom d'utilisateur, l'hôte et le mot de passe dans la même instruction passent par escapeString. Sur MySQL 8, la clause WITH est émise lorsque le plugin posté diffère du plugin actuel.
Un utilisateur phpMyAdmin connecté injecte du SQL dans son propre ALTER USER via le formulaire de changement de mot de passe. Le SQL supplémentaire dans le champ plugin est du SQL, pas un nom de plugin.
| ID | pas encore de CVE |
| Classe | SQLi |
| Portée | Distante (connexion par cookie authentifiée ; changement de mot de passe activé) |
| CWE | CWE-89 |
| CVSS | Élevé : 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Produit | phpMyAdmin |
| Affecté | 5.2.3 tag RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| Auth | connexion par cookie authentifiée. $cfg['ShowChgPassword'] par défaut true. Le type d'authentification n'est pas config |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
Un utilisateur phpMyAdmin connecté peut injecter du SQL dans son propre ALTER USER via le formulaire de changement de mot de passe.
| Privilège | Méthode / sink | Reconnaissance / intégrité / disponibilité | Prouvé en lab ou déduit |
|---|---|---|---|
Envoyer du SQL supplémentaire dans IDENTIFIED WITH | POST index.php?route=/user-password avec authentication_plugin | Intégrité de l'instruction construite par phpMyAdmin | Prouvé en lab. Le POST brut sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ apparaît sans guillemets dans la boîte SQL |
| Faire parser ce SQL supplémentaire comme du SQL par MySQL | La même instruction atteint mysqld | Intégrité de la connexion utilisateur | Prouvé en lab. Le journal général a conservé le plugin sha256_password et supprimé le commentaire. 1227 car cet utilisateur n'a pas CREATE USER |
| Clauses supplémentaires ou comptes supplémentaires si l'évasion est parsée | Même sink ; les requêtes empilées dépendent du driver | Intégrité d'autres comptes | Déduit. Ce lab n'exécute pas de seconde instruction ni ne crée un autre compte |
| Même concaténation sur l'ajout/édition d'utilisateur | Privileges.php IDENTIFIED WITH / MariaDB VIA | Intégrité des instructions construites par le grantor | Frère déduit. Le POST du lab concerne uniquement le changement de mot de passe |
Fermé sur ce chemin : usage non authentifié (connexion par cookie requise), auth config (le changement de mot de passe est masqué), RCE, changement de plugin sans GRANT réussissant sur MySQL 8 (1227 sans CREATE USER). Le nom d'utilisateur, l'hôte et le mot de passe restent échappés. Le mot de passe propre n'a pas besoin de GRANT ; le résidu est le champ plugin non mis entre guillemets, pas un échange de plugin libre.
Même pin : WebAuthn CustomServer leftover.
J'ai épinglé phpmyadmin/phpmyadmin RELEASE_5_2_3. PMASA-2025-1/2/3 sont déjà dans 5.2.2. Le changement de mot de passe construit toujours :
return 'ALTER USER \'' . $dbi->escapeString($username)
. '\'@\'' . $dbi->escapeString($hostname)
. '\' IDENTIFIED WITH ' . $authPlugin . ' BY '
$authPlugin est $_POST['authentication_plugin']. MySQL 5.7.37+ et 8.0 omettent WITH sauf si le plugin a changé. Postez un nom différent et la clause réapparaît.
Fausses pistes déjà consignées : traiter MySQL 1227 comme un échec du résidu (c'est la preuve que le SQL supplémentaire a été parsé) ; prétendre à un changement de plugin sans GRANT sur MySQL 8 ; traiter l'auth config comme dans le périmètre ; un reverse shell. Du théâtre.
python3 phpmyadmin-auth-plugin-unquoted-Abraxas-Labs.py
# or: cd lab && ./run.sh
Cible uniquement http://127.0.0.1:19260. Images phpmyadmin:5.2.3 et mysql:8.0. Projet Compose phpmyadmin-auth-plugin-unquoted. La stack est démontée après l'exécution.
Connexion par cookie en tant que appuser. POST /user-password avec authentication_plugin=sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/. Boîte de requête SQL PMA : ALTER USER 'appuser'@'%' IDENTIFIED WITH sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ BY '***'. Le journal général MySQL parse le commentaire et stocke IDENTIFIED WITH 'sha256_password'. Le nom d'utilisateur est entre guillemets.
SUCCESS phpmyadmin-auth-plugin-unquoted how=live unquoted=yes escaped-user=yes plugin=sha256_password PMA-AUTH-PLUGIN-UNQUOTED-WITNESS
Liste d'autorisation des noms de plugins depuis SHOW PLUGINS. Ne jamais interpoler le POST dans IDENTIFIED WITH, VIA ou plugin=.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/UserPassword.phplibraries/classes/Server/Privileges.phpGNU Affero GPL v3.0. Voir LICENSE. Lab en boucle locale uniquement. Aucune garantie.