必须从服务器层彻底阻断 /setup 路径处理,仅删目录或改权限无法防止攻击者利用解析漏洞执行PHP文件;Apache需用<Directory>精确拒绝,Nginx需用location = 精确匹配并返回404。
直接删掉 /setup 目录不保险,攻击者仍可能通过 web 服务器解析漏洞或残留配置访问其中的 php 文件(比如 /setup/lib/common.inc.php),必须从服务器层彻底阻断路径处理。
常见错误现象:https://your-site.com/phpmyadmin/setup/ 返回 404 但日志里仍有大量 GET 请求;或者页面打不开,却能用 curl 绕过直接请求 /setup/index.php?step=2 触发逻辑。这是因为:
chmod 644 或重命名只是让文件不可执行,但 Web 服务器仍可读取、返回源码(尤其当 php_flag engine off 未生效时)/setup 开启了 AllowOverride All,.htaccess 规则反而被绕过<Directory> 粗暴拒绝推荐写法(放入虚拟主机配置,非 .htaccess):
<Directory "/usr/share/phpmyadmin/setup"> Require all denied</Directory>
关键点:
ls -l /etc/apache2/conf-enabled/ 确认符号链接指向)Deny from all(旧版 Apache 语法,新版已废弃)RewriteRule 返回 404——它只拦 GET/POST,OPTIONS 或 HEAD 仍可能穿透location = 精确匹配错误写法:location /phpmyadmin/setup(前缀匹配,会误杀 /phpmyadmin/setup_xxx)或 location ~ ^/phpmyadmin/setup(正则开销大且易漏)
立即学习“PHP免费学习笔记(深入)”;
正确写法(放入 server 块内):
location = /phpmyadmin/setup { return 404;}location = /phpmyadmin/setup/ { return 404;}
注意:
/pma),必须同步改成 location = /pma/setup
deny all——Nginx 不支持该指令,配置会直接报错/phpmyadmin/setup/ 是为了拦截末尾带斜杠的请求,否则可能被自动重定向绕过如果你后续要手动调整 config.inc.php(比如新增多服务器配置、切换认证方式),删光 /setup 就只能靠手写或临时恢复备份。更稳妥的做法是:
sudo find /usr/share/phpmyadmin/setup -name "*.php" -delete
index.html(内容为 <h1>Disabled</h1>),既防扫描又留退路真正危险的不是目录存在,而是服务器还允许执行其中任意 PHP 脚本——这点最容易被忽略,也最常被 PoC 利用。