跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

如何禁用phpMyAdmin的Setup安装向导目录_防重新配置漏洞

phpMyAdmin 的 setup 目录必须禁用,因其是可写可执行的配置向导,暴露后攻击者可重置 root 密码、篡改认证方式或注入恶意配置,已有公开 PoC 批量利用;需通过 Web 服务器层(而非仅删目录或改权限)彻底拦截访问。 为什么 phpMyAdmin 的
setup
目录必须禁用 因为
setup
是一个可写入、可执行的配置向导,只要路径暴露且 web 服务器未限制访问,攻击者就能直接打开它,重置 root 密码、修改认证方式、甚至写入恶意配置。这不是“可能被利用”,而是已有公开 poc 利用该入口批量入侵共享主机上的 phpmyadmin 实例。 常见错误现象:
https://your-site.com/phpmyadmin/setup/
能正常打开页面,显示“Welcome to phpMyAdmin Setup”;或者 Nginx/Apache 日志里反复出现对
/phpmyadmin/setup/
的 GET 请求 —— 这说明它还活着,且正在被扫描。 默认安装后,
setup
目录不会自动删除,也不会自动禁止访问 某些一键包(如 XAMPP、AMPPS)甚至默认开启该目录的 PHP 执行权限 仅靠改名或 chmod 644 不可靠:Web 服务器仍可能通过别名或解析漏洞执行其中的
index.php
Apache 下彻底屏蔽
setup
目录的三种方式(选其一) 核心原则:不是不让用户看到 404,而是让服务器根本拒绝处理该路径下的任何请求,包括 OPTIONS、HEAD 和带查询参数的 GET。 推荐方式:在 phpMyAdmin 主目录的
.htaccess
中添加(确保
AllowOverride All
已启用):
RewriteEngine On RewriteRule ^setup(/.*)?$ - [R=404,L]
更严格方式(推荐用于生产):在虚拟主机配置中直接拒绝,不依赖 .htaccess:
Require all denied
最简单但有风险的方式:删除整个
setup
目录 —— 注意确认你不需要后续手动调整
config.inc.php
,否则改错后无法回退到向导界面 Nginx 下禁止访问
setup
的正确写法 Nginx 没有 .htaccess 机制,所有规则必须写在 server 块内,且 location 匹配顺序敏感。错写成
location /setup
或漏掉
=
会导致规则失效或误杀其他路径。 必须使用精确匹配(
=
),防止路径穿越或前缀混淆:
location = /phpmyadmin/setup { return 404; }
如果 phpMyAdmin 安装在子路径(如
/pma
),请同步调整:
location = /pma/setup { return 404; }
不要用
deny all
—— Nginx 不支持该指令;也不要只屏蔽
index.php
,攻击者可直接请求
/setup/lib/common.inc.php
触发解析 检查是否真生效:别信浏览器 404,要看响应头和日志 很多管理员点开链接看到 404 就以为搞定了,但其实服务器仍在返回 200 + HTML 内容(比如由 phpMyAdmin 自身的路由兜底),只是前端没渲染出来。真正的屏蔽必须是 Web 服务器层拦截,不进 PHP。 立即学习 “ PHP免费学习笔记(深入) ”; 用 curl 验证:
curl -I https://your-site.com/phpmyadmin/setup/
,正确响应应含
HTTP/2 404
且无
Content-Type: text/html
检查 Web 服务器错误日志:Nginx 应出现
open() "/path/.../setup" failed (2: No such file or directory)
或明确记录 404;Apache 若用
Require all denied
,会记
client denied by server configuration
特别注意:某些 CDN 或反向代理(如 Cloudflare)可能缓存了旧的 200 响应,测试前清缓存或加随机查询参数绕过 真正麻烦的从来不是删掉一个目录,而是确认 Web 服务器配置已接管该路径,且没有被上层代理、别名规则或 fastcgi_pass 意外放行 —— 这一点,在混合架构里最容易漏。

相关文章