phpMyAdmin版本≤5.2.1或≤5.1.4且存在弱密钥或默认blowfish_secret生成逻辑时,易遭CVE-2023-50741等漏洞链式利用导致RCE;升级须彻底替换文件、重配session路径、禁用auto_start、适配Web服务器路由规则并验证高频功能。
phpMyAdmin 版本过低会直接导致 RCE 漏洞被利用
2023 年后公开的多个 cve-2023-50741、cve-2024-27298 等漏洞,都允许未授权攻击者通过构造恶意请求触发远程代码执行。关键点在于:只要 phpmyadmin 版本 ≤ 5.2.1 或 ≤ 5.1.4(具体取决于分支),且启用了默认配置中的 blowfish_secret 自动生成逻辑或存在弱密钥,就极可能被链式利用。
实操建议:
- 立即运行
SELECT @@version;查 MySQL 版本只是辅助,真正要查的是 phpMyAdmin 自身版本 —— 登录后看右下角小字,或访问/phpmyadmin/CHANGELOG.php(若未被删) - 不要依赖「没开外网」就心安:内网横向移动中,phpMyAdmin 常是跳板;Docker 容器里暴露到宿主机端口也算“可访问”
- 升级前必须确认 PHP 版本兼容性:phpMyAdmin 5.2.x 要求 PHP ≥ 7.4;6.0.x(当前稳定版)强制要求 PHP ≥ 8.1
升级不是覆盖文件夹,而是彻底替换 + 清理残留配置
很多人把新包解压后直接覆盖旧目录,结果保留了旧版 config.inc.php 中已废弃的配置项(如 $cfg['Servers'][$i]['auth_type'] = 'http'; 在新版中已被弃用),导致登录页白屏或无限重定向。
实操建议:
- 备份原
config.inc.php,但不要直接复用 —— 先用新版自带的setup/向导生成最小可用配置,再逐条比对迁移自定义项(比如$cfg['blowfish_secret']必须保留,但$cfg['SaveDir']若未设则应显式注释掉 - 删除旧版遗留路径:
libraries/vendor_config.php、tmp/目录、以及任何以.php~或.swp结尾的编辑器临时文件(这些曾被用于 CVE-2022-44898 的 LFI 利用链) - 检查 Web 服务器权限:确保
config.inc.php不可被 Web 访问(Nginx 需加location ~ ^/(config|libraries|setup)/ { deny all; })
升级后必须验证 session 存储方式是否被绕过
新版 phpMyAdmin 默认改用 PHP 原生 session(session.save_handler = files),但如果服务器全局配置了 session.save_path 指向可写共享目录(如 /tmp),攻击者仍可通过竞争条件写入恶意 session 文件,再通过 index.php?target=db_sql.php 类路径参数触发反序列化。
实操建议:
- 在
config.inc.php中显式设置独立 session 路径:$cfg['SessionSavePath'] = '/var/lib/phpmyadmin/sessions';,并确保该目录仅由 Web 用户可读写 - 禁用危险的 session.auto_start:在 PHP 配置中确认
session.auto_start = 0,否则 phpMyAdmin 的 session 初始化逻辑会被跳过 - 测试是否生效:登录后查看
$_SESSION写入的实际路径(用session_save_path()函数验证),别只信配置文件里的值
别忽略 Nginx/Apache 的 rewrite 规则兼容性变化
phpMyAdmin 6.0 开始默认启用前端路由(Vue Router history 模式),如果 Web 服务器没配好 fallback,所有非根路径请求(如 /phpmyadmin/table/sql)会返回 404,而非正确加载 JS 应用。
实操建议:
- Nginx 用户必须添加:
location /phpmyadmin/ { try_files $uri $uri/ /phpmyadmin/index.php?$args; },注意末尾斜杠和index.php路径需与实际部署位置一致 - Apache 用户检查
.htaccess是否被禁用;若用AllowOverride None,需手动在虚拟主机配置中加入RewriteRule ^(.*)$ index.php [QSA,L] - 验证方法:打开浏览器开发者工具 → Network 标签 → 刷新页面,确认所有 JS/CSS 请求返回 200,而不是一堆 404
真正的难点不在下载新包,而在于旧配置里那些没文档说明的隐式依赖 —— 比如某个插件目录被硬编码进 vendor/autoload.php,或者自定义主题里调用了已移除的 PMA\libraries\Core::getenv() 方法。升级前最好先在测试环境跑一遍 SQL 导入/导出、用户权限修改、视图创建等高频操作。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











