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:
<Directory "/path/to/phpmyadmin/setup"> Require all denied </Directory> - 最简单但有风险的方式:删除整个
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 意外放行 —— 这一点,在混合架构里最容易漏。


















