PHPmyadmin SQL injection in Designer feature 研究(CVE-2019-18622)
字数 1150 2025-08-26 22:11:40
PHPMyAdmin SQL Injection in Designer Feature (CVE-2019-18622) 分析报告
漏洞概述
- CVE编号: CVE-2019-18622
- 影响版本: phpMyAdmin 4.9.2之前版本,至少影响至4.7.7
- 漏洞类型: 设计器功能中的SQL注入/XSS漏洞
- 漏洞描述: 攻击者可以通过精心设计的数据库名或表名,在设计器功能中触发SQL注入攻击或XSS攻击
- 严重等级: 高危
漏洞分析
官方修复分析
官方修复主要涉及两个文件:
-
/js/designer/move.js:
- 修改了取值方式,最终值通过POST方式提交到db_desingner.php
- 关键代码:
if (isset($_POST['dialog'])) { // ... } elseif ($_POST['dialog'] == 'add_table') { $script_display_field = $designerCommon->getTablesInfo($_POST['db'], $_POST['table']); }
-
/templates/database/designer/database_tables.twig:
- 删除了
|raw过滤器 - 修复前:
{{ designerTable.getTableName()|raw }} - 修复后:
{{ designerTable.getTableName() }}
- 删除了
漏洞触发路径
-
SQL注入路径:
- 参数传递到
getTablesInfo()函数 - 调用链:
getTablesInfo()→getDisplayField()→ 执行SQL查询 - 关键SQL查询:
SELECT `display_field` FROM ... WHERE `db_name`='[db]' AND `table_name`='[table]' - 以及:
SELECT * FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA` = 'day1' AND `TABLE_NAME` = '$table_name'
- 参数传递到
-
过滤机制:
- 使用了
mysql_real_escape_string()进行过滤 - 理论上可以防止SQL注入
- 但存在宽字节注入的可能性(需要GBK编码环境)
- 使用了
实际漏洞验证
-
SQL注入尝试:
- 使用payload:
%df%27 - 发现无法成功闭合单引号
- 原因: phpMyAdmin默认使用
utf8mb4编码,而非GBK编码 - 导致宽字节注入无法实现
- 使用payload:
-
XSS漏洞验证:
- 使用payload:
<script>alert(0)</script> - 在修复前版本中成功触发XSS
- 修复后版本中会被转义为实体字符
- 使用payload:
漏洞修复
-
前端修复:
- 删除了Twig模板中的
|raw过滤器 - 防止HTML/JavaScript代码直接执行
- 删除了Twig模板中的
-
后端修复:
- 加强了参数过滤
- 确保所有用户输入都经过适当转义
技术细节
Twig模板的raw过滤器
- 作用: 使数据在
autoescape过滤器里失效 - 危险: 允许原始HTML/JS代码输出
- 示例:
{{ designerTable.getTableName()|raw }} <!-- 危险 --> {{ designerTable.getTableName() }} <!-- 安全 -->
相关CVE
- CVE-2019-11768: 类似问题,也是XSS漏洞而非SQL注入
总结
- 官方公告中描述的SQL注入漏洞在实际环境中难以利用
- 实际存在的安全问题是XSS漏洞
- 修复措施主要针对前端显示安全
- 建议所有phpMyAdmin用户升级到4.9.2或更高版本