如果想彻底关闭 import.php 的上传入口,建议采用多层安全防护方案:可以直接注释或删除 import.php 文件;在 config.inc.php 中设置 $cfg['AllowArbitraryServer'] = false;同时在 Web 服务器层面阻断 PHP 等可执行文件的解析;将 themes/ 目录权限锁定为 555;并进一步禁用 PHP 危险函数、关闭 PHP 引擎,从源头降低 phpMyAdmin 任意文件上传攻击风险。

关闭 import.php 的文件上传入口
在 phpMyAdmin 安全防护中,import.php 一直是任意文件上传漏洞的高风险入口。虽然它本身不会直接执行代码,但如果服务端存在解析漏洞,例如 Nginx 文件名解析绕过、Apache 的 .htaccess 注入等情况,攻击者上传的恶意 SQL 文件或 PHP 文件,就可能被 Web 服务器当作脚本执行。因此,防护重点不只是“禁止上传”,而是彻底切断上传文件被访问、被解析、被执行的路径:
- 在
config.inc.php中明确关闭相关风险入口:$cfg['AllowArbitraryServer'] = false;(虽然不能直接关闭 import,但可有效避免服务器枚举与弱口令爆破组合攻击) - 直接注释或删除
import.php文件本身(这是最彻底的处理方式);如果业务上必须保留,请确认其依赖的libraries/classes/Import/目录下不存在可写子目录 - 检查
upload_tmp_dir是否设置为 Web 无法直接访问的路径(例如/var/tmp/phpmyadmin/),并确保该目录权限为700、属主为 Web 服务进程用户
Web 服务器层拦截上传文件的执行权限
即使攻击者绕过了 phpMyAdmin 前端限制,把 shell.php 上传到临时目录,只要 Web 服务器不解析、不执行该文件,就无法进一步形成 RCE(远程代码执行)。这也是防止任意文件上传攻击中最关键、最有效的最后一道硬防线:
- Apache:可在 phpMyAdmin 目录配置中加入:
Require all denied - Nginx:可在
server块中添加如下location规则:location ~ ^/phpmyadmin/.*.(php|phtml|phar|pl|py|sh|cgi|exe)$ {需要特别注意,路径前缀必须与实际部署 URL 保持一致,例如
return 403;
}/pma/或/db-admin/ - 确认上传目录(如
/tmp或upload/)**不在任何location ~ .php$匹配范围内**,并确保其父目录没有启用autoindex on
禁用 PHP 的危险函数与运行时加固
一旦上传后的恶意文件被成功解析,system()、exec() 等 PHP 危险函数往往就是攻击者执行命令、提权利用的核心工具。仅依赖 disable_functions 还不够,更稳妥的做法是从 PHP 运行环境层面进行多重加固:
- 在
php.ini中设置:disable_functions = system,exec,passthru,shell_exec,proc_open,popen,pcntl_exec(注意修改后必须重启 PHP-FPM 或 Apache 才会生效) - 在 Apache 虚拟主机配置中加入
php_admin_flag engine off,对 phpMyAdmin 所在目录彻底关闭 PHP 引擎解析能力 - 确保
open_basedir严格限制在 phpMyAdmin 自身目录以及必要的/tmp路径内,避免跨目录访问敏感文件 - 检查是否已启用
allow_url_include = Off和allow_url_fopen = Off,从而降低远程文件包含攻击带来的风险
清理与锁定 phpMyAdmin 的可写路径
在任意文件上传攻击链中,攻击者上传文件后通常还需要一个可以“落地”的可写目录,用于持久化控制,例如覆盖 themes/ 下的 PHP 模板文件,或者尝试写入 config.inc.php。因此,对 phpMyAdmin 可写路径进行清理和权限锁定同样非常关键:
- 将
themes/目录权限设置为555(只读+执行),并仅保留themes/default/,删除其他不必要的主题子目录(如pmahomme) - 确保
config.inc.php文件属主为 root,权限为644,禁止 Web 服务进程写入 - 删除或重命名
setup/目录(该目录包含配置生成器,历史上属于 RCE 漏洞高发区域) - 检查
tmp/、cache/、libraries/vendor/中是否存在可写的.php文件(例如旧版本 composer 的autoload.php相关风险)
Require all denied;相比 phpMyAdmin 内部的 $cfg 设置,这类服务器层面的防护通常更直接、更可靠。