abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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 UI 的侦察 | 实验验证。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 destroy)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 保留单独的 "can read mysql.user" 标志。不要将目录 SELECT 缓存为超级用户。
962857e4f63d42e38f11ff4d63f5e722018add76)libraries/classes/DatabaseInterface.php isSuperUser()GNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。无担保。