
phpMyAdmin 5.2.3 - Alta - Remota - SQLi - colunas centrais pmadb consulta residual
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-pmadb-central-sqli
Write-up: https://abraxaslabs.tech/research/phpmyadmin-pmadb-central-sqli
Classe: SQLi Alcance: Remoto
phpMyAdmin 5.2.3 (tag RELEASE_5_2_3, commit 962857e). As colunas centrais gravam col_extra concatenando o POST extra e attribute em um literal SQL entre aspas simples no link do usuário de controle. Os campos vizinhos passam por escapeString. Esses dois não passam.
Um usuário autenticado envia POST para index.php?route=/database/central-columns com multi_edit_central_column_save=1 e uma aspa em field_attribute (ou col_extra). getInsertQuery / updateOneColumn então executam essa string como o usuário de controle do pma contra pma__central_columns. Essa conta é o usuário de armazenamento de configuração, não o SQL box autenticado.
CVE-2016-5703 era o nome do banco de dados nas colunas centrais. Esses campos extra e attribute não eram esse bug.
| ID | sem CVE ainda |
| Classe | SQLi (usuário de controle em pma__central_columns) |
| Alcance | Remoto (login autenticado por cookie; colunas centrais do pmadb habilitadas) |
| 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 (962857e) |
| Autenticação | Login autenticado por cookie. Colunas centrais do pmadb habilitadas. |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1:19210 |
Um usuário autenticado do phpMyAdmin que consegue abrir Colunas centrais pode injetar SQL como o usuário de controle em pma__central_columns.
| Privilégio | Método / caminho | Comprovado em lab ou inferido |
|---|---|---|
| Quebrar a string INSERT/UPDATE do usuário de controle (integridade do SQL do pmadb) | POST index.php?route=/database/central-columns multi_edit_central_column_save=1 com uma aspa em field_attribute / col_extra | Comprovado em lab. Erro JSON #1064. Testemunha PMA-PMADB-CENTRAL-SQLI-WITNESS no erro do usuário de controle |
| Manter campos vizinhos in-band | Mesmo POST, aspa em field_name | Comprovado em lab. Linha armazenada como neg'col. escapeString resistiu |
| Ler ou sobrescrever linhas de colunas centrais de outros usuários | Mesmo sink, uma vez que a string seja fechada | Inferido. O lab para no erro de sintaxe; sem query empilhada |
| Comandos extras como o usuário de controle | Mesmo sink se o link mysqli de controle permitir multi-query | Inferido. O padrão de mysqli::query é single-statement. Não habilitado aqui |
Alcançar outras tabelas do pmadb (bookmarks, histórico, pma__userconfig) | Apenas se queries empilhadas ou uma escrita no estilo INTO forem possíveis | Inferido. O usuário de controle neste lab tem apenas DML em phpmyadmin.* |
Fechado neste lab: acesso não autenticado, o SQL box do appuser autenticado (apenas appdb), shell do SO e queries empilhadas. O recurso não faz nada se pmadb / colunas centrais estiverem desligados (isso é um FAIL, não este resíduo).
Oito buscas paralelas no código-fonte de RELEASE_5_2_3. Campos vizinhos em CentralColumns.php passam por escapeString. Extra e attribute são implode em um literal entre aspas simples. CVE-2016-5703 era o nome do banco de dados, não essas colunas.
Caminhos errados: tratar uma aspa em field_name como o resíduo (ela é armazenada como neg'col; esse é o negativo); esperar que o log geral mostrasse a testemunha não escapada (o INSERT morre com #1064 antes de uma escrita bem-sucedida); tratar pmadb desligado como este resíduo (o recurso não faz nada).
python3 phpmyadmin-pmadb-central-sqli-Abraxas-Labs.py
ou
cd lab
./run.sh
Apenas loopback: http://127.0.0.1:19210. Imagens phpmyadmin:5.2.3 e mysql:8.0. Projeto Compose phpmyadmin-pmadb-central-sqli. Witness PMA-PMADB-CENTRAL-SQLI-WITNESS.
SUCCESS phpmyadmin-pmadb-central-sqli how=live insert-syntax=yes field-name-escaped=yes general-log-unescaped=false error-has-witness=true PMA-PMADB-CENTRAL-SQLI-WITNESS
escapeString / quoteString(..., CONNECT_CONTROL) em extra e attribute. Allowlist auto_increment, UNSIGNED, BINARY, UNSIGNED ZEROFILL e on update CURRENT_TIMESTAMP. O quoteString do phpMyAdmin 6.x no blob JSON do designer é a forma corrigida para esta classe de concatenação no pmadb.
962857e)libraries/classes/Database/CentralColumns.php getInsertQuery / updateOneColumnControllers/Database/CentralColumnsController.php POST multi_edit_central_column_saveGET|POST /database/central-columnsGNU Affero GPL v3.0. Consulte LICENSE. Apenas para laboratório em loopback. Sem garantias.