
phpMyAdmin 5.2.3 - Alta - Remoto - 2FA - config/set limpa a autenticação de dois fatores
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-config-set-2fa
Classe: Privilégio remanescente / etapa de verificação ausente Alcance: Remoto
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
POST index.php?route=/config/set grava qualquer preferência da lista de permissões, incluindo 2fa. UserPreferences::persistOption não faz nenhuma validação. Configurações -> Autenticação de dois fatores ainda chama TwoFactor::check(true) antes de remover o fator. /config/set não.
Uma sessão autenticada, ou XSS/CSRF capaz de enviar por POST o token da página, pode enviar key=2fa e value=null. O próximo login por senha não tem prompt de TOTP, WebAuthn ou Simple. Remoção duradoura, não um salto de uma requisição.
| ID | ainda sem CVE |
| Classe | Privilégio remanescente / etapa de verificação ausente |
| Alcance | Remoto (login autenticado por cookie; token CSRF necessário) |
| CWE | CWE-620 |
| 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 por cookie. Token CSRF necessário. Completa XSS ou CSRF para uma remoção duradoura de 2FA |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1 |
Remover o 2FA de uma conta phpMyAdmin sem apresentar TOTP, WebAuthn ou o campo de confirmação Simple. O próximo login por senha é apenas com senha. PMA completo como aquele usuário MySQL (SQL, usuários, exportação).
| Privilégio | Método / caminho | Reconhecimento / integridade / disponibilidade | Comprovado em lab ou inferido |
|---|---|---|---|
Persistir 2fa como null e remover o segundo fator do pmadb | POST index.php?route=/config/set autenticado key=2fa value=null mais um token válido | Integridade do armazenamento de preferências | Comprovado em lab. success:true, pmadb config_data tornou-se [] |
| Fazer login apenas com senha após essa gravação | Nova sessão por cookie, mesmo usuário MySQL | Integridade do caminho de login | Comprovado em lab. Sem 2fa_confirm, caiu na UI normal |
| Manter a sessão atual enquanto o 2FA desaparece para logins posteriores | Mesmo handler; persistOption grava o armazenamento, não o flag ativo two_factor_check | Integridade de sessões posteriores | Comprovado em lab. Sessão A permaneceu. Sessão B tinha visto 2FA. Sessão C não |
| Encadear a partir de XSS armazenado ou CSRF capaz de POST com o token da página | Remanescentes da mesma revisão, não deste lab | Integridade do 2FA após um POST de mesma origem | Inferido |
| Remover o 2FA através de Configurações | POST /preferences/two-factor 2fa_remove=1 | Integridade do 2FA via a UI documentada | Comprovado em lab como fechado. Sem o fator, o PMA mostra a página de confirmação e o pmadb ainda tem backend=simple |
Fechado neste remanescente: acesso não autenticado, pular a senha do MySQL, RCE no SO, ler linhas do pmadb de outros usuários. Não precisei do remanescente #1 (assinatura CustomServer). Não pulei a senha do MySQL.
Mesmo pin: remanescente WebAuthn CustomServer.
Fixe no 5.2.3 após PMASA-2025-1/2/3. Autenticação por cookie, pmadb pma__userconfig. O lab ativa $cfg['DBG']['simple2fa'] apenas para que Configurações possa registrar o backend Simple sem uma chave de hardware. TOTP e WebAuthn vivem na mesma chave de preferência 2fa.
SetConfigController recebe key e value JSON e chama Config::setUserValue. UserPreferences::persistOption está documentado como "Nenhuma validação é feita!" apply() inclui 2fa na lista de permissões para que a chave não seja descartada como uma preferência desconhecida.
$result = $this->config->setUserValue(null, $key, json_decode($value));
json_decode('null') é null do PHP. persistOption('2fa', null, $default) então remove config_data['2fa'] porque o padrão para esse caminho também é null.
Configurações -> Autenticação de dois fatores é o contraste. TwoFactorController não fará configure('') até que TwoFactor::check(true) retorne true.
Caminhos errados já registrados: tratar o 2fa_remove de Configurações como a falha (ele ainda exige o fator); alegar acesso não autenticado; alegar um salto da senha do MySQL; tratar isso como o remanescente #1 (CustomServer); um reverse shell. Teatro.
python3 phpmyadmin-config-set-2fa-Abraxas-Labs.py
# or: cd lab && ./run.sh
Alvo apenas http://127.0.0.1:19280. Projeto Compose phpmyadmin-config-set-2fa. Pin RELEASE_5_2_3. run.sh copia ou clona essa tag para lab/src/ para a imagem. A stack é desmontada após a execução.
Configurações registraram 2FA Simple. Um segundo navegador acessou a página 2fa_confirm. POST 2fa_remove sem o fator permaneceu na UI de confirmação e deixou backend=simple no pmadb. POST /config/set então retornou success:true, o pmadb tornou-se [], e o próximo login caiu na UI normal.
SUCCESS phpmyadmin-config-set-2fa enroll=simple ui-remove-blocked=yes config-set-cleared=yes next-login-password-only=yes PMA-CONFIG-SET-2FA-WITNESS
Negar 2fa (e outras chaves de autenticação) em /config/set. Exigir TwoFactor::check(true) antes de qualquer mutação de 2FA. Manter o caminho de Configurações como o único gravador.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/Controllers/Config/SetConfigController.phplibraries/classes/Config/UserPreferences.phpGNU Affero GPL v3.0. Veja LICENSE. Apenas lab em loopback. Sem garantia.