abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-pmadb-central-sqli
技术分析文章:https://abraxaslabs.tech/research/phpmyadmin-pmadb-central-sqli
类别: SQLi 可达性: 远程
phpMyAdmin 5.2.3(标签 RELEASE_5_2_3,提交 962857e)。Central columns 在控制用户连接上,将 POST 的 extra 和 attribute 拼接进一个单引号 SQL 字面量来写入 col_extra。相邻字段都经过 escapeString 处理。而这两个字段没有。
已登录用户向 index.php?route=/database/central-columns POST multi_edit_central_column_save=1,并在 field_attribute(或 col_extra)中放入一个引号。随后 getInsertQuery / updateOneColumn 会以 pma 控制用户身份对 pma__central_columns 执行该字符串。该账户是配置存储用户,而非已登录的 SQL 实例。
CVE-2016-5703 是 central columns 中的数据库名问题。这些 extra 和 attribute 字段并非该漏洞。
| ID | 暂无 CVE |
| 类别 | SQLi(控制用户在 pma__central_columns 上) |
| 可达性 | 远程(已认证 cookie 登录;已启用 pmadb central columns) |
| CWE | CWE-89 |
| CVSS | 高危:8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| 产品 | phpMyAdmin |
| 受影响版本 | 5.2.3 标签 RELEASE_5_2_3(962857e) |
| 认证 | 已认证 cookie 登录。已启用 pmadb central columns。 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:19210 |
能够打开 Central columns 的已登录 phpMyAdmin 用户,可以以控制用户身份在 pma__central_columns 上注入 SQL。
| 权限 | 方法 / 路径 | 实验验证或推断 |
|---|---|---|
| 破坏控制用户的 INSERT/UPDATE 字符串(pmadb SQL 的完整性) | POST index.php?route=/database/central-columns multi_edit_central_column_save=1,在 field_attribute / col_extra 中放入引号 | 实验验证。#1064 JSON 错误。控制用户错误中出现见证字符串 PMA-PMADB-CENTRAL-SQLI-WITNESS |
| 保持相邻字段在带内 | 同一 POST,在 field_name 中放入引号 | 实验验证。行被存储为 neg'col。escapeString 生效 |
| 读取或覆盖其他用户的 central-column 行 | 同一注入点,一旦字符串被闭合 | 推断。实验止于语法错误;无堆叠查询 |
| 以控制用户身份执行额外语句 | 同一注入点,若控制 mysqli 连接允许多语句 | 推断。默认 mysqli::query 为单语句。此处未启用 |
触及其他 pmadb 表(bookmarks、history、pma__userconfig) | 仅当堆叠查询或 INTO 式写入可行时 | 推断。本实验中的控制用户仅有 phpmyadmin.* 的 DML 权限 |
本实验已排除:未认证访问、已登录 appuser 的 SQL 实例(仅 appdb)、OS shell 以及堆叠查询。若 pmadb / central columns 关闭,该功能不生效(这属于 FAIL,而非本遗留问题)。
对 RELEASE_5_2_3 进行了八路并行源码排查。CentralColumns.php 中的相邻字段都经过 escapeString 处理。extra 和 attribute 则被 implode 进一个单引号字面量。CVE-2016-5703 是数据库名问题,而非这些列。
走过的弯路:把 field_name 中的引号当作遗留问题(它存储为 neg'col;那是阴性对照);期望通用日志显示未转义的见证字符串(INSERT 在成功写入前就以 #1064 失败);把 pmadb 关闭当作本遗留问题(功能不生效)。
python3 phpmyadmin-pmadb-central-sqli-Abraxas-Labs.py
或
cd lab
./run.sh
仅限回环地址:http://127.0.0.1:19210。镜像 phpmyadmin:5.2.3 和 mysql:8.0。Compose 项目 phpmyadmin-pmadb-central-sqli。见证 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
对 extra 和 attribute 使用 escapeString / quoteString(..., CONNECT_CONTROL)。允许列表包括 auto_increment、UNSIGNED、BINARY、UNSIGNED ZEROFILL 和 on update CURRENT_TIMESTAMP。phpMyAdmin 6.x 中对 designer JSON blob 使用 quoteString 是此类 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。参见 LICENSE。仅限回环实验环境使用。不提供任何担保。