phpMyAdmin 5.2.3 - Alto - Remoto - SQLi - identificatore del plugin di autenticazione senza virgolette
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-auth-plugin-unquoted
Write-up: https://abraxaslabs.tech/research/phpmyadmin-auth-plugin-unquoted
Classe: SQLi Portata: Remota
phpMyAdmin 5.2.3 (RELEASE_5_2_3 / 962857e) - phpMyAdmin
La modifica della password è attiva per impostazione predefinita. UserPassword.php copia il POST authentication_plugin in ALTER USER ... IDENTIFIED WITH senza allowlist e senza quoting. Username, host e password nella stessa istruzione passano attraverso escapeString. Su MySQL 8 la clausola WITH viene emessa quando il plugin inviato differisce da quello corrente.
Un utente phpMyAdmin autenticato inietta SQL nel proprio ALTER USER tramite il modulo di modifica password. L'SQL aggiuntivo nel campo plugin è SQL, non un nome di plugin.
| ID | nessuna CVE al momento |
| Classe | SQLi |
| Portata | Remota (login autenticato tramite cookie; modifica password attiva) |
| 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 |
| Prodotto | phpMyAdmin |
| Affetto | 5.2.3 tag RELEASE_5_2_3 (962857e4f63d42e38f11ff4d63f5e722018add76) |
| Auth | login autenticato tramite cookie. $cfg['ShowChgPassword'] predefinito true. Il tipo di autenticazione non è config |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Un utente phpMyAdmin autenticato può iniettare SQL nel proprio ALTER USER tramite il modulo di modifica password.
| Privilegio | Metodo / sink | Recon / integrità / disponibilità | Provato in lab o dedotto |
|---|---|---|---|
Inviare SQL aggiuntivo in IDENTIFIED WITH | POST index.php?route=/user-password con authentication_plugin | Integrità dell'istruzione costruita da phpMyAdmin | Provato in lab. Il POST grezzo sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ appare senza quoting nel box SQL |
| Far interpretare a MySQL l'SQL aggiuntivo come SQL | La stessa istruzione raggiunge mysqld | Integrità della connessione dell'utente | Provato in lab. Il general log ha mantenuto il plugin sha256_password e scartato il commento. 1227 perché questo utente non ha CREATE USER |
| Clausole aggiuntive o account aggiuntivi se il breakout viene interpretato | Stesso sink; le query impilate dipendono dal driver | Integrità di altri account | Dedotto. Questo lab non esegue una seconda istruzione né crea un altro account |
| Stessa concatenazione su aggiunta/modifica utente | Privileges.php IDENTIFIED WITH / MariaDB VIA | Integrità delle istruzioni costruite dal grantor | Sibling dedotto. Il POST del lab riguarda solo la modifica password |
Chiuso su questo percorso: uso non autenticato (richiesto login tramite cookie), auth di tipo config (la modifica password è nascosta), RCE, cambio di plugin senza GRANT che riesce su MySQL 8 (1227 senza CREATE USER). Username, host e password restano escapati. La propria password non richiede GRANT; ciò che resta è il campo plugin senza quoting, non uno scambio gratuito di plugin.
Stesso pin: WebAuthn CustomServer leftover.
Ho fissato phpmyadmin/phpmyadmin RELEASE_5_2_3. PMASA-2025-1/2/3 sono già in 5.2.2. La modifica password costruisce ancora:
return 'ALTER USER \'' . $dbi->escapeString($username)
. '\'@\'' . $dbi->escapeString($hostname)
. '\' IDENTIFIED WITH ' . $authPlugin . ' BY '
$authPlugin è $_POST['authentication_plugin']. MySQL 5.7.37+ e 8.0 omettono WITH a meno che il plugin non sia cambiato. Invia via POST un nome diverso e la clausola ritorna.
Vicoli ciechi già registrati: trattare MySQL 1227 come fallimento del leftover (è la prova che SQL aggiuntivo è stato analizzato); sostenere un cambio di plugin senza GRANT su MySQL 8; trattare config-auth come in-scope; una reverse shell. Teatro.
python3 phpmyadmin-auth-plugin-unquoted-Abraxas-Labs.py
# or: cd lab && ./run.sh
Target solo http://127.0.0.1:19260. Immagini phpmyadmin:5.2.3 e mysql:8.0. Progetto Compose phpmyadmin-auth-plugin-unquoted. Lo stack viene rimosso al termine dell'esecuzione.
Login tramite cookie come appuser. POST su /user-password con authentication_plugin=sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/. Casella di query SQL di PMA: ALTER USER 'appuser'@'%' IDENTIFIED WITH sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ BY '***'. Il general log di MySQL analizza il commento e memorizza IDENTIFIED WITH 'sha256_password'. Il nome utente è tra virgolette.
SUCCESS phpmyadmin-auth-plugin-unquoted how=live unquoted=yes escaped-user=yes plugin=sha256_password PMA-AUTH-PLUGIN-UNQUOTED-WITNESS
Consenti i nomi dei plugin da SHOW PLUGINS. Non interpolare mai POST in IDENTIFIED WITH, VIA o plugin=.
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/UserPassword.phplibraries/classes/Server/Privileges.phpGNU Affero GPL v3.0. Vedi LICENSE. Solo laboratorio su loopback. Nessuna garanzia.