针对 CVE-2012-2122 的概念验证(PoC),这是一个影响易受攻击的 MySQL 和 MariaDB 服务器的严重认证绕过漏洞。
免责声明
本项目仅用于教育目的、安全研究和授权的渗透测试。请勿将此软件用于您不拥有或未经明确许可测试的系统。
CVE-2012-2122 是 MySQL 密码验证逻辑中发现的一个认证绕过漏洞。
由于整数转换/比较错误,在某些条件下,无效密码的比较结果可能被错误地判定为相等,从而导致认证意外成功。
攻击者无需知道有效密码,只需反复使用任意密码尝试认证,直到触发该比较错误。
成功的概率大约为:
由于此概率相对较高,自动化工具通常只需几百次登录尝试即可绕过认证。
| 指标 | 值 |
|---|---|
| CVE | CVE-2012-2122 |
| CVSS v2 | 7.5 (高) |
| 攻击向量 | 网络 |
| 认证 | 无 |
| 用户交互 | 无 |
| 影响 | 认证绕过 |
该漏洞影响编译时使用了易受攻击的编译器优化的 MySQL 构建,包括以下版本:
此问题主要影响那些编译器行为暴露了该错误的 Linux 发行版。
并非所有这些版本的安装都存在漏洞。
在密码验证过程中,MySQL 内部使用 memcmp() 函数比较两个哈希值。
正常情况:
memcmp(hash1, hash2)
返回:
0 相等时漏洞的产生原因是:返回值被存储在一个有符号整数中,随后在某些转换方式下,某些非零值被解释为认证成功。
简化逻辑:
if (memcmp(hash1, hash2) == 0)
{
// 登录成功
}
在易受攻击的编译器行为下,memcmp() 的特定返回值可能错误地满足比较条件。
因此,错误的密码偶尔也能成功认证。
攻击者只需要:
无需知道密码。
攻击者连续使用随机密码提交登录尝试。
最终,由于比较错误,某次认证会成功。
典型攻击流程:
Attempt #1
↓
认证失败
Attempt #57
↓
认证失败
Attempt #141
↓
认证失败
Attempt #237
↓
认证成功
平均每 256 次尝试成功一次。
成功利用允许攻击者:
如果攻击目标是管理凭据,则可能完全控制数据库服务器。
指标包括:
检查 MySQL 认证日志中是否存在过多的失败登录活动。
建议的缓解措施是升级到已修补的版本。
额外的防御措施包括:
---
## 使用示例
```bash
python3 exploit.py -ip <target>
示例:
python3 exploit.py -ip 192.168.1.100
此仓库演示了认证逻辑中一个微妙的实现缺陷如何彻底破坏密码验证。
尽管该漏洞已有十多年历史,它仍然是以下方面的重要案例研究: