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免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











