abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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 和令牌,然后 POST setup/validate.php 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/。此遗留问题仅在该目录仍位于 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 上的 oracle 记录了来自 PMA 容器的 PMA-SETUP-VALIDATE-WITNESS |
| 确认 setup UI 已关闭而 validate 仍开启 | GET /setup/index.php | 实验室验证。响应体包含 "setup is disabled" / configuration already exists |
| 在没有登录页面 CSRF 令牌时安全失败 | 相同 POST,无 token | 实验室验证。零 oracle 命中 |
| 通过 mysqli 错误和时序实现端口 / 凭据探测 | 相同 testDBConnection | 推断。在 oracle 接受后关闭后,实验室响应体为 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 登录、OS shell 以及 setup 向导本身(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。仅限回环实验室。无担保。