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攻击
  • 严重等级: 高危

漏洞分析

官方修复分析

官方修复主要涉及两个文件:

  1. /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']);
      }
      
  2. /templates/database/designer/database_tables.twig:

    • 删除了|raw过滤器
    • 修复前: {{ designerTable.getTableName()|raw }}
    • 修复后: {{ designerTable.getTableName() }}

漏洞触发路径

  1. 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'
      
  2. 过滤机制:

    • 使用了mysql_real_escape_string()进行过滤
    • 理论上可以防止SQL注入
    • 但存在宽字节注入的可能性(需要GBK编码环境)

实际漏洞验证

  1. SQL注入尝试:

    • 使用payload: %df%27
    • 发现无法成功闭合单引号
    • 原因: phpMyAdmin默认使用utf8mb4编码,而非GBK编码
    • 导致宽字节注入无法实现
  2. XSS漏洞验证:

    • 使用payload: <script>alert(0)</script>
    • 在修复前版本中成功触发XSS
    • 修复后版本中会被转义为实体字符

漏洞修复

  1. 前端修复:

    • 删除了Twig模板中的|raw过滤器
    • 防止HTML/JavaScript代码直接执行
  2. 后端修复:

    • 加强了参数过滤
    • 确保所有用户输入都经过适当转义

技术细节

Twig模板的raw过滤器

  • 作用: 使数据在autoescape过滤器里失效
  • 危险: 允许原始HTML/JS代码输出
  • 示例:
    {{ designerTable.getTableName()|raw }}  <!-- 危险 -->
    {{ designerTable.getTableName() }}      <!-- 安全 -->
    

相关CVE

  • CVE-2019-11768: 类似问题,也是XSS漏洞而非SQL注入

总结

  1. 官方公告中描述的SQL注入漏洞在实际环境中难以利用
  2. 实际存在的安全问题是XSS漏洞
  3. 修复措施主要针对前端显示安全
  4. 建议所有phpMyAdmin用户升级到4.9.2或更高版本

参考链接

  1. 官方修复commit
  2. 相关技术讨论
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 关键代码: /templates/database/designer/database_ tables.twig : 删除了 |raw 过滤器 修复前: {{ designerTable.getTableName()|raw }} 修复后: {{ designerTable.getTableName() }} 漏洞触发路径 SQL注入路径 : 参数传递到 getTablesInfo() 函数 调用链: getTablesInfo() → getDisplayField() → 执行SQL查询 关键SQL查询: 以及: 过滤机制 : 使用了 mysql_real_escape_string() 进行过滤 理论上可以防止SQL注入 但存在宽字节注入的可能性(需要GBK编码环境) 实际漏洞验证 SQL注入尝试 : 使用payload: %df%27 发现无法成功闭合单引号 原因: phpMyAdmin默认使用 utf8mb4 编码,而非GBK编码 导致宽字节注入无法实现 XSS漏洞验证 : 使用payload: <script>alert(0)</script> 在修复前版本中成功触发XSS 修复后版本中会被转义为实体字符 漏洞修复 前端修复 : 删除了Twig模板中的 |raw 过滤器 防止HTML/JavaScript代码直接执行 后端修复 : 加强了参数过滤 确保所有用户输入都经过适当转义 技术细节 Twig模板的 raw 过滤器 作用: 使数据在 autoescape 过滤器里失效 危险: 允许原始HTML/JS代码输出 示例: 相关CVE CVE-2019-11768 : 类似问题,也是XSS漏洞而非SQL注入 总结 官方公告中描述的SQL注入漏洞在实际环境中难以利用 实际存在的安全问题是XSS漏洞 修复措施主要针对前端显示安全 建议所有phpMyAdmin用户升级到4.9.2或更高版本 参考链接 官方修复commit 相关技术讨论