K3ysTr0K3R/CVE-2012-2122
GitHub: K3ysTr0K3R/CVE-2012-2122
该工具是针对 MySQL CVE-2012-2122 身份验证绕过漏洞的 Python 利用脚本,通过反复尝试登录触发比较错误从而在无需密码的情况下获取访问权限。
Stars: 0 | Forks: 0
# CVE-2012-2122 - MySQL 身份验证绕过
**CVE-2012-2122** 是在 MySQL 密码验证逻辑中发现的一个身份验证绕过漏洞。
由于整数强制转换/比较错误,当无效密码的比较在特定条件下被判定为相等时,身份验证可能会错误地通过。
攻击者无需知道有效密码,而是可以通过不断使用任意密码尝试身份验证,直到触发比较错误。
成功的概率大约为:
- **每 256 次身份验证尝试中有 1 次(0.39%)**
由于这个相对较高的概率,自动化工具通常可以在几百次登录尝试内绕过身份验证。
## 严重程度
| 指标 | 值 |
|---------|------|
| CVE | CVE-2012-2122 |
| CVSS v2 | 7.5(高) |
| 攻击途径 | 网络 |
| 身份验证 | 无 |
| 用户交互 | 无 |
| 影响 | 身份验证绕过 |
## 受影响的版本
该漏洞影响使用易受攻击的编译器优化编译的 MySQL 版本,包括以下版本:
- MySQL 5.1.x
- MySQL 5.5.x
- 一些衍生自易受攻击代码的 MariaDB 版本
此问题主要影响那些编译器行为暴露了该错误的 Linux 发行版。
并非所有这些版本的安装都容易受到攻击。
## 技术细节
在密码验证期间,MySQL 内部使用 `memcmp()` 函数比较两个哈希值。
在正常情况下:
```
memcmp(hash1, hash2)
```
返回:
- 相等时返回 `0`
- 不相等时返回非零值
产生该漏洞的原因是,返回值被存储在一个有符号整数中,并在随后进行的类型转换过程中,导致某些非零值被错误地解释为身份验证成功。
简化后的逻辑如下:
```
if (memcmp(hash1, hash2) == 0)
{
// Login successful
}
```
在易受攻击的编译器行为下,`memcmp()` 返回的特定值可能会错误地通过验证。
因此,错误的密码偶尔也能成功通过身份验证。
## 漏洞利用
攻击者只需要:
- 访问 MySQL 服务的网络权限
- 一个有效的用户名
无需知道密码。
攻击者不断使用随机密码提交登录尝试。
最终,由于比较错误,某次身份验证会成功。
典型的攻击流程:
```
Attempt #1
↓
Authentication Failed
Attempt #57
↓
Authentication Failed
Attempt #141
↓
Authentication Failed
Attempt #237
↓
Authentication Successful
```
平均每 256 次尝试大约会成功一次。
## 影响
成功利用此漏洞可以让攻击者:
- 在没有正确密码的情况下通过身份验证
- 访问数据库内容
- 导出敏感信息
- 修改记录
- 创建或删除数据库
- 进一步对依赖 MySQL 的应用程序发起攻击
如果攻击目标具有管理员凭据,则可能会获得对数据库服务器的完全控制权。
## 检测
检测指标包括:
- 大量失败的身份验证尝试
- 同一客户端的快速重复登录
- 多次失败后成功的身份验证
- 异常的数据库访问模式
检查 MySQL 身份验证日志中是否存在过多的失败登录活动。
## 缓解措施
建议的缓解措施是升级到已修复该漏洞的版本。
其他防御措施包括:
- 限制 MySQL 的网络暴露
- 使用防火墙限制访问
- 禁用远程 root 登录
- 实施最小权限的数据库账户原则
- 监控身份验证日志以发现暴力破解行为
- 尽可能要求通过 VPN 或内部网络进行访问
## 参考
- CVE-2012-2122
- Oracle MySQL 安全公告
- MariaDB 安全公告
- NVD(美国国家漏洞数据库)
```
---
## 示例用法
```bash
python3 exploit.py -ip
```
示例:
```
python3 exploit.py -ip 192.168.1.100
```
## 教育目的
本仓库演示了身份验证逻辑中一个微妙的实现错误是如何完全破坏密码验证的。
尽管该漏洞已有十多年的历史,但它仍然是以下方面的重要案例研究:
- 安全软件开发
- 依赖于编译器的行为
- 身份验证设计
- 防御性编程
- 漏洞研究
标签:Maven, 漏洞验证, 身份认证绕过, 逆向工具