
phpMyAdmin 5.2.3 - Alta - Remoto - Ignorar 2FA - A cerimônia WebAuthn pode ser ignorada
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-webauthn
Write-up: https://abraxaslabs.tech/research/phpmyadmin-webauthn
Classe: bypass de 2FA Alcance: Remoto
phpMyAdmin 5.2.3 (tag RELEASE_5_2_3). Tarball padrão. web-auth/webauthn-lib é suggest / require-dev. composer install --no-dev não o instala. Portanto, createServer usa CustomServer. Essa classe faz o parse de response.signature (o campo precisa existir e decodificar) e nunca faz a verificação COSE dele. Ela nunca usa a credentialPublicKey armazenada. O próprio CustomServerTest do produto aceita uma assertion sem chave pública.
As verificações estruturais são reais: credential id em allowCredentials, clientData.type == webauthn.get, challenge corresponde à sessão, host de origem, rpIdHash, user-present. A assinatura é parseada e ignorada. Após a senha do MySQL, uma assinatura WebAuthn inválida que ainda corresponda a esses campos resulta em uma sessão completa do phpMyAdmin. Isso é o banco de dados. Se você realmente instalou web-auth/webauthn-lib, você está em WebauthnLibServer e não nesta falha.
| ID | ainda sem CVE |
| Classe | bypass de 2FA / verificação de assinatura ausente |
| Alcance | Remoto (login por cookie, depois WebAuthn ignorado) |
| CWE | CWE-347, CWE-287 |
| 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. Tarball padrão / composer install --no-dev |
| Autenticação | Login por cookie (senha do MySQL), depois WebAuthn ignorado |
| Licença | GNU Affero GPL v3.0 |
| Lab | somente 127.0.0.1:18080 |
Ele ainda precisa da senha do MySQL (login por cookie). Após essa senha, ele envia via POST webauthn_request_response com challenge correspondente, host de origem, rpIdHash, user-present, credential id registrado e uma assinatura inválida. Ele entra na interface normal. O 2FA não existe mais. Isso é o banco de dados (SQL, usuários, exportação), não um shell PHP no host.
Se você realmente instalou web-auth/webauthn-lib, você está em WebauthnLibServer e não nesta falha.
| Privilégio | Método / caminho | Comprovado em lab ou inferido |
|---|---|---|
| Completar o 2FA WebAuthn sem o autenticador (integridade do segundo fator) | POST webauthn_request_response após a senha, assinatura inválida | Comprovado em lab. still_2fa=False landed=True |
| PMA completo como aquele usuário MySQL (integridade + reconhecimento da máquina SQL) | mesma sessão | Comprovado em lab. Marcadores da UI inicial presentes |
| Pular a senha do MySQL | POST não autenticado | Comprovado em lab como fechado. Permanece na tela de login |
Mesmo bypass com web-auth/webauthn-lib instalado | WebauthnLibServer | Fechado. Não é esta falha residual |
| RCE no SO / reverse shell | esta falha residual | Fechado |
Fechado nesta falha residual: PMA não autenticado, um shell PHP no host, e tratar um tarball que realmente instalou web-auth/webauthn-lib como esta falha.
Eu li createServer, depois parseAndValidateAssertionResponse, depois o teste unitário que não passa uma chave pública. As verificações estruturais são reais. A assinatura é parseada e ignorada.
Caminhos errados: enviar via POST JSON WebAuthn sem uma sessão de senha prévia; uma assinatura que falhou nas verificações estruturais; Webauthn\Server ainda presente (classe de servidor errada); challenge que não era desta sessão; host de origem incompatível; flag user-present desativada; credential id não presente em allowCredentials.
O Dockerfile do laboratório copia a versão 5.2.3, executa composer install --no-dev e, em seguida, exclui vendor/web-auth para que CustomServer seja o que está em uso. O último php -r retorna 1 se Webauthn\Server existir. O init.sql registra a 2FA WebAuthn para appuser sem uma chave de hardware. O PoC envia via POST a assinatura not-a-real-signature-PMA-WEBAUTHN-BYPASS.
Clone o pin ao lado do Dockerfile e, em seguida, execute:
cd lab
git clone --depth 1 --branch RELEASE_5_2_3 https://github.com/phpmyadmin/phpmyadmin.git src
./run.sh
ou da raiz do pacote após esse clone:
python3 phpmyadmin-webauthn-Abraxas-Labs.py
Apenas loopback: http://127.0.0.1:18080. Projeto Compose pma-webauthn-lab. Fixe RELEASE_5_2_3. Não envie src/. Testemunhe PMA-WEBAUTHN-BYPASS.
SUCCESS PMA-WEBAUTHN-BYPASS WebAuthn 2FA accepted with garbage signature
Verifique authenticatorData || SHA-256(clientDataJSON) com a chave pública COSE armazenada; vincule userHandle; imponha signCount. Torne web-auth/webauthn-lib uma dependência real e exclua CustomServer, ou falhe de forma segura se a biblioteca estiver ausente. Até então, desative o 2FA WebAuthn ou não exponha este phpMyAdmin.
Plugins\TwoFactor\WebAuthn::createServerCustomServer::parseAndValidateAssertionResponseGNU Affero GPL v3.0. Consulte LICENSE. Apenas laboratório em loopback. Sem garantias.