phpMyAdmin 5.2.3 - 高危 - 远程 - SQL注入 - 认证插件标识符未加引号
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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。提交一个不同的名称,该子句就会重新出现。
已记录的弯路:将 MySQL 1227 视为遗留问题失败(它恰恰证明额外 SQL 被解析了);声称在 MySQL 8 上无 GRANT 权限的插件更改可行;将 config 认证视为在范围内;反弹 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 登录。POST /user-password,参数为 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。仅限回环实验环境。不提供任何担保。