phpmyadmin本身不调用exec/system等函数,故不会直接触发命令注入;其风险源于sql注入结合mysql高权限(如file)导致的任意文件写入与webshell执行链。
phpmyadmin 本身不执行系统命令,所以它不会直接触发 php 的 exec、shell_exec 类命令注入漏洞;但攻击者可能通过 sql 注入 + mysql 特性(如 select ... into outfile、load data infile)间接写入 webshell,再由 web 服务器解析执行——这常被误称为“命令注入”,实则是**sql 注入导致的任意文件写入+代码执行链**。
为什么 phpMyAdmin 不该出现 exec/system 类命令注入
phpMyAdmin 的核心逻辑是构造 SQL 查询并交由 MySQL 执行,所有后端 PHP 代码都避开 exec、system、passthru、proc_open 等函数调用。它的危险入口从来不是“调用 shell”,而是:
- 用户可控输入拼接到 SQL 字符串中(如
tbl_select.php?where_clause=...) - MySQL 用户拥有高权限(如
FILE、SELECT、INSERT),且 Web 目录可写 - phpMyAdmin 配置开启高危功能(如
$cfg['UploadDir']、$cfg['SaveDir'])
所以防范重点不是“过滤 shell 字符”,而是切断 SQL 注入 → 文件写入 → PHP 解析 这条链。
堵住 SQL 注入到文件写入的关键配置
从 5.x 开始,phpMyAdmin 对导出、导入、查询构造等环节做了白名单校验,但前提是配置生效:
-
$cfg['UploadDir'] = ''和$cfg['SaveDir'] = ''必须显式设为空字符串,否则攻击者可通过import.php上传恶意 SQL 或利用export.php写入 PHP 文件 -
$cfg['Servers'][$i]['DisableIS'] = true关闭INFORMATION_SCHEMA查询,减少元数据泄露,避免辅助构造注入 payload -
$cfg['AllowArbitraryServer'] = false防止 SSRF + 服务端请求伪造,这是早期版本被用于跳转到内网 MySQL 实例的入口 - 确保
config.inc.php中没有遗留$cfg['SaveDir'] = '/var/www/html/upload'这类路径——哪怕目录不存在,phpMyAdmin 也可能在报错时暴露路径结构
MySQL 权限层必须限制 FILE 和 SUPER
即使 phpMyAdmin 配置正确,若数据库用户权限过大,攻击者仍可能绕过前端限制:
- 禁用普通用户的
FILE权限:REVOKE FILE ON *.* FROM 'appuser'@'%'; - 避免使用
root登录 phpMyAdmin;为运维人员创建独立账号,仅授予SELECT、UPDATE、INSERT等必要权限 - 检查
secure_file_priv变量:SELECT @@secure_file_priv;。若返回非空路径(如/var/lib/mysql-files/),则INTO OUTFILE只能写入该目录,且该目录不应被 Web 服务器解析 - 生产环境禁用
local_infile:SET GLOBAL local_infile = OFF;,并在 MySQL 启动参数中添加--local-infile=0
导出 CSV/JSON 时字段名未过滤的 CVE-2020-22278 怎么防
这个漏洞本质是:攻击者控制导出字段名,注入 HTML/JS,再配合 XSS 触发后续攻击。虽不直接导致命令执行,但可能成为跳板:
- 升级到 phpMyAdmin 5.0.4+ 或 4.9.7+,该版本在
export.php中对字段名强制使用htmlspecialchars()并限制字符集为字母、数字、下划线 - 如果无法升级,临时禁用导出功能:
$cfg['Export']['disable'] = true; - 注意:该漏洞需配合 XSS 或其他上下文才能进一步利用,单独存在时不构成 RCE,但不可忽视
真正容易被忽略的是配置变更后没重启 Web 服务,或升级时只覆盖了 PHP 文件却漏改 config.inc.php——安全机制不会自动生效,每一条 $cfg[...] 都得手动确认、保存、重启。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











