里都用 root 連數(shù)據(jù)庫(kù):賬號(hào)權(quán)限該收到多小)
授權(quán)與合規(guī)聲明本文全部操作對(duì)象均為自建隔離靶場(chǎng)本機(jī)容器或隔離虛擬機(jī)涉及安全測(cè)試的環(huán)節(jié)必須以取得合法授權(quán)為前提。未經(jīng)授權(quán)的滲透測(cè)試違反《中華人民共和國(guó)網(wǎng)絡(luò)安全法》與《刑法》相關(guān)條款須承擔(dān)相應(yīng)法律責(zé)任。本文只講環(huán)境配置、版本對(duì)照與靶場(chǎng)隔離不含任何攻擊步驟、利用載荷與繞過(guò)手法請(qǐng)勿將文中環(huán)境指向任何非自有系統(tǒng)。一、現(xiàn)象靶場(chǎng)里那個(gè) root和它帶出來(lái)的習(xí)慣1.1 搭建筆記里最后一行的那個(gè) root打開(kāi)任何一份靶場(chǎng)搭建筆記連庫(kù)那一行幾乎都是 root口令 root或者干脆留空。這在靶場(chǎng)里沒(méi)有問(wèn)題庫(kù)是剛建的數(shù)據(jù)是假的跑不起來(lái)就刪掉重來(lái)。root 省掉了為什么這張表看不見(jiàn)為什么這句建表被拒的所有麻煩。問(wèn)題在于這個(gè)習(xí)慣會(huì)跟著人走。你練完一個(gè)注入點(diǎn)回頭給自己的小項(xiàng)目寫(xiě)配置多半還是那一行只把地址換成了自己的機(jī)器。等到某天想給應(yīng)用單獨(dú)開(kāi)個(gè)賬號(hào)吧才發(fā)覺(jué)這件事從頭到尾沒(méi)人講過(guò)不知道該給什么不知道給多少算夠也不知道給完之后拿什么來(lái)確認(rèn)。1.2 四種聽(tīng)起來(lái)像同一件事的現(xiàn)象初學(xué)者描述這類問(wèn)題幾乎都用同一句話“權(quán)限不對(duì)”。但這句話底下至少藏著四件事它們卡在不同的位置屬于不同的檢查階段。你看到的現(xiàn)象大概率卡在屬于哪個(gè)階段報(bào)連不上可用戶名口令明明是對(duì)的沒(méi)匹配到你以為的那一行賬號(hào)記錄第一階段連接驗(yàn)證連上了但看不到目標(biāo)庫(kù)里的表庫(kù)級(jí)權(quán)限沒(méi)給或者給的庫(kù)名不是這個(gè)第二階段庫(kù)級(jí)能看到表建表被拒只有讀寫(xiě)權(quán)限沒(méi)有結(jié)構(gòu)變更這一類第二階段庫(kù)級(jí)或?qū)ο蠹?jí)權(quán)限全給了還是不能給別的賬號(hào)授權(quán)ALL本身就不含授權(quán)權(quán)第二階段授權(quán)權(quán)四種現(xiàn)象分布在兩個(gè)階段、三個(gè)層級(jí)上名字卻是同一個(gè)。因?yàn)楸憩F(xiàn)都是這句不行最自然的應(yīng)對(duì)就是再給多一點(diǎn)——把 SELECT 加成ALL把shop.*加成*.*。這一招有時(shí)候管用不管用的時(shí)候你會(huì)以為是自己給得還不夠。1.3 這篇談什么不談什么這篇只談賬號(hào)本身的三件事能連到哪來(lái)源主機(jī)、能對(duì)哪個(gè)庫(kù)做什么層級(jí)與動(dòng)詞、能不能把權(quán)限轉(zhuǎn)手發(fā)出去授權(quán)權(quán)。三件合起來(lái)才是該收到多小的完整答案。明確不談的有四樣連接數(shù)上限、導(dǎo)出導(dǎo)入、字符集、localhost 與 127.0.0.1 怎么選路。它們都會(huì)讓人看到連不上但不是權(quán)限問(wèn)題把它們和權(quán)限混在一起談只會(huì)讓判斷更亂。也不談繞過(guò)。這篇從頭到尾只回答一個(gè)問(wèn)題一個(gè)應(yīng)用賬號(hào)該收到多小收完怎么核。任何怎么多拿一點(diǎn)的內(nèi)容都不在范圍內(nèi)。環(huán)境說(shuō)明先說(shuō)在前面截至 2026-10-24寫(xiě)這篇用的機(jī)器上沒(méi)有安裝mysql與mysqld。所以下面每個(gè) SQL 塊都是沒(méi)跑過(guò)的全部標(biāo)了待驗(yàn)證。能確認(rèn)的只有沒(méi)裝這一件事。二、權(quán)限不是一個(gè)開(kāi)關(guān)是按上下文分層的2.1 官方講權(quán)限第一件事是分層手冊(cè)講權(quán)限體系第一件事不是列清單是分層。它對(duì)管理類權(quán)限的說(shuō)法是這些權(quán)限是全局的因?yàn)樗鼈儾⒉会槍?duì)某一個(gè)特定的庫(kù)。對(duì)庫(kù)級(jí)權(quán)限的說(shuō)法是作用于一個(gè)庫(kù)以及庫(kù)里所有的對(duì)象。對(duì)象級(jí)還更細(xì)一檔可以給庫(kù)里某個(gè)具體對(duì)象、某類對(duì)象也可以給所有庫(kù)里的所有同類對(duì)象。三句話合起來(lái)只有一句同一個(gè)動(dòng)詞寫(xiě)在不同的ON后面管到的范圍完全不同。權(quán)限不是有沒(méi)有的問(wèn)題是在哪一層有的問(wèn)題。這一句不先立住后面所有討論都會(huì)滑回給多一點(diǎn)。層級(jí)寫(xiě)法管到哪里典型內(nèi)容全局ON *.*整個(gè)實(shí)例建庫(kù)、管賬號(hào)、管復(fù)制、關(guān)服務(wù)庫(kù)級(jí)ON shop.*一個(gè)庫(kù)及其內(nèi)部所有對(duì)象shop 下所有表的讀寫(xiě)表級(jí)ON shop.orders一張表只讀寫(xiě)這一張列級(jí)ON shop.orders (列名)表里的某幾列只讓看某幾列2.2ON *.*與ON shop.*是兩個(gè)世界這兩行只差三個(gè)字符權(quán)限面差一個(gè)量級(jí)。差在哪兒全局層有一批沒(méi)有庫(kù)可掛的權(quán)限。建庫(kù)、建賬號(hào)、管復(fù)制、關(guān)服務(wù)這些動(dòng)作的對(duì)象是整個(gè)實(shí)例所以只能掛在*.*上掛到任何ON shop.*上都是語(yǔ)法錯(cuò)誤因?yàn)樗鼈儾粚儆谀且粚?。反過(guò)來(lái)ON shop.*給滿了也不會(huì)溢出。你在 shop 里能建表能刪表不代表能讀mysql庫(kù)不代表能建第二個(gè)庫(kù)也不代表能碰任何實(shí)例級(jí)的東西。一個(gè)很常見(jiàn)的誤解是把庫(kù)級(jí) ALL讀成這個(gè)庫(kù)上的最高權(quán)限那差不多就是 root 了。不是。庫(kù)級(jí) ALL 是這個(gè)庫(kù)上能有的全部而 root 站的位置在它上面一整層——差的不是多一點(diǎn)是另一類。這在排障時(shí)很關(guān)鍵如果你的問(wèn)題是看不到另一個(gè)庫(kù)那么在shop.*上怎么加都不可能解決因?yàn)槟阋臇|西不在這一層。所以看到ON *.*就當(dāng)成紅燈。教程里寫(xiě)它是因?yàn)榻坛痰哪繕?biāo)是讓環(huán)境跑起來(lái)你寫(xiě)自己的配置時(shí)它絕大多數(shù)情況是多余的。2.3 第一個(gè)誤判把語(yǔ)法能給當(dāng)成該給因?yàn)锳LL在每一層都合法語(yǔ)法上你幾乎總能寫(xiě)出一句能執(zhí)行的 GRANT。執(zhí)行成功會(huì)給人一個(gè)很強(qiáng)的錯(cuò)覺(jué)這件事做對(duì)了。但 GRANT 只檢查你有沒(méi)有資格做這個(gè)授權(quán)動(dòng)作不檢查這個(gè)授權(quán)合不合理。它不問(wèn)你為什么給全局權(quán)限不問(wèn)你為什么把來(lái)源寫(xiě)成%也不問(wèn)你為什么給一個(gè)只讀頁(yè)面配了刪除權(quán)限。語(yǔ)法通過(guò)和授權(quán)合理是兩件完全不相干的事。三、三個(gè)被讀錯(cuò)的詞3.1ALL按級(jí)別封頂且不含授權(quán)權(quán)ALL是被誤讀最多的一個(gè)詞。它讀起來(lái)像全部直覺(jué)上等于最高。手冊(cè)的定義是這類寫(xiě)法是某一權(quán)限級(jí)別上所有可用權(quán)限的簡(jiǎn)寫(xiě)但不包括GRANT OPTION。這半句話里有兩層限制。第一層按級(jí)別封頂。ALL給的是這一層能有的全部不是這個(gè)實(shí)例能有的全部。GRANT ALL ON shop.*不會(huì)順帶給你建庫(kù)的權(quán)限也不會(huì)順帶給你管賬號(hào)的權(quán)限。級(jí)別是天花板它只是頂?shù)教旎ò鍨橹埂5诙硬缓珿RANT OPTION。就算寫(xiě)的是GRANT ALL ON *.*拿到的是全局層所有權(quán)限但仍然不能發(fā)給別人。原文括號(hào)里那個(gè) except 就是為這件事寫(xiě)的。所以我給了 ALL還是不能給別的賬號(hào)授權(quán)不是配置出了錯(cuò)是ALL的定義里就寫(xiě)著這一條。很多人在這里懷疑是版本差異或者語(yǔ)法問(wèn)題實(shí)際是沒(méi)讀完那半句。3.2GRANT OPTION不是權(quán)限是轉(zhuǎn)發(fā)權(quán)手冊(cè)對(duì)它的定義是使自己可以把自身?yè)碛械哪切?quán)限授予別人或者從別人那里收回。注意那個(gè)從句“那些你自己擁有的”。它不能憑空造權(quán)只能把手里已有的再分一份。所以在權(quán)限模型里它不算一種能力算一種傳遞關(guān)系——它決定這張權(quán)限網(wǎng)能不能繼續(xù)往外長(zhǎng)。應(yīng)用賬號(hào)要不要判斷口徑很干脆運(yùn)行期有沒(méi)有一條語(yǔ)句是 GRANT 或者 REVOKE沒(méi)有就不給。給了它等于把賬號(hào)的權(quán)限面從能讀寫(xiě)這些表擴(kuò)到能重新安排誰(shuí)能讀寫(xiě)哪些表。更要緊的是一旦它被用上你在別處做的收權(quán)會(huì)被繞回去A 收干凈了B 還能把權(quán)限發(fā)回給 A。3.3USAGE它是沒(méi)有權(quán)限不是授權(quán)失敗USAGE的定義只有一句它代表沒(méi)有權(quán)限。它是占位符賬號(hào)存在能過(guò)第一階段但在這一層沒(méi)有任何權(quán)限。作用是讓該層為空有可寫(xiě)的形式而不是留白。所以SHOW GRANTS里出現(xiàn)USAGE ON *.*非常正常。很多人看到就以為沒(méi)給上然后繼續(xù)加一路加到ALL ON *.*才好使——其實(shí)真正要給的那條一直在下面只是被第一行擋住了視線。而加到最后恰好就是 2.2 里說(shuō)的那盞紅燈。??代碼待驗(yàn)證SHOWGRANTSFORapp10.0.0.5;讀這份輸出分三步。先數(shù)行數(shù)一行對(duì)應(yīng)一個(gè)層級(jí)的一次授權(quán)行多通常代表歷史遺留多。再看每行是哪個(gè)層級(jí)ON *.*是全局ON shop.*是庫(kù)ON shop.orders是表——層級(jí)比動(dòng)詞更該先看因?yàn)樗鼪Q定這一行的影響面。最后才看動(dòng)詞拿去和 5.1 的清單對(duì)一遍。USAGE行不是錯(cuò)誤提示是該層為空的顯式寫(xiě)法。判斷有沒(méi)有權(quán)限要看完整輸出不要停在第一行。四、真正讓權(quán)限不對(duì)的是匹配到的那一行4.1 兩階段先決定能不能連再?zèng)Q定能做什么手冊(cè)把訪問(wèn)控制分成兩個(gè)階段。第一階段只驗(yàn)一件事這條連接能不能建立判據(jù)是身份、憑據(jù)以及賬號(hào)有沒(méi)有被鎖——那條記錄里表示鎖定的字段必須是 N。第二階段才逐條語(yǔ)句去驗(yàn)這一句能不能跑。最關(guān)鍵的后果是身份在連接建立的那一刻就釘死了。這條連接之后發(fā)的每一條語(yǔ)句都按那個(gè)身份查權(quán)限不會(huì)重新認(rèn)一次人。這句話能解釋兩類看著很像、其實(shí)不同的問(wèn)題?!拔矣?app 連的怎么像是在用另一個(gè)賬號(hào)”——這發(fā)生在第一階段是匹配到了別的行?!拔腋牧藱?quán)限這條連接還是不行”——這發(fā)生在第二階段和變更對(duì)連接的作用時(shí)機(jī)有關(guān)。兩類入口完全不同混著看就只能反復(fù)重啟服務(wù)碰運(yùn)氣。4.2 身份不是用戶名是用戶名加來(lái)源主機(jī)第一階段認(rèn)的身份是User和Host兩列共同決定的。手冊(cè)寫(xiě)得很直白這兩列一起決定匹配到哪一行。同一個(gè)用戶名可以有多行對(duì)應(yīng)不同來(lái)源。難的是多行都匹配時(shí)用哪一行。規(guī)則是服務(wù)器按排好序的順序往下掃用第一個(gè)匹配上的行。排序把最具體的 Host 放前面%最不具體。手冊(cè)還給了主機(jī)部分的具體度從 8.0.23 起IP 字面量比 CIDR 具體CIDR 比帶掩碼的具體%表示任意主機(jī)、最不具體空字符串也表示任意主機(jī)但排在%之后。行UserHost誰(shuí)能匹配上具體度1app10.0.0.5只有這一個(gè)地址最具體2app10.0.0.0/255.255.255.0這一個(gè)網(wǎng)段中間3app%任意來(lái)源最不具體這張表的用法不是背排序是意識(shí)到一件事你寫(xiě)的行和實(shí)際生效的行可能不是同一行。只要同一個(gè)用戶名下面有多行這個(gè)可能就存在。而一旦存在加權(quán)限了怎么沒(méi)用就不需要靠猜了。4.3 空用戶名先匹配官方點(diǎn)名的那個(gè)誤解到這里可以說(shuō)本文的主線了。手冊(cè)對(duì)空用戶名的說(shuō)明大意是User這一列為空能匹配任何用戶名而且一旦匹配上這條連接后續(xù)所有的訪問(wèn)檢查都用這個(gè)空用戶名來(lái)做。官方在同一節(jié)里直接點(diǎn)出這是一個(gè)常見(jiàn)的誤解——很多人以為連接時(shí)顯式寫(xiě)了用戶名服務(wù)器就會(huì)先去找那一行。不是。排序在前的行先贏而空用戶名的行能匹配任何用戶名所以它排在你那一行前面的時(shí)候你以為的那個(gè)賬號(hào)壓根沒(méi)被查過(guò)。后果很隱蔽你以為在用 app 的權(quán)限實(shí)際在用匿名行的。給 app 加權(quán)限加多少都不生效因?yàn)闆](méi)走到那一行。于是出現(xiàn)一類特別抓狂的現(xiàn)象——SHOW GRANTS FOR app...的輸出干凈合理應(yīng)用跑起來(lái)還是不行。你會(huì)懷疑緩存、懷疑連接池、懷疑配置沒(méi)生效唯獨(dú)不懷疑你查的那個(gè)賬號(hào)不是正在用的那個(gè)。還有一個(gè)容易漏的細(xì)節(jié)一旦匹配整條連接都用這個(gè)身份不是每條語(yǔ)句重新挑一行。判據(jù)只有一個(gè)手冊(cè)也寫(xiě)了CURRENT_USER()返回user_namehost_name形式的值取自實(shí)際匹配到的那一行記錄。??代碼待驗(yàn)證SELECTCURRENT_USER();排障第一條命令就是它。別拿連接串里寫(xiě)的用戶名當(dāng)答案——那個(gè)是我想要是誰(shuí)不是我實(shí)際是誰(shuí)。兩者的差值就是這類問(wèn)題的全部空間。??代碼待驗(yàn)證SELECTUser,HostFROMmysql.userWHEREUser;這條用來(lái)找匿名行需要讀mysql庫(kù)的權(quán)限只在你自己有管理權(quán)限的靶場(chǎng)里跑。目的只有一個(gè)看清楚有沒(méi)有這樣一行、它的 Host 是什么、排在哪。這一步是看清楚不是繞過(guò)去。五、收到多小先定庫(kù)再定動(dòng)詞最后定來(lái)源5.1 從這個(gè)應(yīng)用會(huì)發(fā)什么語(yǔ)句往下減收權(quán)的方向不是從最小往上加是從實(shí)際會(huì)發(fā)的語(yǔ)句往下減。差別在心態(tài)往上加的人永遠(yuǎn)在擔(dān)心加少了會(huì)不會(huì)出問(wèn)題往下減的人手里有一份清單減到剛好為止就停。第一步不是開(kāi)賬號(hào)是把應(yīng)用運(yùn)行期會(huì)發(fā)哪些語(yǔ)句類型列出來(lái)。絕大多數(shù)業(yè)務(wù)應(yīng)用落在這三檔只讀的只有查詢一般業(yè)務(wù)是查詢加增刪改需要改結(jié)構(gòu)的再加建表、改表、刪表、建索引。第三檔單獨(dú)說(shuō)。改結(jié)構(gòu)一般只發(fā)生在部署和遷移的時(shí)候不在運(yùn)行期。更穩(wěn)的做法是給遷移單獨(dú)開(kāi)一個(gè)賬號(hào)只在部署時(shí)用業(yè)務(wù)賬號(hào)永遠(yuǎn)不碰結(jié)構(gòu)變更。這樣一次誤操作最多寫(xiě)壞一行數(shù)據(jù)而不是把整張表連結(jié)構(gòu)一起覆蓋掉。需要說(shuō)明這三檔是我的工程建議不是手冊(cè)原文。手冊(cè)給的是分層這套定義沒(méi)有給一個(gè)應(yīng)用該給幾個(gè)權(quán)限的清單因?yàn)槟侨Q于應(yīng)用本身不存在通用答案。這點(diǎn)要說(shuō)清免得被當(dāng)官方口徑引用。把三檔落成表加一列給錯(cuò)的后果權(quán)限項(xiàng)運(yùn)行期要不要給錯(cuò)的后果目標(biāo)庫(kù)的查詢權(quán)限看應(yīng)用讀不讀讀到了本不該讀的表目標(biāo)庫(kù)的增、刪、改權(quán)限看應(yīng)用寫(xiě)不寫(xiě)寫(xiě)壞或刪掉數(shù)據(jù)目標(biāo)庫(kù)的建表、改表、刪表一般不要交給遷移賬號(hào)一次誤操作能清掉整張表全局層那一類管理權(quán)限不要影響面從這個(gè)庫(kù)擴(kuò)到整個(gè)實(shí)例GRANT OPTION不要能把手里權(quán)限再發(fā)出去mysql庫(kù)的讀權(quán)限不要見(jiàn) 5.2來(lái)源主機(jī)寫(xiě)成%盡量收窄憑據(jù)一旦外流可用范圍沒(méi)有邊界5.2mysql庫(kù)不給普通賬號(hào)讀手冊(cè)里有一條很直接的安全提醒不要給非管理用戶讀mysql系統(tǒng)庫(kù)里那些表的權(quán)限。這是本文引用的原文里唯一一條直接點(diǎn)名某個(gè)庫(kù)不該給的話值得單獨(dú)一節(jié)。原因是那個(gè)庫(kù)存的不是業(yè)務(wù)數(shù)據(jù)是賬號(hào)和權(quán)限本身——有哪些賬號(hào)、各自從哪些主機(jī)來(lái)、各自有什么。讀到它等于把這張圖整份交出去。對(duì)防守方來(lái)說(shuō)它是資產(chǎn)對(duì)任何拿到這個(gè)應(yīng)用賬號(hào)的人來(lái)說(shuō)它同樣是資產(chǎn)而且是一份能省掉大量猜測(cè)的資產(chǎn)。這里有個(gè)具體的踩法正好接上 2.2GRANT SELECT ON *.*是包含mysql庫(kù)的。你本來(lái)只想讓?xiě)?yīng)用讀所有業(yè)務(wù)庫(kù)一句*.*就把系統(tǒng)庫(kù)一起帶了進(jìn)去而且?guī)У煤翢o(wú)聲息——它不會(huì)提醒你也不會(huì)在SHOW GRANTS里單獨(dú)列一行。5.3 空密碼不等于任意密碼這一條幾乎每個(gè)人第一次看到都會(huì)理解反。手冊(cè)的原文大意是authentication_string這一列可以是空的。這不是通配符也不代表任何密碼都能匹配。它的意思是這個(gè)用戶必須在不指定密碼的情況下連接。拆成三點(diǎn)。它不是通配符拿任意一個(gè)密碼去連不會(huì)成功所以空密碼等于任意密碼這個(gè)說(shuō)法是錯(cuò)的。它要求的是不帶密碼能被用上的條件不是隨便填都能過(guò)是根本不需要填。所以它的風(fēng)險(xiǎn)不在猜得中在沒(méi)有這道門(mén)檻——前者靠口令強(qiáng)度和限速緩解后者沒(méi)有強(qiáng)度可言也沒(méi)有猜的過(guò)程。推論很直接一個(gè)空密碼賬號(hào)如果 Host 是%那么任何能連到這個(gè)端口的人都不需要憑據(jù)。這跟口令弱不是一個(gè)量級(jí)——它壓根不是弱是沒(méi)有。一句校準(zhǔn)不要因?yàn)樗皇侨我饷艽a就覺(jué)得它安全也不要把它寫(xiě)成任意密碼都能進(jìn)。兩頭都錯(cuò)一個(gè)會(huì)漏掉風(fēng)險(xiǎn)一個(gè)會(huì)讓你排障時(shí)找錯(cuò)方向。配套資料獲取這一章的判斷表和應(yīng)用類型對(duì)應(yīng)只留哪幾個(gè)動(dòng)詞的對(duì)照頁(yè)我并成了一張單頁(yè)和正文兩張表逐行對(duì)應(yīng)六、自查把你手上的賬號(hào)過(guò)一遍6.1 三步順序不能換第一步確認(rèn)匹配到哪一行。SELECT CURRENT_USER();拿回的就是userhost這是判據(jù)也是后面所有判斷的前提。沒(méi)有這一步后面兩步都建在假設(shè)上。第二步看這一行有什么。SHOW GRANTS FOR CURRENT_USER();要用CURRENT_USER()不要硬寫(xiě)用戶名——硬寫(xiě)的話你查的是我以為的那個(gè)賬號(hào)而問(wèn)題往往就出在我以為這三個(gè)字上。第三步對(duì)著應(yīng)用真實(shí)會(huì)發(fā)的語(yǔ)句把多出來(lái)的砍掉。順序不能換第一步錯(cuò)了后面兩步都是在看別人的權(quán)限看得再仔細(xì)也沒(méi)用。而第一步出錯(cuò)恰恰最常見(jiàn)因?yàn)樗粓?bào)錯(cuò)。??代碼待驗(yàn)證SELECTCURRENT_USER();SHOWGRANTSFORCURRENT_USER();兩句一起跑輸出的第一行是實(shí)際是誰(shuí)后面幾行是這個(gè)身份有什么。拼起來(lái)才算一次完整判斷。6.2 一張表每一項(xiàng)怎么核把前面幾章收斂成一張對(duì)照表左列是檢查項(xiàng)中列該不該給應(yīng)用右列怎么看出來(lái)。檢查項(xiàng)該不該給應(yīng)用怎么核全局層權(quán)限一般不該SHOW GRANTS第一行應(yīng)當(dāng)只有USAGE目標(biāo)庫(kù)的查詢權(quán)限按需對(duì)一遍應(yīng)用有沒(méi)有讀操作目標(biāo)庫(kù)的增刪改權(quán)限按需對(duì)一遍應(yīng)用有沒(méi)有寫(xiě)操作目標(biāo)庫(kù)的結(jié)構(gòu)變更權(quán)限一般不給交給單獨(dú)的遷移賬號(hào)GRANT OPTION不給輸出里出現(xiàn)它就算超標(biāo)mysql庫(kù)的讀權(quán)限不給看有沒(méi)有*.*或mysql.*來(lái)源主機(jī)收到具體Host是%就要問(wèn)一句為什么同一用戶名的行數(shù)越少越好數(shù)一下User相同的行有幾條空密碼賬號(hào)不該有看authentication_string是否為空6.3 三個(gè)常見(jiàn)誤判誤判一看到USAGE以為沒(méi)給上。見(jiàn) 3.3出現(xiàn)頻率最高因?yàn)樗雌饋?lái)就像空。誤判二以為ALL是最高。見(jiàn) 3.1最容易被我全給了這句話固化下來(lái)之后所有排查都會(huì)繞開(kāi)真正的原因。誤判三改了權(quán)限以為立刻對(duì)所有連接生效。這里必須標(biāo)待驗(yàn)證——FLUSH PRIVILEGES到底在什么條件下需要本批沒(méi)有核到對(duì)應(yīng)頁(yè)面。只能給一句方向性的判斷用 GRANT、REVOKE 這類語(yǔ)句改的權(quán)限一般不依賴它只有直接去改授權(quán)表的時(shí)候才可能需要。這句本身也標(biāo)待驗(yàn)證不要當(dāng)結(jié)論引用。同樣沒(méi)核到的還有一件事權(quán)限變更對(duì)此前建立的連接什么時(shí)候生效。這條在實(shí)踐里很要命——你在一個(gè)會(huì)話里改完另一個(gè)會(huì)話可能還是老樣子于是以為沒(méi)改成功又改一遍。穩(wěn)妥做法是改完重連一次再驗(yàn)這只是我的建議不是官方結(jié)論。七、邊界以及收權(quán)的順序7.1 這篇不寫(xiě)什么不寫(xiě)連接數(shù)上限那是資源與配置。不寫(xiě)導(dǎo)出導(dǎo)入批量搬數(shù)據(jù)有自己的權(quán)限要求。不寫(xiě)字符集它決定的是存進(jìn)去的字節(jié)怎么解釋。不寫(xiě) localhost 與 127.0.0.1 怎么選路那是連接串與解析層的事和這一行匹配不匹配是兩套機(jī)制。也不寫(xiě)任何繞過(guò)權(quán)限的做法不寫(xiě)提權(quán)——收權(quán)的價(jià)值在于把面縮小不在于找到更大的面。whichmysql mysqld本機(jī)沒(méi)有安裝mysql與mysqld所以上面所有 SQL 一行都沒(méi)跑過(guò)。這條命令跑過(guò)輸出是mysql not found與mysqld not found。它證明不了別的只證明我確實(shí)沒(méi)有執(zhí)行環(huán)境這一點(diǎn)得交代否則讀者會(huì)默認(rèn)文中的 SQL 都跑通了。7.2 收權(quán)順序先做能立刻看到效果的那一步順序動(dòng)作為什么排在這個(gè)位置1用CURRENT_USER()確認(rèn)在用的那一行前面全錯(cuò)的話后面都白做2清理空用戶名行和用不到的重復(fù)行匹配的不確定性是給多了沒(méi)用的根源3把來(lái)源主機(jī)收到具體地址或網(wǎng)段范圍越窄憑據(jù)外流后的可用面越小4按庫(kù)收把*.*換成本庫(kù).*一步砍掉跨庫(kù)面和系統(tǒng)庫(kù)5按動(dòng)詞收去掉結(jié)構(gòu)變更與GRANT OPTION砍掉能改結(jié)構(gòu)和能轉(zhuǎn)發(fā)6空密碼賬號(hào)要么刪、要么設(shè)口令這不是強(qiáng)度問(wèn)題是有沒(méi)有門(mén)檻7改完重連再驗(yàn)一次變更對(duì)連接的作用時(shí)機(jī)本批未核到順序不是按投入排的是按錯(cuò)了以后返工代價(jià)排的。第 1、2 步幾乎零成本但它們決定后面五步是不是在做無(wú)用功。第 7 步最容易被省掉而它是唯一能確認(rèn)改了真的生效的一步。7.3 一句收尾判斷該收到多小沒(méi)有統(tǒng)一答案但有統(tǒng)一的判斷方式把這個(gè)賬號(hào)在正常運(yùn)行中會(huì)發(fā)的語(yǔ)句列出來(lái)只給這些語(yǔ)句需要的權(quán)限一個(gè)不多。列不出來(lái)的部分就是你還不知道應(yīng)用會(huì)做什么的部分那部分先別給。整份都列不出來(lái)說(shuō)明你還不清楚這個(gè)應(yīng)用會(huì)做什么——先別開(kāi)賬號(hào)。清單是別人的語(yǔ)句是你自己的。配套資料獲取這一章的收權(quán)七步做成了一張可以照著勾的單頁(yè)每一步都帶做完怎么驗(yàn)和上面的表一一對(duì)應(yīng)附表 A本文引用事實(shí)與官方出處對(duì)照表編號(hào)事實(shí)摘要出處本文位置DB-1管理類權(quán)限是全局的因其不針對(duì)特定庫(kù)庫(kù)級(jí)權(quán)限作用于一個(gè)庫(kù)及其所有對(duì)象對(duì)象級(jí)可細(xì)到具體對(duì)象或所有庫(kù)的同類對(duì)象MySQL 8.0 Reference Manual 8.2.22.1、2.2DB-2ALL是某一權(quán)限級(jí)別上所有可用權(quán)限的簡(jiǎn)寫(xiě)且不含GRANT OPTION同上 8.2.23.1DB-3GRANT OPTION使自己可把自身?yè)碛械臋?quán)限授予或收回給其他用戶同上 8.2.23.2DB-4USAGE代表沒(méi)有權(quán)限SHOW GRANTS用它表示該級(jí)別無(wú)權(quán)限同上 8.2.23.3DB-5兩階段訪問(wèn)控制第一階段只驗(yàn)連接能否建立判據(jù)含賬號(hào)未被鎖鎖定字段須為 N第二階段才驗(yàn)語(yǔ)句同上 8.2.64.1DB-6身份由User與Host兩列共同決定匹配到哪一行同上 8.2.64.2DB-7服務(wù)器按排序后的順序掃描使用第一個(gè)匹配的行最具體的 Host 在前%最不具體同上 8.2.64.2、4.3DB-8User為空可匹配任何用戶名匹配后整條連接沿用該空用戶名官方點(diǎn)明顯式寫(xiě)了用戶名就先匹配該用戶是常見(jiàn)誤解同上 8.2.64.3DB-9CURRENT_USER()返回user_namehost_name取自實(shí)際匹配到的那一行記錄同上 8.2.64.3、6.1DB-10不要給非管理用戶讀mysql系統(tǒng)庫(kù)中表的權(quán)限同上 8.2.65.2DB-11authentication_string可為空但不是通配符、不代表任何密碼可匹配而是要求不指定密碼連接同上 8.2.65.3DB-12主機(jī)部分具體度8.0.23 起IP 字面量 CIDR 帶掩碼%為任意主機(jī)且最不具體空串亦為任意主機(jī)但排在%之后同上 8.2.64.2DB-13待驗(yàn)證FLUSH PRIVILEGES的觸發(fā)條件、權(quán)限變更對(duì)已有連接何時(shí)生效本批未核到對(duì)應(yīng)頁(yè)面6.3、7.2DB-14本機(jī)未安裝mysql與mysqld全文 SQL 塊均為未執(zhí)行本機(jī)實(shí)測(cè) 2026-10-241.3、7.1 及全文 SQL 塊附表 B術(shù)語(yǔ)速查表術(shù)語(yǔ)一句話說(shuō)明全局權(quán)限掛在ON *.*上、作用于整個(gè)實(shí)例、不針對(duì)某個(gè)庫(kù)的那一類庫(kù)級(jí)權(quán)限掛在ON 庫(kù)名.*上作用于這個(gè)庫(kù)及其內(nèi)部所有對(duì)象ALL“該級(jí)別能有的全部”按級(jí)別封頂且不含授權(quán)權(quán)GRANT OPTION轉(zhuǎn)授權(quán)能把自己手里的權(quán)限再發(fā)給別人不是一種權(quán)限USAGE代表沒(méi)有權(quán)限的占位寫(xiě)法出現(xiàn)在SHOW GRANTS里屬正常SHOW GRANTS按層級(jí)逐行列出某賬號(hào)持有權(quán)限的語(yǔ)句一行一層CURRENT_USER()返回實(shí)際匹配到的用戶名主機(jī)是判斷我是誰(shuí)的判據(jù)匿名賬號(hào)User列為空的賬號(hào)記錄可匹配任何用戶名來(lái)源主機(jī)Host列與用戶名共同構(gòu)成身份也決定匹配的先后寫(xiě)在最后這篇用到的資料寫(xiě)這篇文章時(shí)我把權(quán)限不對(duì)拆成兩個(gè)階段三個(gè)層級(jí)重新對(duì)了一遍發(fā)現(xiàn)真正難的不是給多少而是確認(rèn)自己到底在用哪一行順手也整理了幾份配套的東西靶場(chǎng)環(huán)境對(duì)照表DVWA、upload-labs 在 Windows / macOS / Linux 三平臺(tái)的可行性與推薦路徑Web 安全學(xué)習(xí)路線圖從基礎(chǔ)打牢到安全管理四個(gè)階段各學(xué)什么常用靶場(chǎng)清單每個(gè)靶場(chǎng)練什么、適合哪個(gè)階段資料是我自己整理的放在下面這個(gè)碼上掃碼即可獲取添加時(shí)備注「靶場(chǎng)」優(yōu)先通過(guò)。拿到之后建議先看環(huán)境對(duì)照表那一份把「我這個(gè)應(yīng)用賬號(hào)到底連到了哪一行」先對(duì)著自己的靶場(chǎng)查一遍比記權(quán)限清單更管用。