$cfg['AllowArbitraryServer'] = true 是 phpMyAdmin 中允许用户登录时手动输入任意 MySQL 服务器地址的危险配置,默认为 false;设为 true 后,攻击者可连接恶意服务器触发任意文件读取或远程代码执行,必须在 config.inc.php 中显式设为 false 并清除动态 host 赋值。
因为开启 $cfg['allowarbitraryserver'] = true 会让 phpmyadmin 放弃校验服务器来源,把「连接哪个 mysql 实例」的控制权完全交给用户输入或 http 请求参数——攻击者借此可跳转到恶意服务器、触发任意文件读取、甚至远程代码执行。
AllowArbitraryServer 是什么,它在哪起作用
这是一个 config.inc.php 中的全局开关,默认为 false。当设为 true 时,phpMyAdmin 允许用户在登录页手动填写任意 host 和 port(比如 evil.com:3306),并直接用该地址建立 MySQL 连接。它不校验该域名是否在白名单内,也不检查 IP 是否本地可信。
关键影响点有三个:
- 登录表单和服务器选择页会暴露「手动输入 host」字段,等于主动提供攻击入口
- 导入/导出页面(
import.php、export.php)会将用户提交的server参数直接用于初始化 mysqli 连接,绕过所有配置约束 - 某些旧版(如 4.8.0–4.8.1)中,
index.php?target=的跳转逻辑会结合该选项绕过身份验证,导致未授权 RCE(CVE-2018-12613)
它如何被用来读取 phpMyAdmin 服务器上的任意文件
攻击者自己架设一个恶意 MySQL 服务(监听公网或内网某端口),并在其响应中伪造 LOAD DATA LOCAL INFILE 协议行为。当 phpMyAdmin 开启 AllowArbitraryServer 后,用户(或被诱导点击链接的管理员)连接该恶意服务,phpMyAdmin 客户端就会按协议尝试从本地(即 phpMyAdmin 所在服务器)读取指定路径文件(如 /etc/passwd、/var/www/html/config.inc.php)并上传给攻击者。
这个漏洞不要求用户密码正确,只要登录态有效(cookie 可用)即可触发。常见利用链:
立即学习“PHP免费学习笔记(深入)”;
- 钓鱼链接:
https://your-site.com/phpmyadmin/index.php?server=123&target=import.php(其中 server=123 指向恶意实例) - 配合 DNS rebinding:让
attacker.com解析到127.0.0.1,再诱导访问https://attacker.com/phpmyadmin/,此时$_SERVER['HTTP_HOST']被污染,若配置中又用了动态赋值(如$cfg['Servers'][$i]['host'] = $_SERVER['HTTP_HOST']),就自动连上本地 MySQL —— 但更危险的是,它同时打开了任意 server 连接通道
为什么不能只靠 Web 层拦截来补救
Web 服务器(Nginx/Apache)能拦请求路径、Host 头、遍历字符,但它拦不住合法登录后发来的「内部跳转」。例如:
- 用户已登录,浏览器发出 POST 到
/phpmyadmin/import.php,body 含server=evil.com - 该请求 Host 头是合法的(
localhost),URI 无..,状态码 200,Nginx 默认放行 - PHP 接收后,
import.php直接调用mysqli_connect($host, $user, $pass),而$host来自用户可控参数
换句话说:AllowArbitraryServer 把风险从「外部探测」升级为「内部信任滥用」。修复必须落在 phpMyAdmin 配置层——关掉它,并确保没有残留的动态 host 赋值逻辑。
最容易被忽略的一点:有些 Docker 镜像或一键安装包会默认打开 AllowArbitraryServer,且不提示;升级 phpMyAdmin 版本也不会自动关闭它——你得亲手去 config.inc.php 里确认并写死 false。



















