phpMyAdmin默认发起外链请求是因为域名配置触发DNS解析及旧版本SSRF漏洞;须同步设置host为IP、skip_connect为true、ssl为false,并检查ShowDatabasesCommand、mysqli连接及curl更新检查等残留路径。
phpMyAdmin 为什么默认会发起外链请求
因为 $cfg['servers'][$i]['host'] 配置为域名(比如 "db.example.com")且未禁用 dns 解析时,phpmyadmin 在连接前会主动做反向 dns 查询;更危险的是,当启用 $cfg['server']['auth_type'] = 'config' 且配置了 $cfg['servers'][$i]['socket'] 或 $cfg['servers'][$i]['port'] 异常值时,部分旧版本(4.9.x 及更早)可能误将主机名传给 gethostbyaddr() 或直接拼接 url 发起 http 请求——这是 ssrf 的入口。
关闭外链抓取的三个关键配置项
不是关一个开关就能解决,必须同步调整以下三项,缺一不可:
-
$cfg['Servers'][$i]['host']必须是 IP 地址(如"127.0.0.1"),禁止使用域名或"localhost"(它在某些系统上会走 socket 或触发 DNS) -
$cfg['Servers'][$i]['skip_connect']设为true,跳过连接前的任何预检(包括 DNS、端口探测) -
$cfg['Servers'][$i]['ssl']若不使用 HTTPS,确保设为false;若设为true却没配证书,phpMyAdmin 可能 fallback 到非预期的 HTTP 探测逻辑
检查是否还有残留的 SSRF 路径
即使改了配置,以下地方仍可能触发外链请求:
- 启用
$cfg['ShowDatabasesCommand']并自定义 SQL 命令时,若语句里拼接了用户可控的 hostname,会被执行 - 使用
mysqli_real_connect()底层连接时,若$cfg['Servers'][$i]['host']是变量且未严格过滤,PHP 的 mysqli 扩展会自动尝试解析 - phpMyAdmin 4.8+ 引入了
curl用于检查更新($cfg['CheckConfigurationPermissions'] = true),需设为false并删掉config.inc.php中所有含curl_或file_get_contents的自定义钩子
验证关闭是否生效
别只看界面是否正常——得抓包确认没有出站请求:
- 启动 phpMyAdmin 前,在终端运行
sudo tcpdump -i lo port not 80 and port not 443 and port not 3306(仅监听回环接口上的非常规端口) - 登录、切换数据库、执行简单
SELECT 1,观察 tcpdump 是否输出任何SYN包指向非127.0.0.1或非 MySQL 端口 - 特别注意:如果服务器装了 SELinux 或 AppArmor,
php-fpm进程被限制网络能力,反而会让 SSRF 表现为静默失败而非报错,此时要查ausearch -m avc -ts recent
真正麻烦的不是配置项本身,而是 phpMyAdmin 把“连接校验”“DNS 解析”“HTTP 检查”分散在初始化、认证、SQL 执行多个阶段,只要漏掉一处,就可能让 SSRF 在某个特定操作路径里复活。
立即学习“PHP免费学习笔记(深入)”;



















