abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-issuperuser
技术报告:https://abraxaslabs.tech/research/phpmyadmin-issuperuser
类别: 权限残留 可达性: 远程
phpMyAdmin 5.2.3(RELEASE_5_2_3 / 962857e)- phpMyAdmin
DatabaseInterface::isSuperUser() 并不是 SUPER / SYSTEM_USER 检查。它实际执行的是 SELECT 1 FROM mysql.user LIMIT 1。任何能够读取 mysql.user 的账户都会在本次会话剩余时间内被缓存为超级用户。$cfg['AllowUserDropDatabase'] 默认为 false。DestroyController、SqlController、ImportController 以及数据库页面都会通过 isSuperUser 这条捷径绕过该标志。
这是 phpMyAdmin 的策略绕过,而非新的 MySQL 权限。对 mysql.user 的 SELECT 权限加上 DROP 权限,且没有 SUPER 权限,就足以通过 PMA 执行 Drop。
| ID | 暂无 CVE |
| 类别 | 权限残留 |
| 可达性 | 远程(以 MySQL 账户进行已认证的 cookie 登录) |
| CWE | CWE-863 |
| CVSS | 中危:6.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L |
| 产品 | phpMyAdmin |
| 受影响版本 | 5.2.3 标签 RELEASE_5_2_3(962857e4f63d42e38f11ff4d63f5e722018add76) |
| 认证 | 以 MySQL 账户进行已认证的 cookie 登录 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅限 127.0.0.1 |
一个已登录的 MySQL 账户,只要能够读取 mysql.user(典型的备份/监控 SELECT 权限)并拥有 DROP 权限,且没有 SUPER 权限,就会被 phpMyAdmin 视为超级用户。
| 权限 | 方法 / 汇聚点 | 侦察 / 完整性 / 可用性 | 实验验证或推断 |
|---|---|---|---|
绕过 $cfg['AllowUserDropDatabase']=false,并在数据库页面看到 Drop 按钮 | GET index.php?route=/server/databases | 对 Drop 界面的侦察 | 实验验证。selectuser 存在 bulkActionDropButton / selected_dbs[];plaindrop 不存在 |
| 通过 PMA destroy 处理器删除数据库 | POST index.php?route=/server/databases/destroy selected_dbs[]=dropme ajax_request=true | 该数据库的完整性 / 可用性 | 实验验证。JSON 返回 success:true,"1 database has been dropped successfully.",dropme 已消失 |
从 SQL 输入框执行 DROP DATABASE | POST index.php?route=/sql sql_query=DROP DATABASE \dropme_sql`` | 该数据库的完整性 / 可用性 | 实验验证。数据库已消失。负面账户收到 "DROP DATABASE statements are disabled." |
解锁其他受 isSuperUser() 限制的 PMA 界面 | 权限、复制、状态、用户组、引擎、binlog、变量 | 这些界面的侦察 / 完整性 | 根据调用点推断。未实际测试 |
读取 mysql.user | PMA 用作 SUPER 判定依据的 MySQL SELECT | 对 PMA 误判为 SUPER 的目录进行侦察 | 实验验证。正是该授权被残留逻辑误判为 SUPER |
本实验环境已排除:真正的 MySQL SUPER(SHOW GRANTS 仍为 USAGE + 表 DROP + 对 mysql.user 的 SELECT)。FILE、GRANT OPTION、shutdown 和 ALL PRIVILEGES 均未授予。拥有 DROP 但没有对 mysql.user 的 SELECT 权限的账户仍然无法通过 PMA 执行删除。这不是新的 MySQL 权限,也不是 RCE。
同一版本固定点:WebAuthn CustomServer 残留。
我将 phpMyAdmin 固定为 RELEASE_5_2_3。那些表现得像 SUPER 的权限校验就应该看起来像 SUPER。而这一处看起来像是一个目录 SELECT:
$result = $this->tryQuery('SELECT 1 FROM mysql.user LIMIT 1');
$isSuperUser = false;
if ($result) {
$isSuperUser = (bool) $result->numRows();
}
SessionCache::set('is_superuser', $isSuperUser);
围绕 AllowUserDropDatabase(默认 false)使用该标志的校验点:
Controllers/Server/DatabasesController.php 中的 is_drop_allowedControllers/Server/Databases/DestroyController.php(AJAX 销毁)Controllers/Sql/SqlController.php / Sql::hasNoRightsToDropDatabaseControllers/Import/ImportController.phpControllers/Database/OperationsController.php已记录的误判方向:声称拥有真正的 MySQL SUPER 权限;将仅有 DROP 权限的账户视为漏洞(该账户是对照组);将其夸大为 RCE;反弹 shell。纯属作秀。
python3 phpmyadmin-issuperuser-Abraxas-Labs.py
# or: cd lab && ./run.sh
仅针对 http://127.0.0.1:19270。镜像 phpmyadmin:5.2.3 和 mysql:8.0。Compose 项目 phpmyadmin-issuperuser。$cfg['AllowUserDropDatabase']=false。运行结束后栈会被拆除。
selectuser 对 mysql.user 拥有 SELECT 权限,并对 dropme / dropme_sql 拥有 DROP 权限,没有 SUPER 权限。plaindrop 仅对 nodropme 拥有 DROP 权限。数据库页面为 selectuser 显示 Drop 按钮。POST /server/databases/destroy 删除了 dropme。POST /sql 执行 DROP DATABASE dropme_sql 也成功运行。plaindrop 仍然从 destroy 收到 Error JSON,并从 /sql 收到 "DROP DATABASE statements are disabled"。
SUCCESS phpmyadmin-issuperuser drop-ui=yes destroy=ok sql-drop=ok grants-no-super=yes mysql.user-select=yes neg-drop-ui=no neg-destroy=denied PMA-ISSUPERUSER-WITNESS
通过 INFORMATION_SCHEMA 或 SHOW GRANTS 测试真实的 SUPER / SYSTEM_USER。为确实需要该目录的 UI 保留一个单独的“可读取 mysql.user”标志。不要以超级用户身份缓存目录 SELECT 的结果。
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/DatabaseInterface.php isSuperUser()GNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境使用。不提供任何担保。