phpMyAdmin 5.2.3 - Alta - Remota - SQLi - identificador do plugin de autenticação sem aspas
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-auth-plugin-unquoted
Classe: SQLi Alcance: Remoto
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
A alteração de senha está ativada por padrão. UserPassword.php copia o POST authentication_plugin para ALTER USER ... IDENTIFIED WITH sem allowlist e sem aspas. Nome de usuário, host e senha na mesma instrução passam por escapeString. No MySQL 8, a cláusula WITH é emitida quando o plugin enviado difere do atual.
Um usuário autenticado do phpMyAdmin injeta SQL em seu próprio ALTER USER através do formulário de alteração de senha. SQL extra no campo de plugin é SQL, não um nome de plugin.
| ID | ainda sem CVE |
| Classe | SQLi |
| Alcance | Remoto (login autenticado por cookie; alteração de senha ativada) |
| 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 |
| Produto | phpMyAdmin |
| Afetado | 5.2.3 tag RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| Autenticação | login autenticado por cookie. $cfg['ShowChgPassword'] padrão true. O tipo de autenticação não é config |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1 |
Um usuário autenticado do phpMyAdmin pode injetar SQL em seu próprio ALTER USER através do formulário de alteração de senha.
| Privilégio | Método / sink | Reconhecimento / integridade / disponibilidade | Comprovado em lab ou inferido |
|---|---|---|---|
Enviar SQL extra em IDENTIFIED WITH | POST index.php?route=/user-password com authentication_plugin | Integridade da instrução que o phpMyAdmin constrói | Comprovado em lab. POST bruto sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ aparece sem aspas na caixa SQL |
| Fazer o MySQL interpretar esse SQL extra como SQL | A mesma instrução chega ao mysqld | Integridade da conexão do usuário | Comprovado em lab. O log geral manteve o plugin sha256_password e descartou o comentário. 1227 porque este usuário não tem CREATE USER |
| Cláusulas extras ou contas extras se o breakout for interpretado | Mesmo sink; consultas empilhadas dependem do driver | Integridade de outras contas | Inferido. Este lab não executa uma segunda instrução nem cria outra conta |
| Mesma concatenação em adicionar/editar usuário | Privileges.php IDENTIFIED WITH / MariaDB VIA | Integridade de instruções construídas pelo grantor | Irmão inferido. O POST do lab é apenas de alteração de senha |
Fechado neste caminho: uso não autenticado (login por cookie necessário), auth config (alteração de senha fica oculta), RCE, alteração de plugin sem GRANT bem-sucedida no MySQL 8 (1227 sem CREATE USER). Nome de usuário, host e senha permanecem escapados. A própria senha não precisa de GRANT; o que sobra é o campo de plugin sem aspas, não uma troca livre de plugin.
Mesmo pin: WebAuthn CustomServer leftover.
Fixe no phpmyadmin/phpmyadmin RELEASE_5_2_3. PMASA-2025-1/2/3 já estão na 5.2.2. A alteração de senha ainda constrói:
return 'ALTER USER \'' . $dbi->escapeString($username)
. '\'@\'' . $dbi->escapeString($hostname)
. '\' IDENTIFIED WITH ' . $authPlugin . ' BY '
$authPlugin é $_POST['authentication_plugin']. MySQL 5.7.37+ e 8.0 omitem WITH a menos que o plugin tenha mudado. Envie um nome diferente via POST e a cláusula volta.
Caminhos errados já registrados: tratar o MySQL 1227 como falha do leftover (é a prova de que o SQL extra foi interpretado); alegar uma alteração de plugin sem GRANT no MySQL 8; tratar auth config como dentro do escopo; um reverse shell. Teatro.
python3 phpmyadmin-auth-plugin-unquoted-Abraxas-Labs.py
# or: cd lab && ./run.sh
Alvo apenas http://127.0.0.1:19260. Imagens phpmyadmin:5.2.3 e mysql:8.0. Projeto Compose phpmyadmin-auth-plugin-unquoted. A stack é desmontada após a execução.
Login por cookie como appuser. POST /user-password com authentication_plugin=sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/. Caixa de consulta SQL do PMA: ALTER USER 'appuser'@'%' IDENTIFIED WITH sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ BY '***'. O log geral do MySQL interpreta o comentário e armazena IDENTIFIED WITH 'sha256_password'. O nome de usuário está entre aspas.
SUCCESS phpmyadmin-auth-plugin-unquoted how=live unquoted=yes escaped-user=yes plugin=sha256_password PMA-AUTH-PLUGIN-UNQUOTED-WITNESS
Faça allowlist dos nomes de plugin a partir de SHOW PLUGINS. Nunca interpole POST em IDENTIFIED WITH, VIA ou plugin=.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/UserPassword.phplibraries/classes/Server/Privileges.phpGNU Affero GPL v3.0. Veja LICENSE. Apenas lab em loopback. Sem garantia.