abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · phpmyadmin-setup-validate
技术分析文章:https://abraxaslabs.tech/research/phpmyadmin-setup-validate
类别: SSRF 可达性: 远程
phpMyAdmin 5.2.3(标签 RELEASE_5_2_3,提交 962857e)。当 config.inc.php 存在时,setup/index.php 会终止运行。但 setup/validate.php 不会。它仍会在 $isMinimumCommon 下加载,从公开登录页面获取 CSRF 令牌,并调用 Validator::testDBConnection -> mysqli_connect,连接目标为 JSON values 字段中的主机、端口、用户名和密码。
未认证的客户端先 GET / 获取会话 cookie 和令牌,然后向 setup/validate.php POST id=Server,并附带自选的 Servers/1/host 和 Servers/1/port。phpMyAdmin 主机随即向该地址发起 TCP MySQL 握手。这就是基于 MySQL 协议的 SSRF:探测内部 3306 端口、对内网服务器进行凭据填充、通过时序和 mysqli 错误构建端口预言机。除非该端口上有服务使用 MySQL 协议,否则它并非 HTTP 元数据 SSRF。hide_db 还会将用户提供的正则表达式插入 preg_match。本实验室未运行该 ReDoS 路径。
官方 phpmyadmin:5.2.3 镜像会删除 setup/。此遗留问题仅在 setup/ 目录仍位于 Web 根目录时适用,而这正是安装后常见的遗留情况。实验室从 5.2.3 tarball 恢复 setup/,以使版本与 RELEASE_5_2_3 一致。
PMASA-2016-44 / CVE-2016-6621 涵盖了一些 setup SSRF 问题。“配置存在时禁用 setup”的检查从未应用于 validate.php / config.php。
| ID | 暂无 CVE |
| 类别 | SSRF(MySQL 协议) |
| 可达性 | 远程(若 setup/ 仍可通过 Web 访问,则无需认证) |
| CWE | CWE-918 |
| CVSS | 高危:7.2 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N |
| 产品 | phpMyAdmin |
| 受影响版本 | 5.2.3 标签 RELEASE_5_2_3(962857e),且 setup/ 仍位于文档根目录 |
| 认证 | 无需认证。CSRF 令牌来自公开登录页面。无需 MySQL 登录。 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验室 | 仅 127.0.0.1:19230 |
任何能够访问遗留 setup/ 目录树的人,都可以让 phpMyAdmin 主机向自选的主机和端口发起 MySQL 协议 TCP 连接。
| 权限 | 方法 / 路径 | 实验室验证或推断 |
|---|---|---|
| 从 PMA 主机向攻击者指定的 host:port 发起 TCP 连接(出站连接完整性;对该端口进行侦察) | 未认证 POST /setup/validate.php id=Server,附带 Servers/1/host + Servers/1/port,以及来自 GET / 的令牌 | 实验室验证。oracle:13306 上的预言机记录了来自 PMA 容器的 PMA-SETUP-VALIDATE-WITNESS |
| 确认 setup UI 已关闭而 validate 仍开启 | GET /setup/index.php | 实验室验证。响应体包含 "setup is disabled" / configuration already exists |
| 缺少登录页 CSRF 令牌时安全失败 | 相同 POST,无 token | 实验室验证。预言机零命中 |
| 通过 mysqli 错误和时序构建端口 / 凭据预言机 | 相同 testDBConnection | 推断。预言机接受后关闭,实验室响应体为 mysqli_connect(): (HY000/2006): MySQL server has gone away |
| 与内部 3306 进行 MySQL 通信并尝试提交的用户名/密码 | 相同 mysqli_connect | 推断。未指向实验室 db 服务 |
通过 validateRegex 插入用户正则表达式触发 ReDoS | id=Servers/1/hide_db | 推断。未实际执行 |
本实验已关闭:HTTP 元数据 SSRF(握手协议是 MySQL,而不是 GET /latest/meta-data)、未认证的 PMA 登录、操作系统 shell,以及安装向导本身(index.php 保持禁用)。如果 setup/ 未部署(官方镜像默认如此),则判定为 FAIL。
对 RELEASE_5_2_3 进行了八路并行源码搜寻。setup/index.php 存在配置已存在的致命错误。setup/validate.php 则没有。setup/lib/common.inc.php 设置了 $isMinimumCommon,并且不查找 CONFIG_FILE。
走过的弯路:把官方镜像当作这个遗留物(它会删除 setup/);在没有登录页令牌的情况下发送 POST 请求(零 oracle 命中);将其视为 HTTP 元数据 SSRF(握手协议是 MySQL)。
python3 phpmyadmin-setup-validate-Abraxas-Labs.py
或
cd lab
./run.sh
仅限回环地址:http://127.0.0.1:19230。Compose 项目 phpmyadmin-setup-validate。Dockerfile 从 5.2.3 tarball 恢复 setup/,并在端口 13306 上运行 TCP oracle。见证值 PMA-SETUP-VALIDATE-WITNESS。
SUCCESS phpmyadmin-setup-validate how=live tcp=yes setup-index-disabled=yes PMA-SETUP-VALIDATE-WITNESS
将 file_exists(CONFIG_FILE) 的致命检查放入 setup/lib/common.inc.php,使每一个 setup 脚本都会终止。限制 testDBConnection 的主机。不要用用户提供的字符串构建 preg_match 分隔符。
962857e)setup/index.php 配置已存在的致命检查setup/validate.php 缺少该检查libraries/classes/Config/Validator.php 中的 testDBConnection / mysqli_connectGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。