
phpMyAdmin 5.2.3 - Alta - Remota - 2FA - config/set cancella l'autenticazione a due fattori
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-config-set-2fa
Classe: Privilegio residuo / step-up mancante Portata: Remota
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
POST index.php?route=/config/set scrive qualsiasi preferenza in allowlist, incluso 2fa. UserPreferences::persistOption non esegue alcuna validazione. Impostazioni -> Autenticazione a due fattori chiama comunque TwoFactor::check(true) prima di rimuovere il fattore. /config/set no.
Una sessione autenticata, o XSS/CSRF in grado di effettuare il POST del token di pagina, può inviare key=2fa e value=null. Il successivo login con password non presenta alcun prompt TOTP, WebAuthn o Simple. Rimozione duratura, non un salto valido per una sola richiesta.
| ID | nessuna CVE al momento |
| Classe | Privilegio residuo / step-up mancante |
| Portata | Remota (login autenticato tramite cookie; token CSRF richiesto) |
| 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 |
| Prodotto | phpMyAdmin |
| Affetto | 5.2.3 tag RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| Auth | login tramite cookie. Token CSRF richiesto. Completa XSS o CSRF verso una rimozione duratura del 2FA |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Rimuovere il 2FA da un account phpMyAdmin senza presentare TOTP, WebAuthn o il campo di conferma Simple. Il successivo login con password è solo password. PMA completo come quell'utente MySQL (SQL, utenti, export).
| Privilegio | Metodo / percorso | Recon / integrità / disponibilità | Provato in lab o dedotto |
|---|---|---|---|
Persistere 2fa a null e rimuovere il secondo fattore da pmadb | POST index.php?route=/config/set autenticato key=2fa value=null più un token valido | Integrità dell'archivio delle preferenze | Provato in lab. success:true, pmadb config_data è diventato [] |
| Accedere con la sola password dopo quella scrittura | Nuova sessione cookie, stesso utente MySQL | Integrità del percorso di login | Provato in lab. Nessun 2fa_confirm, si è arrivati alla UI normale |
| Mantenere la sessione corrente mentre il 2FA scompare per i login successivi | Stesso handler; persistOption scrive l'archivio, non il flag two_factor_check attivo | Integrità delle sessioni successive | Provato in lab. La sessione A è rimasta dentro. La sessione B aveva visto il 2FA. La sessione C no |
| Concatenare da XSS memorizzato o CSRF in grado di effettuare il POST con il token di pagina | Residui della stessa revisione, non questo lab | Integrità del 2FA dopo un POST same-origin | Dedotto |
| Rimuovere il 2FA tramite Impostazioni | POST /preferences/two-factor 2fa_remove=1 | Integrità del 2FA tramite la UI documentata | Provato in lab, chiuso. Senza il fattore, PMA mostra la pagina di conferma e pmadb ha ancora backend=simple |
Chiusi su questo residuo: accesso non autenticato, salto della password MySQL, RCE sul sistema operativo, lettura delle righe pmadb di altri utenti. Non ho avuto bisogno del residuo #1 (firma CustomServer). Non ho saltato la password MySQL.
Stesso pin: residuo WebAuthn CustomServer.
Ho fissato la 5.2.3 dopo PMASA-2025-1/2/3. Auth tramite cookie, pmadb pma__userconfig. Il lab attiva $cfg['DBG']['simple2fa'] solo per permettere alle Impostazioni di registrare il backend Simple senza una chiave hardware. TOTP e WebAuthn risiedono nella stessa chiave di preferenza 2fa.
SetConfigController prende key e il value JSON e chiama Config::setUserValue. UserPreferences::persistOption è documentato "No validation is done!" apply() mette 2fa in allowlist così la chiave non viene scartata come preferenza sconosciuta.
$result = $this->config->setUserValue(null, $key, json_decode($value));
json_decode('null') è null di PHP. persistOption('2fa', null, $default) quindi rimuove config_data['2fa'] perché anche il default per quel percorso è null.
Impostazioni -> Autenticazione a due fattori è il contrasto. TwoFactorController non eseguirà configure('') finché TwoFactor::check(true) non restituisce true.
Vicoli ciechi già registrati: trattare 2fa_remove delle Impostazioni come la falla (richiede comunque il fattore); sostenere l'accesso non autenticato; sostenere un salto della password MySQL; trattare questo come il residuo #1 (CustomServer); una reverse shell. Teatro.
python3 phpmyadmin-config-set-2fa-Abraxas-Labs.py
# or: cd lab && ./run.sh
Target solo http://127.0.0.1:19280. Progetto Compose phpmyadmin-config-set-2fa. Pin RELEASE_5_2_3. run.sh copia o clona quel tag in lab/src/ per l'immagine. Lo stack viene smontato dopo l'esecuzione.
Le Impostazioni hanno registrato il 2FA Simple. Un secondo browser ha raggiunto la pagina 2fa_confirm. Il POST 2fa_remove senza il fattore è rimasto sulla UI di conferma e ha lasciato backend=simple in pmadb. Il POST /config/set ha poi restituito success:true, pmadb è diventato [], e il login successivo è arrivato alla UI normale.
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
Negare 2fa (e altre chiavi di autenticazione) su /config/set. Richiedere TwoFactor::check(true) prima di qualsiasi mutazione del 2FA. Mantenere il percorso delle Impostazioni come unico scrittore.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/Controllers/Config/SetConfigController.phplibraries/classes/Config/UserPreferences.phpGNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.