phpmyadmin 2.11.x(早于2.11.9.5)、3.x(早于3.1.3.1)及v3.5.2.2存在setup.php反序列化漏洞,需彻底删除config/与setup.php、屏蔽/scripts/路径、改用手动配置,否则残留文件或可写目录仍可被利用。
phpmyadmin 的反序列化漏洞不是“操作不当”导致的,而是旧版本代码逻辑缺陷本身存在的攻击面;防御核心是彻底弃用有风险的版本 + 切断 setup.php 入口 + 隔离配置生成流程。
哪些版本的 scripts/setup.php 存在反序列化漏洞
明确受影响范围,避免误判“已加固”:
-
phpMyAdmin 2.11.x(早于2.11.9.5)和3.x(早于3.1.3.1)中,scripts/setup.php会直接反序列化 POST 参数configuration,且未校验类名或数据来源 -
phpMyAdmin v3.5.2.2存在CVE-2018-12613,同样因setup.php反序列化构造对象触发任意代码执行 - 漏洞利用前提是:
/config/目录未被删除(向导模式安装残留),且setup.php仍可被 Web 访问
为什么简单禁用 unserialize() 不解决问题
这不是 PHP 层面开关能关掉的——漏洞在 phpMyAdmin 自身逻辑里,setup.php 里硬编码调用了 unserialize(),且传入的数据完全来自用户 POST:
- 你无法通过
php.ini禁用unserialize(),因为它是合法函数,禁用会导致整个 PHP 运行环境崩溃 - 试图用
__autoload或spl_autoload_register()拦截恶意类加载,对旧版 phpMyAdmin 无效——它用的是class_exists()+ 直接实例化,不走自动加载 - 真正起作用的是:让
setup.php根本不运行,或让它读不到攻击 payload
必须做的三件事:删、堵、移
防御不是加一层过滤,而是物理消除攻击路径:
-
删:升级后立即
rm -rf /path/to/phpmyadmin/config/和/path/to/phpmyadmin/scripts/setup.php。别只改权限,攻击者可能绕过deny规则直接请求 -
堵:在 Web 服务器层彻底屏蔽入口。Nginx 示例:
location ~ ^/scripts/ { return 403; };Apache 示例:Redirect 404 /scripts/ -
移:新版(≥5.2.x)已废弃
setup.php向导,配置必须手动编辑config.inc.php。不要复用旧配置,尤其不能保留$cfg['Servers'][$i]['auth_type'] = 'http'这类已被移除的选项,否则登录页直接 500
升级后仍要检查的两个隐蔽点
很多人以为覆盖文件就万事大吉,但这两个地方最容易漏掉,且直接导致漏洞复现:
-
config.inc.php中若还存在$cfg['SaveDir']或$cfg['TempDir']指向 Web 可写目录(如/tmp),攻击者可通过 LFI + session 伪造再次触发反序列化链 - PHP 的
session.save_path若全局设为/tmp,而 phpMyAdmin 又没显式设置$cfg['SessionSavePath'],攻击者可竞争写入恶意 session 文件,再通过index.php?target=...类参数触发反序列化
真正的防御不在代码里加 if 判断,而在让攻击者根本找不到那条能走通的反序列化路径。删文件、堵 URL、换配置方式,三者缺一不可。任何残留的 setup.php 或可写 config/ 目录,都是把钥匙留在门锁上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











