戰(zhàn):用Pikachu靶場(chǎng)通關(guān)暴力破解與文件上傳)
直接實(shí)操過(guò)Pikachu靶場(chǎng)的人應(yīng)該都有這種體會(huì)它不像DVWA那么“溫和”也不像DVWS那種純漏洞環(huán)境那么單調(diào)而是把常見(jiàn)Web漏洞按場(chǎng)景拆開(kāi)每個(gè)模塊都帶交互和數(shù)據(jù)流非常適合拿來(lái)練Burp Suite的抓包、改包、重放、爆破這一套基本功。這篇文章不打算講泛泛的“什么是Burp”而是用通關(guān)Pikachu的真實(shí)路徑把從暴力破解到文件上傳這一路會(huì)踩的坑、容易被忽略的細(xì)節(jié)、以及排查思路完整捋一遍給正準(zhǔn)備上手的新手一個(gè)可以直接照著走的實(shí)操路線。這篇內(nèi)容適合三類人剛裝好Burp Suite但不知道從哪個(gè)靶場(chǎng)下手的初學(xué)者已經(jīng)刷過(guò)一部分靶場(chǎng)但總在攔截、編碼、繞WAF這些環(huán)節(jié)卡住的人以及想帶新人入門(mén)需要一份帶避坑點(diǎn)的實(shí)戰(zhàn)參考的帶隊(duì)者。整個(gè)通關(guān)過(guò)程全部在本地靶場(chǎng)環(huán)境完成不涉及任何真實(shí)目標(biāo)所有操作只圍繞漏洞原理、請(qǐng)求/響應(yīng)分析、繞過(guò)技巧和修復(fù)建議展開(kāi)。1. 內(nèi)容整體設(shè)計(jì)與思路拆解1.1 為什么要選Pikachu作為Burp Suite的練習(xí)靶場(chǎng)很多新手一上來(lái)就對(duì)著DVWA的“Command Injection”或者“SQL Injection”猛練結(jié)果發(fā)現(xiàn)要么是環(huán)境太老、PHP報(bào)錯(cuò)一堆要么是關(guān)卡難度跳躍太大Burp的Proxy還沒(méi)來(lái)得及熟悉就陷入了“不知道哪里出錯(cuò)”的僵局。Pikachu的設(shè)計(jì)思路不太一樣它把漏洞場(chǎng)景拆成了“暴力破解”“XSS”“CSRF”“SQL注入”“越權(quán)”“文件上傳”等獨(dú)立模塊每個(gè)模塊內(nèi)部又有清晰的關(guān)卡遞進(jìn)比如“基于表單的暴力破解”和“帶驗(yàn)證碼的暴力破解”拆開(kāi)練。這種顆粒度非常適合配合Burp Suite的各個(gè)功能去逐個(gè)擊破。另外一點(diǎn)Pikachu的環(huán)境依賴非常簡(jiǎn)單。它就是一個(gè)PHP項(xiàng)目只需要Apache/Nginx加MySQL就能跑起來(lái)。比起那些要Docker Compose拉好幾個(gè)容器的靶場(chǎng)Pikachu本地部署的故障點(diǎn)少很多對(duì)新手來(lái)說(shuō)很不友好——我這里說(shuō)的“不友好”是褒義因?yàn)樵谝粋€(gè)足夠簡(jiǎn)單、可控的環(huán)境里你才能把注意力全部放在Burp的請(qǐng)求流程和漏洞原理上而不是浪費(fèi)在折騰環(huán)境本身。注意Pikachu自帶的部分漏洞場(chǎng)景在真實(shí)環(huán)境中已經(jīng)很難直接利用但作為理解原理和練習(xí)Burp操作方式的載體它的價(jià)值依然很高。尤其適合練習(xí)“如何分析一個(gè)請(qǐng)求”“如何判斷漏洞觸發(fā)點(diǎn)”“如何構(gòu)造有效載荷”。1.2 用Burp Suite通關(guān)的整體思路先抓包、再分析、后構(gòu)造Burp Suite在Pikachu靶場(chǎng)上的核心作用可以歸納成一句話把瀏覽器和服務(wù)器之間的HTTP交互透明化然后讓你能在中間做任何修改。整個(gè)通關(guān)路徑如果畫(huà)成一條線大概是這樣的啟動(dòng)Burp配置瀏覽器代理確認(rèn)能抓到Pikachu的HTTP請(qǐng)求。針對(duì)每個(gè)漏洞模塊先正常操作一遍抓取基線流量搞清楚請(qǐng)求里哪些參數(shù)是可變的、哪些是關(guān)鍵字段。用Repeater對(duì)關(guān)鍵請(qǐng)求做手動(dòng)修改測(cè)試不同參數(shù)值、不同編碼方式、不同請(qǐng)求方法。使用Intruder做自動(dòng)化測(cè)試比如暴力破解的用戶名字典、密碼字典或者文件上傳時(shí)對(duì)文件名/Content-Type做fuzz。綜合分析響應(yīng)狀態(tài)碼、響應(yīng)體長(zhǎng)度、報(bào)錯(cuò)信息判斷漏洞是否真的能觸發(fā)。最后回到漏洞成因和修復(fù)建議上理解這個(gè)漏洞是怎么被引入的。這套思路看起來(lái)簡(jiǎn)單但實(shí)操中有一個(gè)關(guān)鍵細(xì)節(jié)經(jīng)常被新手忽略不是所有需要改的請(qǐng)求都能在Proxy里直接看到有些場(chǎng)景需要你先在Burp里手動(dòng)轉(zhuǎn)發(fā)或者修改Host頭、Content-Length、Cookie等信息才能真正到達(dá)漏洞觸發(fā)點(diǎn)。比如Pikachu的越權(quán)模塊普通操作只能看到自己的數(shù)據(jù)但你在Burp里改一下參數(shù)值就能看到其他人的數(shù)據(jù)這就是“越權(quán)”的本質(zhì)。1.3 為什么推薦用社區(qū)版Burp Suite就夠了不少新手第一反應(yīng)是去找Pro版覺(jué)得功能多才安心。實(shí)際上通關(guān)Pikachu社區(qū)版完全夠用核心功能一個(gè)不缺P(pán)roxy、Repeater、Decoder、Comparer以及Intruder的基礎(chǔ)模式。Pro版多的主動(dòng)掃描、Burp Scanner這些功能在這個(gè)階段反而容易讓你形成“掃描器依賴”弱化手動(dòng)分析請(qǐng)求的能力。Pikachu這種靶場(chǎng)最大的價(jià)值就是讓你理解“為什么會(huì)漏洞”“漏洞長(zhǎng)什么樣”而不是讓你學(xué)會(huì)“按一下掃描按鈕然后看報(bào)告”。我用社區(qū)版把Pikachu的暴力破解、XSS、SQL注入、越權(quán)、文件上傳全部通關(guān)過(guò)沒(méi)有一次因?yàn)楣δ苋笔Фㄗ P枰玫摹白值洹蓖耆梢詮谋镜厣苫驈拈_(kāi)源項(xiàng)目獲取沒(méi)必要一開(kāi)始就依賴商業(yè)功能。2. 環(huán)境準(zhǔn)備與開(kāi)局配置2.1 Pikachu靶場(chǎng)的本地部署Pikachu的部署方式根據(jù)你的系統(tǒng)環(huán)境略有差異。最簡(jiǎn)單的方案是直接裝一個(gè)集成的PHP環(huán)境比如Windows下的小皮面板、macOS下的MAMP或者Linux下直接用apt裝Apache、MySQL、PHP。項(xiàng)目本身不需要networking配置也不需要額外的域名綁定放在網(wǎng)站根目錄下訪問(wèn)http://localhost/pikachu即可。數(shù)據(jù)庫(kù)初始化是新手最容易卡住的一步。Pikachu需要在MySQL里創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)然后導(dǎo)入項(xiàng)目根目錄下提供的SQL文件。這里有一個(gè)非常容易踩的坑PHP版本太新會(huì)導(dǎo)致MySQL連接失敗。我遇到過(guò)最典型的情況是PHP 8.x下面老版本mysqli函數(shù)行為變化導(dǎo)致初始化頁(yè)面白屏解決辦法是換用PHP 7.4版本或者修改數(shù)據(jù)庫(kù)連接配置里不支持的方法。啟動(dòng)頁(yè)面會(huì)顯示“初始化”入口點(diǎn)了之后它會(huì)自動(dòng)建表、插入初始數(shù)據(jù)。初始化完成后頁(yè)面會(huì)顯示所有漏洞模塊的入口這時(shí)候就可以開(kāi)始配置Burp了。如果你看到數(shù)據(jù)庫(kù)連接報(bào)錯(cuò)優(yōu)先檢查MySQL服務(wù)是否啟動(dòng)、數(shù)據(jù)庫(kù)賬號(hào)密碼是否和配置項(xiàng)一致這兩點(diǎn)占90%的故障原因。2.2 Burp Suite與瀏覽器的代理配置Burp Suite默認(rèn)監(jiān)聽(tīng)127.0.0.1:8080。瀏覽器側(cè)我建議直接用Firefox單獨(dú)配一個(gè)帶代理的Profile不要?jiǎng)尤窒到y(tǒng)代理這樣日常上網(wǎng)和靶場(chǎng)操作互不干擾。Firefox設(shè)置里找到“網(wǎng)絡(luò)設(shè)置”手動(dòng)配置代理HTTP代理填127.0.0.1端口填8080勾選“同時(shí)代理HTTPS”然后訪問(wèn)http://burp下載CA證書(shū)安裝到“證書(shū)機(jī)構(gòu)”里這樣HTTPS流量才能被正常解密。這里有個(gè)細(xì)節(jié)容易被忽略安裝CA證書(shū)時(shí)一定要確認(rèn)它被授予了“信任此證書(shū)以標(biāo)識(shí)網(wǎng)站”的用途。如果安裝之后Burp的Proxy面板里還是只能看到CONNECT請(qǐng)求看不到真正的GET/POST內(nèi)容基本就是證書(shū)信任沒(méi)生效。還有一個(gè)常見(jiàn)問(wèn)題是瀏覽器插件沖突比如某些廣告攔截插件會(huì)直接阻斷對(duì)burp域名的訪問(wèn)導(dǎo)致證書(shū)根本下載不下來(lái)。2.3 驗(yàn)證代理鏈路是否正常配置完成后先不要急著去點(diǎn)靶場(chǎng)功能先在Burp的Proxy-HTTP history里確認(rèn)目標(biāo)流量。具體操作是瀏覽器里訪問(wèn)Pikachu首頁(yè)然后回到Burp看到一條GET /pikachu/index.php的請(qǐng)求記錄展開(kāi)看Raw標(biāo)簽里的請(qǐng)求頭、響應(yīng)頭確認(rèn)Host、User-Agent、Cookie這些字段都在就說(shuō)明代理鏈路已經(jīng)完全打通。如果你在這里發(fā)現(xiàn)請(qǐng)求只有TCP連接記錄沒(méi)有HTTP應(yīng)用層數(shù)據(jù)通常就是證書(shū)問(wèn)題或代理端口被占用。檢查方法很簡(jiǎn)單換一個(gè)端口比如8081重新配代理再訪問(wèn)一次八成能解決如果還不行看看是不是系統(tǒng)里裝了別的代理工具占用了8080端口。在Linux/macOS下可以用lsof -i:8080查端口占用Windows下用netstat -ano | findstr 8080。3. 暴力破解模塊通關(guān)全記錄3.1 基于表單的暴力破解Burp抓包與Repeater分析Pikachu的暴力破解模塊第一關(guān)是“基于表單的暴力破解”提交方式是POST表單字段通常是username和password點(diǎn)擊登錄后Burp會(huì)抓到一條POST請(qǐng)求。把這個(gè)請(qǐng)求發(fā)送到Repeater點(diǎn)發(fā)送響應(yīng)里會(huì)直接顯示“登錄失敗”或者“用戶名或密碼錯(cuò)誤”之類的提示。這個(gè)關(guān)卡的目的不是讓你真的爆破而是讓你理解“功能本身沒(méi)有做任何防爆破機(jī)制”。你可以先手動(dòng)改一下密碼觀察響應(yīng)是否出現(xiàn)差異然后把它發(fā)送到Intruder把username和password兩個(gè)參數(shù)設(shè)為payload位置。這里要說(shuō)明一點(diǎn)不需要兩個(gè)變量都爆破Pikachu內(nèi)置的用戶名列表是有限的而且極大概率就是admin、test這種你可以固定usernameadmin只對(duì)password做字典爆破效率更高。實(shí)操心得真正動(dòng)手時(shí)建議先把響應(yīng)碼和響應(yīng)長(zhǎng)度加到Intruder的Settings選項(xiàng)里勾選“Grep-Match”并把“登錄成功”這個(gè)關(guān)鍵詞放進(jìn)去這樣每次爆破的結(jié)果都會(huì)直接標(biāo)注是否有匹配項(xiàng)不需要肉眼看幾千條響應(yīng)。3.2 帶驗(yàn)證碼的暴力破解有沒(méi)有繞過(guò)思路第二關(guān)是“帶驗(yàn)證碼的暴力破解”很多新手在這一關(guān)會(huì)把驗(yàn)證碼當(dāng)作不可逾越的障礙其實(shí)Pikachu的這個(gè)關(guān)卡有一個(gè)典型的邏輯漏洞驗(yàn)證碼的校驗(yàn)和登錄表單的校驗(yàn)是分開(kāi)的而且驗(yàn)證碼不強(qiáng)制刷新。什么意思就是你可以先正常獲取一次驗(yàn)證碼然后在抓包里把這個(gè)驗(yàn)證碼的參數(shù)固定住反復(fù)提交登錄請(qǐng)求只要服務(wù)器在同一個(gè)會(huì)話里沒(méi)有強(qiáng)制更新驗(yàn)證碼你就可以帶著同一個(gè)驗(yàn)證碼做無(wú)限次爆破。用Burp實(shí)現(xiàn)這個(gè)操作非常直接。先正常登錄一次把一個(gè)帶驗(yàn)證碼的POST請(qǐng)求抓到發(fā)送到Intruderpayload位置設(shè)置在密碼字段驗(yàn)證碼字段的值保留你剛才看到的那四個(gè)字符不要設(shè)為變量也不需要重新獲取。這樣爆破過(guò)程中服務(wù)器校驗(yàn)驗(yàn)證碼是通過(guò)了爆破點(diǎn)只集中在密碼上。這里要特別提醒一下這個(gè)繞過(guò)技巧只適用于這個(gè)關(guān)卡設(shè)計(jì)的“驗(yàn)證碼不刷新”漏洞真實(shí)系統(tǒng)中大部分驗(yàn)證碼都會(huì)隨會(huì)話或提交次數(shù)刷新千萬(wàn)別把這個(gè)經(jīng)驗(yàn)直接搬到真實(shí)系統(tǒng)上去。學(xué)習(xí)這個(gè)關(guān)卡的重點(diǎn)是理解一個(gè)安全機(jī)制驗(yàn)證碼如果設(shè)計(jì)得不完整會(huì)如何被攻擊者繞過(guò)以及該怎么設(shè)計(jì)才有效驗(yàn)證碼應(yīng)隨會(huì)話綁定、一次性使用、失敗后強(qiáng)制刷新。3.3 token防爆破Base64解碼的隱藏細(xì)節(jié)Pikachu的第三個(gè)暴力破解關(guān)卡引入了token機(jī)制。每次請(qǐng)求都會(huì)帶一個(gè)token參數(shù)正常邏輯下這個(gè)token是一次性的每次刷新頁(yè)面或請(qǐng)求都會(huì)生成新token攻擊者如果每次爆破都要重新獲取token爆破效率會(huì)大幅下降。但這個(gè)關(guān)卡有一個(gè)典型設(shè)計(jì)缺陷token是放在表單里一起提交的而且生成方式?jīng)]有與會(huì)話狀態(tài)強(qiáng)綁定。在實(shí)際操作時(shí)我建議用Burp的“Extract from response”正則提取功能來(lái)處理這種場(chǎng)景。具體做法是先用Burp訪問(wèn)一次登錄頁(yè)面響應(yīng)里能找到一個(gè)token字段的值在Intruder的Payload設(shè)置里選擇“Recursive Grep”類型從每次登錄請(qǐng)求的響應(yīng)中自動(dòng)提取新的token作為下一次請(qǐng)求的參數(shù)值。這個(gè)操作是學(xué)習(xí)Burp高級(jí)用法的好機(jī)會(huì)。它涉及到一個(gè)關(guān)鍵點(diǎn)Intruder的Payload Processing里可以設(shè)置“提取正則”而請(qǐng)求參數(shù)中token的位置必須和提取出的值一一對(duì)應(yīng)。如果提取的token總是差幾位需要看一下HTML源碼里token字段是不是有HTML實(shí)體轉(zhuǎn)義比如amp;之類需要先解碼再使用。3.4 暴力破解的字典準(zhǔn)備與命中率優(yōu)化爆破能不能成功字典質(zhì)量占了很大比重。Pikachu作為靶場(chǎng)它的賬號(hào)密碼都藏在初始數(shù)據(jù)里不是純隨機(jī)字符串所以字典里包含常見(jiàn)弱口令比如admin、123456、password、qwerty、admin888這類的命中率極高。不建議拿那種幾十GB的全量字典去跑一是慢二是沒(méi)有必要。小字典跑完只需要幾分鐘足夠讓你明白Intruder的工作方式。還有一個(gè)優(yōu)化點(diǎn)如果你知道目標(biāo)站點(diǎn)用的PHP那么在爆破時(shí)可以把候選密碼同時(shí)做一次MD5加密變形再提交。因?yàn)椴糠终军c(diǎn)的登錄邏輯是先對(duì)密碼做MD5再比對(duì)數(shù)據(jù)庫(kù)。Pikachu的關(guān)卡里未必用得上但如果你后面轉(zhuǎn)到其他靶場(chǎng)這個(gè)思路會(huì)非常常見(jiàn)。Burp的Payload Processing里有一個(gè)“Hash”選項(xiàng)可以直接選MD5一步到位。4. 越權(quán)漏洞模塊從水平越權(quán)到垂直越權(quán)4.1 水平越權(quán)的Burp操作路徑越權(quán)模塊在Pikachu里的設(shè)計(jì)非常經(jīng)典。水平越權(quán)的場(chǎng)景通常是“查看個(gè)人信息”正常登錄一個(gè)普通賬號(hào)點(diǎn)擊“查看訂單”或“我的信息”請(qǐng)求URL里會(huì)帶一個(gè)參數(shù)比如id1。把這個(gè)請(qǐng)求抓到Repeater里直接把id1改成id2或id3再發(fā)送如果響應(yīng)返回了另一個(gè)賬號(hào)的數(shù)據(jù)水平越權(quán)就實(shí)錘了。這個(gè)操作在Burp里沒(méi)有任何難度難點(diǎn)在于你能不能意識(shí)到這個(gè)點(diǎn)值得測(cè)。很多新手刷靶場(chǎng)時(shí)只顧著找SQL注入、XSS看到id參數(shù)第一反應(yīng)是加單引號(hào)看報(bào)錯(cuò)而不是先試一個(gè)“越權(quán)”的值。這是思維習(xí)慣問(wèn)題安全測(cè)試不只是找“參數(shù)能注入什么”更要問(wèn)“這個(gè)參數(shù)代表什么資源我能不能訪問(wèn)別人的資源”。水平越權(quán)的修復(fù)方案其實(shí)也很明確服務(wù)端必須校驗(yàn)當(dāng)前登錄用戶的身份與資源屬主是否匹配單純依賴前端傳參或隱藏字段等于把關(guān)卡大門(mén)鑰匙交給了攻擊者。4.2 垂直越權(quán)的高危場(chǎng)景與請(qǐng)求分析垂直越權(quán)在Pikachu里的表現(xiàn)是“普通用戶訪問(wèn)管理員功能”。靶場(chǎng)會(huì)把管理員操作入口隱藏起來(lái)正常界面上看不到但通過(guò)查看頁(yè)面源碼、JS文件或者直接觀察HTTP歷史就能發(fā)現(xiàn)管理功能對(duì)應(yīng)的URL路徑。在Burp里找到這個(gè)路徑用普通用戶的Cookie去訪問(wèn)如果服務(wù)器沒(méi)有做權(quán)限校驗(yàn)直接返回管理頁(yè)面那就意味著任意普通用戶都能做管理員操作。實(shí)際測(cè)試中有一個(gè)容易被忽略的小問(wèn)題管理操作可能是POST請(qǐng)求而不只是GET請(qǐng)求。如果你只改URL而沒(méi)有復(fù)制POST的數(shù)據(jù)包服務(wù)器可能返回405或拒絕訪問(wèn)。正確做法是把普通用戶能訪問(wèn)的某個(gè)POST請(qǐng)求抓到在Repeater里把路徑改成管理員路徑同時(shí)保留原來(lái)的Content-Type、Cookie、請(qǐng)求體格式再根據(jù)響應(yīng)做調(diào)整。垂直越權(quán)的修復(fù)要義是“服務(wù)端兩層校驗(yàn)”先校驗(yàn)會(huì)話是否有效再校驗(yàn)角色是否有權(quán)限不能只在前端隱藏按鈕。Pikachu的這個(gè)模塊非常適合練習(xí)“從響應(yīng)差異推斷權(quán)限”的判斷力。4.3 越權(quán)測(cè)試中的請(qǐng)求對(duì)比技巧Burp的Comparer功能在越權(quán)測(cè)試中非常有用。把正常請(qǐng)求的響應(yīng)和修改參數(shù)后的響應(yīng)分別發(fā)送到Comparer選擇對(duì)比它能標(biāo)出兩個(gè)文本之間的差異行。很多新手判斷越權(quán)時(shí)會(huì)不知道“響應(yīng)到底有沒(méi)有變”因?yàn)轫?yè)面里有大量靜態(tài)內(nèi)容只有用戶名字段變了。而Comparer能直接高亮哪個(gè)位置變了一眼就能判斷越權(quán)是否成功。我在實(shí)際操作里還會(huì)配合一個(gè)技巧在Burp的Logger或者History里把同一步操作的兩個(gè)不同響應(yīng)截圖保存下來(lái)方便回頭復(fù)盤(pán)。特別是當(dāng)你同時(shí)測(cè)水平越權(quán)和垂直越權(quán)時(shí)很容易搞混哪個(gè)賬號(hào)訪問(wèn)了哪個(gè)資源記錄好請(qǐng)求序號(hào)和對(duì)應(yīng)Cookie能少走很多彎路。5. 文件上傳模塊前端校驗(yàn)與Content-Type繞過(guò)5.1 上傳場(chǎng)景中的“前端限制”識(shí)別方法文件上傳關(guān)卡的第一種限制是前端校驗(yàn)比如頁(yè)面里寫(xiě)了acceptimage/jpeg或者JS里檢查了文件擴(kuò)展名。這種限制只存在于瀏覽器端直接繞過(guò)方式很簡(jiǎn)單用Burp攔截上傳請(qǐng)求把原本的filenamea.jpg改成filenamea.php同時(shí)把Content-Type從image/jpeg改成application/octet-stream或其他后端可能接受的值。實(shí)操時(shí)要注意一個(gè)細(xì)節(jié)不要漏掉請(qǐng)求里的Content-Disposition字段。有些靶場(chǎng)的校驗(yàn)邏輯會(huì)把文件名和Content-Type一起校驗(yàn)?zāi)愀牧薴ilename卻沒(méi)改Content-Disposition里的文件名格式可能不會(huì)觸發(fā)漏洞因?yàn)楹蠖俗x取文件名的方式和你想象的不一樣。典型案例如下Content-Disposition: form-data; namefile; filenameshell.php Content-Type: application/x-php如果這個(gè)請(qǐng)求被后端接受了并且上傳路徑直接拼接了shell.php那就意味著擴(kuò)展名校驗(yàn)被完全繞過(guò)。如果響應(yīng)返回了上傳后的路徑你在瀏覽器里訪問(wèn)這個(gè)路徑就能看到PHP文件被解析出來(lái)的效果。Pikachu的文件上傳模塊還經(jīng)常結(jié)合“二次渲染”問(wèn)題也就是上傳成功后服務(wù)器會(huì)重新生成一張圖片把原來(lái)的內(nèi)容替換掉這時(shí)候直接上傳一句話木馬就會(huì)被清空。要繞過(guò)二次渲染得先上傳一張正常圖片下載被渲染后的版本再把PHP代碼注入到渲染后圖片的未被修改的區(qū)塊里然后再上傳。這個(gè)操作對(duì)新手來(lái)說(shuō)比較進(jìn)階可以先放著等理解了基礎(chǔ)上傳繞過(guò)再回頭試。5.2 Content-Type校驗(yàn)繞過(guò)的典型場(chǎng)景第二種限制是Content-Type校驗(yàn)服務(wù)端只允許image/jpeg類型的文件上傳。這種關(guān)卡的操作核心是上傳一個(gè)文本文件攔截請(qǐng)求把Content-Type改成image/png同時(shí)把文件名改成.php。如果服務(wù)器只檢查Content-Type不檢查擴(kuò)展名那么上傳的PHP文件就能直接執(zhí)行。這里有一個(gè)新手特別容易犯的錯(cuò)在Burp里改完Content-Type但忘記在文件內(nèi)容前面加一個(gè)合法的圖片文件頭。部分靶場(chǎng)和真實(shí)應(yīng)用會(huì)讀取文件頭來(lái)校驗(yàn)?zāi)?shù)比如必須包含F(xiàn)F D8 FF E0或GIF89a。如果只改Content-Type而文件內(nèi)容全是?php ... ?某些嚴(yán)格校驗(yàn)的關(guān)卡會(huì)直接報(bào)“不是圖片文件”于是你以為繞不過(guò)去。解決辦法就是構(gòu)造一個(gè)“圖片馬”文件頭是合法圖片的字節(jié)后面拼上PHP代碼再配合修改Content-Type和擴(kuò)展名。Pikachu里還有一個(gè)場(chǎng)景是“黑白名單校驗(yàn)”。白名單只允許jpg/png/gif后綴黑名單屏蔽了php、asp、jsp等后綴。如果只對(duì)上一種可以用:、.phtml、.php3、.php5或者大小寫(xiě)變形來(lái)繞過(guò)。如果兩種都做那就需要找一個(gè)同時(shí)不在黑名單、又在白名單內(nèi)的后綴或者用上傳.htaccess覆蓋配置的方法讓服務(wù)器把某個(gè)擴(kuò)展名當(dāng)作PHP解析。5.3 上傳路徑探測(cè)與WebShell驗(yàn)證上傳成功后必須找到文件的實(shí)際路徑才算通關(guān)。Pikachu上傳接口的響應(yīng)里通常會(huì)直接返回存儲(chǔ)路徑。如果響應(yīng)里沒(méi)有可以通過(guò)目錄遍歷猜測(cè)比如http://localhost/pikachu/upload/下直接訪問(wèn)shell.php。拿到路徑之后用瀏覽器訪問(wèn)看是否返回了PHP代碼執(zhí)行結(jié)果。如果返回的是空白頁(yè)可能代碼本身沒(méi)輸出如果返回的是源碼說(shuō)明服務(wù)器沒(méi)有解析PHP而是把文件當(dāng)純文本給了瀏覽器這種情況就是“上傳成功但不可執(zhí)行”需要換個(gè)擴(kuò)展名或換一種繞過(guò)方式。注意本地靶場(chǎng)測(cè)試WebShell沒(méi)問(wèn)題但在任何真實(shí)環(huán)境里未經(jīng)授權(quán)上傳可執(zhí)行文件都是違法行為。本文所有示例都限定在Pikachu本地靶場(chǎng)請(qǐng)勿挪作他用。5.4 文件上傳漏洞的修復(fù)思路從修復(fù)角度看一個(gè)安全的文件上傳功能至少要做這幾件事擴(kuò)展名白名單校驗(yàn)并且不能只比較后綴要同時(shí)校驗(yàn)MIME類型和文件內(nèi)容頭。存儲(chǔ)路徑不可預(yù)測(cè)最好帶隨機(jī)文件名文件擴(kuò)展名不能跟隨原始文件名。上傳目錄禁止執(zhí)行腳本權(quán)限比如Nginx里去掉location的fastcgi處理Apache里禁止php處理器。這些修復(fù)思路Pikachu里當(dāng)然不會(huì)給你自動(dòng)修好但你在每個(gè)關(guān)卡通關(guān)后如果能自己思考“如果是開(kāi)發(fā)者我怎么堵上這個(gè)洞”那刷靶場(chǎng)的價(jià)值才真正體現(xiàn)出來(lái)了。Burp Suite在這個(gè)過(guò)程中只是工具真正練的是你的“請(qǐng)求分析-漏洞判斷-繞過(guò)分層-修復(fù)思考”這條鏈路。6. 其他高頻關(guān)卡補(bǔ)充RCE與SQL注入的Burp輔助思路6.1 RCE模塊命令拼接與Burp的編碼轉(zhuǎn)換Pikachu的RCE遠(yuǎn)程命令執(zhí)行關(guān)卡會(huì)讓你在輸入框里提交一個(gè)IP地址后端用它執(zhí)行ping命令。測(cè)試思路很簡(jiǎn)單如果輸入127.0.0.1正?;仫@是ping的結(jié)果如果輸入127.0.0.1 whoami并且回顯里出現(xiàn)了當(dāng)前用戶信息說(shuō)明命令拼接漏洞存在。Burp在這個(gè)關(guān)卡里作用不大因?yàn)樗褪且粋€(gè)手動(dòng)提交的過(guò)程直接用瀏覽器也行。但有一點(diǎn)值得用Burp當(dāng)命令里包含空格、管道符、分號(hào)時(shí)某些后端或WAF會(huì)做簡(jiǎn)單過(guò)濾。如果直接被攔截可以嘗試用URL編碼、雙重URL編碼或Tab替代空格。Burp的Decoder可以快速做URL編碼不用手動(dòng)轉(zhuǎn)換。比如whoami的URL編碼版本是who%61mi如果后端只是簡(jiǎn)單匹配關(guān)鍵字這種編碼就能繞過(guò)盡管PHP底層接收到的值仍然是原始的字符。6.2 SQL注入用Burp觀察報(bào)錯(cuò)信息與請(qǐng)求變化Pikachu的SQL注入關(guān)卡分?jǐn)?shù)字型和字符型。用Burp輔助的意義在于你可以清楚看到輸入內(nèi)容是如何拼接進(jìn)SQL語(yǔ)句的。比如數(shù)字型注入的URL是/?id1把id1改成id1 and 12如果響應(yīng)內(nèi)容和id1不一樣說(shuō)明參數(shù)參與了SQL查詢改成id1 union select 1,2,3看回顯的位次再逐步替換為字段查詢。新手在這個(gè)模塊里最普遍的問(wèn)題是頁(yè)面返回空白不知道是不是自己輸入姿勢(shì)不對(duì)。我的建議是先在Burp里發(fā)送一遍原始請(qǐng)求作為基線再發(fā)送注入請(qǐng)求對(duì)比響應(yīng)體的長(zhǎng)度和內(nèi)容。如果響應(yīng)長(zhǎng)度變化很大說(shuō)明語(yǔ)法方向可能是對(duì)的如果完全一致那可能是閉合符號(hào)不對(duì)需要試、、)等不同閉合方式。Burp的Comparer在這里又派上用場(chǎng)了把兩個(gè)響應(yīng)拖進(jìn)去對(duì)比差異比自己一行行看HTML源碼高效得多。6.3 用Burp保存并復(fù)盤(pán)每個(gè)模塊的請(qǐng)求記錄打靶場(chǎng)最容易出現(xiàn)的問(wèn)題就是“打完了就忘”。我自己養(yǎng)成的一個(gè)習(xí)慣是每通關(guān)一個(gè)模塊就把關(guān)鍵請(qǐng)求從Burp里導(dǎo)出存成JSON或txt文件標(biāo)注漏洞類型、繞過(guò)方法、響應(yīng)特征。后期復(fù)習(xí)的時(shí)候不需要重新搭建靶場(chǎng)直接翻這些請(qǐng)求就能回憶整個(gè)攻擊鏈。尤其像Pikachu這種多模塊靶場(chǎng)模塊間思路互相獨(dú)立不整理很快就會(huì)亂。如果你還想更進(jìn)一步可以用Burp的Project文件保存整個(gè)會(huì)話。這樣以后打開(kāi)Project能直接看到歷史請(qǐng)求、Intruder攻擊結(jié)果、Repeater里的所有修改記錄。唯一的建議是把Project文件放在專門(mén)目錄里不要混合多個(gè)靶場(chǎng)的流量否則項(xiàng)目文件會(huì)越滾越大檢索效率反而下降。7. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄7.1 問(wèn)題速查表問(wèn)題現(xiàn)象可能原因解決步驟Burp抓不到Pikachu請(qǐng)求代理沒(méi)生效 / 證書(shū)問(wèn)題先確認(rèn)瀏覽器代理再裝Burp證書(shū)最后看PROXY history里有無(wú)CONNECT之外請(qǐng)求靶場(chǎng)初始化白屏PHP版本太高 / MySQL連接異常換PHP7.4檢查數(shù)據(jù)庫(kù)賬號(hào)密碼確認(rèn)MySQL服務(wù)已啟動(dòng)Intruder爆破時(shí)響應(yīng)全一樣Payload位置選錯(cuò)檢查請(qǐng)求里username/password是否真的設(shè)成了變量可能在重復(fù)提交固定值上傳PHP文件不解析存儲(chǔ)目錄不可執(zhí)行 / 響應(yīng)頭類型錯(cuò)誤換擴(kuò)展名確認(rèn)上傳目錄是否允許腳本執(zhí)行訪問(wèn)路徑是否帶了解析邏輯帶token的爆破永遠(yuǎn)失敗token提取正則錯(cuò)誤先手動(dòng)請(qǐng)求一次確認(rèn)token在響應(yīng)中出現(xiàn)的格式再在Intruder里設(shè)置正確的正則提取越權(quán)測(cè)試全返回200鑒權(quán)邏輯在接口層已處理?yè)Q一個(gè)資源ID檢查Cookie是否被重置或改成不同方法再試7.2 新手最常踩的三個(gè)坑第一個(gè)坑是過(guò)度依賴掃描器。Burp的社區(qū)版沒(méi)有主動(dòng)掃描很多新手就想著去裝插件或買(mǎi)Pro實(shí)際上Pikachu的每個(gè)漏洞模塊用手動(dòng)分析半小時(shí)就能搞定。掃描器會(huì)告訴你“這里有SQL注入”但不會(huì)告訴你“為什么是這里、這個(gè)注入怎么利用、后端查詢邏輯長(zhǎng)什么樣”。這些只能靠手動(dòng)分析請(qǐng)求來(lái)理解。第二個(gè)坑是遇到攔截就放棄。Pikachu的RCE和文件上傳模塊里很多新手一看到“上傳失敗”或“命令被過(guò)濾”就卡住不知道該怎么繼續(xù)。其實(shí)辦法很簡(jiǎn)單回到Burp看請(qǐng)求看看攔截的是哪個(gè)參數(shù)、哪個(gè)層級(jí)。如果服務(wù)端用的是正則匹配你換一種大小寫(xiě)或編碼方式通常就能過(guò)去。卡住不可怕卡住之后沒(méi)有嘗試路徑才可怕。第三個(gè)坑是忽略響應(yīng)狀態(tài)碼的細(xì)節(jié)。200不代表成功302更不代表失敗。比如文件上傳成功之后服務(wù)器可能返回302重定向到列表頁(yè)但真正的文件已經(jīng)存到服務(wù)器上了如果你是看著瀏覽器頁(yè)面判斷的就會(huì)漏掉這個(gè)成功信號(hào)。把Burp里狀態(tài)碼和響應(yīng)體結(jié)合著分析比只看瀏覽器顯示可靠得多。7.3 獨(dú)家避坑技巧善用Burp的Logger和Project對(duì)比功能最后分享一個(gè)我用得最多的組合拳Burp的Logger Project保存。Logger可以記錄所有經(jīng)過(guò)Burp的請(qǐng)求包括那些你沒(méi)有在Proxy里仔細(xì)看的請(qǐng)求比如CSS、JS、圖片資源里的Cookie信息。在刷Pikachu時(shí)偶爾會(huì)出現(xiàn)“某個(gè)隱藏接口被某個(gè)JS調(diào)用但頁(yè)面上看不到”的情況從Logger里就能快速翻出來(lái)。Project保存則讓我能在換機(jī)器、換環(huán)境后繼續(xù)之前的進(jìn)度不會(huì)因?yàn)橹匦屡渲枚鴣G數(shù)據(jù)。我個(gè)人的習(xí)慣是把同一個(gè)靶場(chǎng)的所有測(cè)試放在一個(gè)Project文件里每個(gè)模塊起一個(gè)標(biāo)簽頁(yè)RCE的嘗試、上傳的嘗試都保留著復(fù)盤(pán)時(shí)一目了然。8. 寫(xiě)在最后的幾句大實(shí)話刷完P(guān)ikachu之后我對(duì)Burp Suite的掌握程度比之前刷十篇教程都扎實(shí)。原因很簡(jiǎn)單靶場(chǎng)逼著你去分析每個(gè)請(qǐng)求、構(gòu)造每個(gè)payload、調(diào)試每個(gè)失敗的嘗試這種“問(wèn)題導(dǎo)向”的學(xué)習(xí)效率遠(yuǎn)高于“功能導(dǎo)向”的教程瀏覽。要我說(shuō)Burp Suite真正難的不是學(xué)功能按鈕而是培養(yǎng)一種“請(qǐng)求敏感度”看到一個(gè)參數(shù)能立刻想到它可以怎么改看到一個(gè)響應(yīng)能判斷出漏洞是否觸發(fā)。Pikachu的價(jià)值就是幫你把這個(gè)敏感度練出來(lái)。等你能不看教程獨(dú)立通關(guān)暴力破解和文件上傳模塊的時(shí)候再看真實(shí)環(huán)境的Web應(yīng)用思路就會(huì)完全不一樣。