開發 MySQL 雜湊庫時遇到的引用傳遞、密碼加密演算法與權限繞過問題,記錄探索過程與核心知識點。
| 版本 | 函數 | 演算法 | 範例輸出 |
|---|---|---|---|
| ≤ 4.0 | OLD_PASSWORD() | MySQL323 (雙重 SHA1 簡化版) | 5d2e19393cc5ef67 |
| ≥ 4.1 | PASSWORD() | MySQL SHA1 (SHA1(SHA1(password))) | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
可直接在 SQL 執行驗證:
SELECT OLD_PASSWORD('password');
SELECT PASSWORD('password');
PHP 5+ 物件預設引用傳遞,陣列/標量需顯式 &:
function process(&$data) {
$data['processed'] = true;
}
$arr = [];
process($arr); // $arr 被修改
PDO/MySQLi 預處理語句綁定參數時需注意引用:
$stmt = $pdo->prepare("INSERT INTO users (name, pwd_hash) VALUES (?, ?)");
$name = 'test';
$hash = '*ABC...'; // PASSWORD() 結果
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $hash); // 必須是變數,不能直接放表達式
$stmt->execute();
若 /var/lib/mysql/mysql/user.MYD 可讀,root 雜湊可被直接提取:
strings /var/lib/mysql/mysql/user.MYD | grep -A1 root
防護措施:
chown -R mysql:mysql /var/lib/mysql && chmod 750 /var/lib/mysqlskip_show_database 限制資料庫列舉PASSWORD() 結果作為查找鍵,支援常見弱密碼快速比對OLD_PASSWORD() 兼容舊版本INSERT ... VALUES (...), (...) 多值語法提升效能資料庫安全不僅在於加密演算法,更在於最小權限原則、目錄權限管控與審計日誌完整性。開發工具時切勿忽視防禦面建設。