phpMyAdmin 5.2.3 - 高危 - 远程 - SQLi - Designer JSON 未净化标识符
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-designer-json-sqli
类别: SQLi 可达性: 远程
phpMyAdmin 5.2.3(标签 RELEASE_5_2_3,提交 962857e)。Designer AJAX 的 save_setting_value 对设置数据块执行 json_encode,并将其拼接进针对 control-user 链接的单引号 UPDATE/INSERT 语句中。用户名被转义。JSON 没有。json_encode 不会转义单引号。
已登录用户向 index.php?route=/database/designer POST 请求,携带 operation=save_setting_value 并在 value 中放入一个引号。随后 queryAsControlUser 将该字符串作为 pma control user 对 pma__designer_settings 执行。该账户是配置存储账户,而非已登录的 SQL 账户。phpMyAdmin 6.x 在 ControlUser 上对该数据块使用 quoteString 包裹。5.2.3 仍然直接拼接。
较早的 designer CVE(2016-6616、2019-11768、2019-18622)涉及用户名 / 数据库名。本次遗留问题出在 JSON 的 settings_data 列。
| ID | 暂无 CVE |
| 类别 | SQLi(针对 pma__designer_settings 的 control-user) |
| 可达性 | 远程(已认证 cookie 登录;Designer 与 pma__designer_settings 已启用) |
| 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 登录。Designer 与 pma__designer_settings 已启用。 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:19220 |
已登录的 phpMyAdmin 用户若能打开 Designer,即可作为 control user 对 pma__designer_settings 注入 SQL。
| 权限 | 方法 / 路径 | 实验验证或推断 |
|---|---|---|
| 破坏 control-user 的 UPDATE/INSERT 字符串(pmadb SQL 的完整性) | POST index.php?route=/database/designer operation=save_setting_value,在 value 中放入引号 | 实验验证。通用日志:SET settings_data = '{"snap_line":"PMA-DESIGNER-JSON-SQLI-WITNESS'#" }' 原始输出。quoteString 缺失 |
截断自身的 settings_data 使其不再是 JSON(自身行的完整性) | 同一 POST;# 注释掉语句剩余部分 | 实验验证。appuser 数据块包含见证字符串且不是合法 JSON。干净的保存 grid-ok 已消失 |
| 无需堆叠查询即可覆盖其他用户的 designer 行(受害者行的完整性) | 同一 # 注释掉 WHERE username = '...' | 实验验证。种子 victim 的 {"keep":"safe"} 变成了被截断的见证数据块 |
| 以 control user 执行额外语句 | 若 control mysqli 链接允许多语句,则同一汇聚点 | 推断。默认 mysqli::query 为单语句。此处未启用 |
触达其他 pmadb 表(bookmarks、history、pma__userconfig) | 仅当堆叠查询或写入式逃逸可行时 | 推断。本实验中的 control user 仅拥有 phpmyadmin.* 的 DML 权限 |
本实验已排除:未认证访问、已登录 appuser 的 SQL 账户(仅 appdb;appuser 对 phpmyadmin 无 GRANT)、OS shell 以及堆叠查询。若 pmadb / designer settings 关闭,该功能无效(那是 FAIL,而非本次遗留问题)。
对 RELEASE_5_2_3 进行了八路并行源码排查。saveSetting 将 json_encode 拼接进 '...'。用户名使用 escapeString。6.x 已对该数据块使用 quoteString。5.2.3 没有。
弯路:在用户名上注入(已被转义);期望出现 #1064(# 注释掉剩余部分,因此 MySQL 接受被截断的 UPDATE);将堆叠查询视为已验证(mysqli 默认为单语句)。
python3 phpmyadmin-designer-json-sqli-Abraxas-Labs.py
或
cd lab
./run.sh
仅限回环:http://127.0.0.1:19220。镜像 phpmyadmin:5.2.3 与 mysql:8.0。Compose 项目 phpmyadmin-designer-json-sqli。见证字符串 PMA-DESIGNER-JSON-SQLI-WITNESS。
SUCCESS phpmyadmin-designer-json-sqli version=5.2.3 how=live raw-concat=yes truncated=true sql-error=false quoteString=no PMA-DESIGNER-JSON-SQLI-WITNESS
对 JSON 数据块使用 quoteString(..., ControlUser) / escapeString,与 RecentFavoriteTable::saveToDb() 及 phpMyAdmin 6.x 在该列上的做法一致。不要将 json_encode 的输出放入单引号 SQL 字面量中。
962857e)libraries/classes/Database/Designer/Common.php saveSettingControllers/Database/DesignerController.php POST operation=save_setting_valueGET|POST /database/designerGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。