phpMyAdmin本身不是防注入工具,而是SQL操作前端界面,其大量使用mysqli_query()或PDO::query()直接执行拼接字符串,未强制参数化,用户可控输入(如URL、POST)若未经白名单校验或转义即进入SQL语句,极易引发高危注入。
phpmyadmin 本身不是“防注入”的工具,而是 sql 操作的前端界面——它不自动过滤、不强制参数化,所有用户输入最终都可能拼接到 mysql 查询中执行。
phpMyAdmin 的 SQL 执行机制本质是动态拼接
它内部大量使用 mysqli_query() 或 PDO::query() 直接执行字符串 SQL,而非预处理语句。比如导出功能、搜索功能、结构页的排序/筛选,底层代码常形如:
$sql = "SELECT * FROM `" . $table . "` WHERE " . $where_clause;
只要 $table 或 $where_clause 来自用户可控输入(URL 参数、POST 字段、cookie),且未经过严格白名单校验或转义,就构成注入面。
- CVE-2020-26935 就发生在
SearchController中对$_POST['criteria']的直接拼接 - CVE-2016-5703 根源是
central_columns.lib.php中未过滤的$db参数被带入SHOW COLUMNS FROM `{$db}`.`{$table}` - 即使你用最新版 phpMyAdmin,若后端 MySQL 开启了
local_infile或允许LOAD DATA INFILE,攻击者仍可通过注入触发文件读取
权限配置不当会放大注入危害
phpMyAdmin 默认连接数据库用的是一个「能执行几乎所有操作」的账号(比如 root 或有 ALL PRIVILEGES 的用户)。这意味着一旦注入成功,攻击者不是只能查数据,而是可以直接:
- 执行
SELECT ... INTO OUTFILE写 Webshell - 调用
UNION SELECT LOAD_FILE('/etc/passwd')读系统文件 - 运行
SELECT @@version_compile_os探测服务器环境 - 在支持 UDF 的场景下,注入
CREATE FUNCTION提权
这和应用层普通 SQL 注入不同:后者通常受限于业务账号权限;而 phpMyAdmin 账号权限往往等同于 DBA。
立即学习“PHP免费学习笔记(深入)”;
用户行为引入不可控输入路径
很多注入入口根本不在 phpMyAdmin 自身代码逻辑里,而是由使用者操作触发:
- 导入 SQL 文件时,文件内容被原样执行 —— 攻击者可上传含
SELECT 'a' UNION SELECT '<?php system($_GET[1]);?>' INTO DUMPFILE '/var/www/shell.php'的恶意 .sql - 使用「SQL 窗口」手动执行语句,输入即执行,无任何中间校验
- 通过「表结构」页编辑字段名/注释,这些字段名最终会进入
ALTER TABLE ... CHANGE COLUMN语句 - 拖放上传 .sql 文件触发 XSS 后,再结合浏览器 JS 构造跨域请求,间接发起注入
这类路径无法靠 phpMyAdmin 单方面修补,必须配合 Web 服务器层(如 Nginx 的 location ~ \.sql$ { deny all; })和运维策略共同封堵。
补丁滞后与部署惯性导致风险长期存在
截至 2026 年 7 月,仍有大量生产环境运行着 4.x 或 5.0.x 版本(尤其政企老旧系统),而 CVE-2020-22278、CVE-2020-26935 等关键漏洞仅在 5.1.0+ 才彻底修复。更麻烦的是:
- 升级 phpMyAdmin 常需同步更新 PHP 版本(如 5.2+ 要求 PHP ≥ 7.2),而旧系统不敢轻易动运行栈
- 很多单位把 phpMyAdmin 部署在内网但未设访问控制,员工用弱密码登录后,攻击者横向移动即可利用
- 配置文件
config.inc.php中若明文写入$cfg['Servers'][$i]['password'],一旦 Web 目录被列目录,密码即泄露
真正危险的从来不是「有没有漏洞」,而是「有没有人正在用带漏洞的版本做高权限操作」——这点比任何技术细节都难监控。



















