phpMyAdmin 5.2.3 - 高危 - 远程 - SQL注入 - 认证插件标识符未加引号
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-auth-plugin-unquoted
技术分析文章:https://abraxaslabs.tech/research/phpmyadmin-auth-plugin-unquoted
类别: SQLi 可达性: 远程
phpMyAdmin 5.2.3(RELEASE_5_2_3 / 962857e)- phpMyAdmin
修改密码功能默认开启。UserPassword.php 将 POST 的 authentication_plugin 直接复制进 ALTER USER ... IDENTIFIED WITH,既没有允许列表,也没有加引号。同一条语句中的用户名、主机和密码都经过 escapeString 处理。在 MySQL 8 上,当提交的插件与当前插件不同时,会生成 WITH 子句。
已登录的 phpMyAdmin 用户可以通过修改密码表单,向自己的 ALTER USER 语句注入 SQL。插件字段中的额外 SQL 会被当作 SQL 执行,而不是插件名。
| ID | 暂无 CVE |
| 类别 | SQLi |
| 可达性 | 远程(已认证的 cookie 登录;修改密码功能开启) |
| 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(962857e4f63d42e38f11ff4d63f5e722018add76) |
| 认证 | 已认证的 cookie 登录。$cfg['ShowChgPassword'] 默认为 true。认证类型不是 config |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
已登录的 phpMyAdmin 用户可以通过修改密码表单,向自己的 ALTER USER 语句注入 SQL。
| 权限 | 方法 / 汇聚点 | 侦察 / 完整性 / 可用性 | 实验验证或推断 |
|---|---|---|---|
在 IDENTIFIED WITH 中发送额外 SQL | POST index.php?route=/user-password,参数 authentication_plugin | phpMyAdmin 所构建语句的完整性 | 实验验证。原始 POST sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ 在 SQL 框中以未加引号的形式出现 |
| 让 MySQL 将额外 SQL 解析为 SQL | 同一条语句到达 mysqld | 用户连接的完整性 | 实验验证。通用日志保留了插件 sha256_password,并丢弃了注释。返回 1227,因为该用户没有 CREATE USER 权限 |
| 若突破成功解析,可添加额外子句或额外账户 | 同一汇聚点;堆叠查询取决于驱动 | 其他账户的完整性 | 推断。本实验未执行第二条语句,也未创建其他账户 |
| 在添加/编辑用户时存在相同的拼接 | Privileges.php 的 IDENTIFIED WITH / MariaDB 的 VIA | 授权者构建语句的完整性 | 推断的同类问题。实验中的 POST 仅涉及修改密码 |
此路径上已排除:未认证使用(需要 cookie 登录)、config 认证(修改密码被隐藏)、RCE、在 MySQL 8 上无 GRANT 的插件更改成功(无 CREATE USER 时返回 1227)。用户名、主机和密码仍被转义。修改自己的密码不需要 GRANT;遗留问题是未加引号的插件字段,而不是可自由替换插件。
同一版本固定点:WebAuthn CustomServer 遗留问题。
我固定了 phpmyadmin/phpmyadmin RELEASE_5_2_3。PMASA-2025-1/2/3 已包含在 5.2.2 中。修改密码功能仍然构建:
return 'ALTER USER \'' . $dbi->escapeString($username)
. '\'@\'' . $dbi->escapeString($hostname)
. '\' IDENTIFIED WITH ' . $authPlugin . ' BY '
$authPlugin 就是 $_POST['authentication_plugin']。MySQL 5.7.37+ 和 8.0 除非插件发生变化,否则会省略 WITH。POST 一个不同的名称,该子句就会重新出现。
已记录的弯路:把 MySQL 1227 当作残留内容导致的失败(它恰恰证明额外 SQL 已被解析);声称在 MySQL 8 上无需 GRANT 即可更改插件;把 config-auth 视为范围内;一个反向 shell。纯属作秀。
python3 phpmyadmin-auth-plugin-unquoted-Abraxas-Labs.py
# or: cd lab && ./run.sh
仅针对 http://127.0.0.1:19260。镜像 phpmyadmin:5.2.3 和 mysql:8.0。Compose 项目 phpmyadmin-auth-plugin-unquoted。运行结束后栈会被拆除。
以 appuser 身份通过 Cookie 登录。向 /user-password 发送 POST 请求,携带 authentication_plugin=sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/。PMA SQL 查询框:ALTER USER 'appuser'@'%' IDENTIFIED WITH sha256_password /*PMA-AUTH-PLUGIN-UNQUOTED-WITNESS*/ BY '***'。MySQL 通用日志解析该注释并存储为 IDENTIFIED WITH 'sha256_password'。用户名被引号包裹。
SUCCESS phpmyadmin-auth-plugin-unquoted how=live unquoted=yes escaped-user=yes plugin=sha256_password PMA-AUTH-PLUGIN-UNQUOTED-WITNESS
从 SHOW PLUGINS 中获取插件名称白名单。切勿将 POST 数据插入到 IDENTIFIED WITH、VIA 或 plugin= 中。
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/UserPassword.phplibraries/classes/Server/Privileges.phpGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境使用。不提供任何担保。