Window中MySQL繞過密碼登錄的底層原理詳解
1. 基本知識
在 MySQL 中,root 用戶的密碼存儲和認證機制隨著版本的升級發(fā)生了變化
繞過密碼登錄主要依賴于 --skip-grant-tables 選項,但這一過程涉及 MySQL 的用戶認證體系、權(quán)限管理以及數(shù)據(jù)庫安全策略
本文將詳細分析 MySQL 繞過密碼的底層原理,并解釋為什么某些操作在 --skip-grant-tables 模式下無效,以及如何正確生效修改
一、MySQL 用戶認證機制
MySQL 的用戶認證由以下幾個核心組件組成:
mysql.user 表:存儲用戶信息,如 user、host、authentication_string(MySQL 5.7+)
身份驗證插件(Authentication Plugin):MySQL 使用不同的插件來管理用戶登錄,例如:
mysql_native_password
caching_sha2_password(MySQL 8.0 默認)
sha256_password
權(quán)限系統(tǒng)(Privilege System):用于控制用戶在數(shù)據(jù)庫中的操作權(quán)限
當用戶登錄 MySQL 時,服務(wù)器會:
- 檢查 mysql.user 表,確認用戶名、主機匹配的賬號是否存在
- 調(diào)用身份驗證插件,使用 authentication_string 進行密碼驗證
- 檢查權(quán)限系統(tǒng),確定用戶的訪問權(quán)限
二、 --skip-grant-tables 繞過權(quán)限驗證
--skip-grant-tables
選項允許 MySQL 啟動時跳過權(quán)限系統(tǒng),這意味著:
MySQL 不會檢查用戶權(quán)限,所有用戶都可以直接訪問數(shù)據(jù)庫,由于 權(quán)限系統(tǒng)未啟用,某些 SQL 語句(如 ALTER USER)可能無法執(zhí)行,仍然需要 手動刷新權(quán)限(FLUSH PRIVILEGES;) 才能使修改生效
問題點:如果 FLUSH PRIVILEGES; 未執(zhí)行,MySQL 仍然會使用舊的用戶認證規(guī)則,導(dǎo)致密碼修改后仍然無法登錄
三、password() 函數(shù)被移除
在 MySQL 8.0 及以上版本中,password() 函數(shù)已被移除,所以UPDATE mysql.user SET password = PASSWORD('root') WHERE user = 'root';
會導(dǎo)致 語法錯誤
正確方式(適用于 MySQL 5.7 及以上):
UPDATE mysql.user SET authentication_string = '' WHERE user = 'root' AND host = 'localhost'; FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
注意:
authentication_string 取代了 password 字段;ALTER USER 是修改密碼的推薦方法
四、以管理員權(quán)限運行命令行
在 Windows 上,如果沒有以管理員身份運行 cmd,則可能遇到權(quán)限問題,導(dǎo)致 ALTER USER 操作失敗
五、 --skip-grant-tables 退出后密碼失效的原因
如果在 --skip-grant-tables 模式下修改了密碼,然后退出 MySQL 后密碼仍然無效,可能的原因有:
沒有執(zhí)行 FLUSH PRIVILEGES;,導(dǎo)致修改未生效
MySQL 仍然使用緩存,未完全刷新認證信息
未使用 ALTER USER,仍然在 mysql.user 直接修改 authentication_string,但沒有正確同步
MySQL 版本不同,認證機制發(fā)生變化,導(dǎo)致密碼修改失敗
解決方案:
- 確保 FLUSH PRIVILEGES; 執(zhí)行成功。
- 直接使用 ALTER USER 而不是 UPDATE mysql.user。
- 重啟 MySQL 以清除緩存
2. 實戰(zhàn)Demo
以實戰(zhàn)Demo進行演示
cmd窗口一定要管理員權(quán)限
cmd窗口一定要管理員權(quán)限
cmd窗口一定要管理員權(quán)限
開啟跳過密碼登錄:mysqld --console --skip-grant-tables --shared-memory
(此窗口勿關(guān)閉)
后續(xù)在另外一個窗口cmd管理員,輸入如下:
直接登錄,跳過密碼:mysql -u root -p
鏈接數(shù)據(jù)庫:USE mysql;
如果是 MySQL 5.7 及以上(包括 MySQL 8.0),請執(zhí)行:
UPDATE mysql.user SET authentication_string = '' WHERE user = 'root' AND host = 'localhost'; FLUSH PRIVILEGES;
然后再執(zhí)行:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
注意:這里 authentication_string 字段在 MySQL 5.7 及以上版本中取代了 password 字段
別忘記刷新權(quán)限以及退出:
FLUSH PRIVILEGES; quit;
總體截圖如下:
先關(guān)閉 MySQL 服務(wù)器:net stop mysql
然后重新啟動:net start mysql
重新登錄 MySQL:mysql -u root -p
到此這篇關(guān)于Window中MySQL繞過密碼登錄的底層原理詳解的文章就介紹到這了,更多相關(guān)MySQL繞過密碼登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL中on?duplicate?key?update的使用方法實例
在做數(shù)據(jù)統(tǒng)計的時候,我們經(jīng)常會用到mysql的on duplicate key update語法來自動更新數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于MySQL中on?duplicate?key?update的使用方法的相關(guān)資料,需要的朋友可以參考下2022-09-09SUSE Linux下源碼編譯方式安裝MySQL 5.6過程分享
這篇文章主要介紹了SUSE Linux下源碼編譯方式安裝MySQL 5.6過程分享,本文使用SUSE Linux Enterprise Server 10 SP3 (x86_64)系統(tǒng),需要的朋友可以參考下2014-09-09MySQL 刪除數(shù)據(jù)庫中重復(fù)數(shù)據(jù)方法小結(jié)
在實際項目中,我們經(jīng)常會遇到刪除數(shù)據(jù)庫中重復(fù)數(shù)據(jù)的問題,貌似是很簡單的問題哈,下面我們來探討下2014-07-07MySQL 中 DATE_FORMAT() 函數(shù)的使用及應(yīng)用場景
DATE_FORMAT() 是 MySQL 中的一個內(nèi)置函數(shù),用于格式化日期和時間數(shù)據(jù),它可以根據(jù)指定的格式字符串來展示日期和時間,使得數(shù)據(jù)更容易閱讀和理解,本文檔將詳細介紹 DATE_FORMAT() 函數(shù)的使用方法及其常見應(yīng)用場景,感興趣的朋友一起看看吧2024-12-12