戰(zhàn):從JDK配置到漏洞靶場(chǎng)入門)
如果你正在Windows上找一套能真正“手動(dòng)玩起來”的Web安全訓(xùn)練環(huán)境WebGoat 8.2.2應(yīng)該會(huì)被很多人推薦。它是由OWASP維護(hù)的一套開源靶場(chǎng)本質(zhì)是一個(gè)故意寫滿漏洞的Java Web應(yīng)用內(nèi)置了SQL注入、XSS、CSRF、路徑穿越、身份認(rèn)證缺陷、加密問題等幾十個(gè)課程。相比DVWA這類偏傳統(tǒng)PHP靶場(chǎng)WebGoat把漏洞講解和實(shí)驗(yàn)操作放在同一個(gè)頁面里提交結(jié)果后立刻知道對(duì)錯(cuò)學(xué)習(xí)反饋非常直接。這篇文章我準(zhǔn)備按自己實(shí)際操作過的流程來寫目標(biāo)很明確從JDK版本開始一步步在Windows 10/11上把WebGoat 8.2.2下載下來、啟動(dòng)成功、注冊(cè)賬號(hào)、進(jìn)入第一堂課。同時(shí)會(huì)把Windows環(huán)境下最容易翻車的地方比如Java版本不匹配、8080端口被占用、防火墻攔截、中文亂碼等全部攤開講清楚。無論你是剛?cè)腴T安全的學(xué)生還是工作里需要補(bǔ)漏洞知識(shí)的開發(fā)、運(yùn)維都能照著這份說明把環(huán)境跑起來并且知道接下來怎么有效率地刷課程。1. 為什么首選WebGoat 8.2.2這類“故意留洞”的應(yīng)用練手1.1 靶場(chǎng)應(yīng)用到底解決什么問題學(xué)Web安全最尷尬的一點(diǎn)是不能拿真實(shí)網(wǎng)站練手但只在書本上背漏洞原理又根本記不住。靶場(chǎng)應(yīng)用就是為了解決這個(gè)矛盾。它模擬的是一個(gè)功能完整的教學(xué)網(wǎng)站有登錄、注冊(cè)、個(gè)人資料、購物車、評(píng)論留言等常見模塊但每個(gè)模塊被刻意植入了一個(gè)或多個(gè)安全缺陷。攻擊這些漏洞不再是非法的而是課程的一部分。WebGoat和別的靶場(chǎng)不同的一點(diǎn)是它的每個(gè)練習(xí)都帶教師機(jī)和評(píng)分邏輯。你在頁面上輸入payload、修改請(qǐng)求、上傳文件它會(huì)判斷你是對(duì)是錯(cuò)并且給出提示。這種“即做即評(píng)”的方式尤其適合自學(xué)的人因?yàn)槟悴恍枰~外找人給你看結(jié)果提交之后頁面直接告訴你答對(duì)了還是答錯(cuò)了。如果你已經(jīng)看過一些安全崗位的面試題你會(huì)發(fā)現(xiàn)題目里經(jīng)常出現(xiàn)“OWASP Top 10”。WebGoat 8.x的課程分布基本就是圍繞Top 10來組織的做完一遍等于把主流應(yīng)用層漏洞都過了一遍。1.2 我為什么最終選定8.2.2這個(gè)版本我最早接觸WebGoat是7.x版本那時(shí)候需要下載WAR包再丟到Tomcat里部署光環(huán)境就能折騰掉半天。后來切到8.x系列情況好了非常多因?yàn)樗赟pring Boot自帶Web容器直接一條java -jar命令就能啟動(dòng)。至于為什么鎖定8.2.2而不是8.1或8.3主要是兩點(diǎn)。第一8.2.2在官方GitHub Releases頁面里是維護(hù)比較完整的一個(gè)版本修復(fù)過舊版里一些課程無法提交、誤判答案的問題第二8.x版本的WebWolf整合度更高很多課程不是讓你在主頁面里悶頭寫payload而是需要配合WebWolf接收郵件、查看請(qǐng)求、上傳文件這種“主程序輔助工具”的模式比舊版更接近真實(shí)工作流。當(dāng)然每個(gè)版本的課程列表會(huì)有微調(diào)但核心漏洞類型是穩(wěn)定的。不必執(zhí)著于一定要刷到最新小版本把8.2.2跑熟再去玩8.3甚至9.x都會(huì)很順。2. 環(huán)境準(zhǔn)備JDK版本和下載源不準(zhǔn)備好后面全是坑2.1 JDK安裝與JAVA_HOME配置WebGoat 8.2.2是基于Java的所以第一步是確保電腦里有合適的JDK。我建議在Windows上裝Java 17至少也要Java 11。Java 8肯定跑不起來啟動(dòng)會(huì)直接拋UnsupportedClassVersionErrorJava 21我也實(shí)測(cè)過基本能跑但為了保證課程里的加密實(shí)驗(yàn)不受太新特性的影響還是首選17這個(gè)LTS版本。下載JDK的方式有兩種安裝包或zip免安裝包。我習(xí)慣用zip版本因?yàn)樗挥绊懴到y(tǒng)里已有的其他Java項(xiàng)目也不需要運(yùn)行一堆安裝器。把zip解壓到一個(gè)純英文路徑比如D:\Java\jdk-17.0.10然后配置環(huán)境變量右鍵“此電腦” → 屬性 → 高級(jí)系統(tǒng)設(shè)置 → 環(huán)境變量。在系統(tǒng)變量里新建JAVA_HOME值填D:\Java\jdk-17.0.10。雙擊Path點(diǎn)擊“新建”輸入%JAVA_HOME%\bin。重新打開一個(gè)cmd窗口執(zhí)行java -version確認(rèn)輸出是17。這里有個(gè)Windows老用戶都容易踩的坑改了環(huán)境變量后之前已經(jīng)打開的cmd或PowerShell窗口不會(huì)自動(dòng)讀取新配置你必須重新開一個(gè)新窗口。如果你在舊窗口里執(zhí)行java -version發(fā)現(xiàn)還是老版本別覺得奇怪新開窗口再看。如果不想動(dòng)全局環(huán)境變量也可以不配JAVA_HOME直接在用絕對(duì)路徑啟動(dòng)。命令大概是這樣的D:\Java\jdk-17.0.10\bin\java -jar webgoat-server-8.2.2.jar這樣能避免和電腦上其他依賴Java的程序沖突。2.2 從哪下載文件名叫什么下載地址首選GitHub上WebGoat官方倉庫的Releases頁面找到8.2.2對(duì)應(yīng)的發(fā)布項(xiàng)下載名叫webgoat-server-8.2.2.jar的文件。注意不要下成Source code壓縮包那個(gè)是源碼不能直接運(yùn)行。這個(gè)jar包不算大幾十MB比下載一個(gè)IDE輕多了。下載完成后建議專門建一個(gè)干凈的目錄比如C:\webgoat\把jar包放進(jìn)去。這樣做有幾個(gè)好處一是WebGoat運(yùn)行時(shí)會(huì)生成HSQLDB數(shù)據(jù)庫文件和日志文件集中在一個(gè)目錄里方便清理二是以后想備份學(xué)習(xí)進(jìn)度直接把這個(gè)目錄拷走就行。如果你下載速度不理想也可以找鏡像站。但我要提醒一句很多鏡像上的版本停留在7.x不一定有8.2.2。所以最穩(wěn)妥的方式還是從官方渠道拿下載慢就換一個(gè)網(wǎng)絡(luò)環(huán)境慢慢等。3. 在Windows上跑起jar包的三種方式3.1 方式一直接java -jar啟動(dòng)最推薦在cmd里進(jìn)入jar所在目錄執(zhí)行java -jar webgoat-server-8.2.2.jar啟動(dòng)后你會(huì)看到Spring Boot風(fēng)格的日志。關(guān)鍵信息是這句Tomcat initialized with port(s): 8080 (http)看到這句話說明WebGoat主程序正在監(jiān)聽8080端口。接著等日志里出現(xiàn)Started WebGoat in xx seconds就說明啟動(dòng)完成。注意第一次啟動(dòng)因?yàn)橐跏蓟瘮?shù)據(jù)庫、創(chuàng)建課程數(shù)據(jù)耗時(shí)可能比較久30秒甚至更慢都屬正常。有些新手看到光標(biāo)卡住就反復(fù)CtrlC結(jié)果進(jìn)程沒殺干凈反而造成下次啟動(dòng)異常。啟動(dòng)成功后瀏覽器訪問http://localhost:8080/WebGoat路徑里的/WebGoat必須帶上因?yàn)楦窂絟ttp://localhost:8080顯示的只是一個(gè)導(dǎo)航頁不是課程界面。如果8080端口已經(jīng)被別的程序占用可以換端口java -jar webgoat-server-8.2.2.jar --server.port8081WebWolf的端口也可以一并改掉java -jar webgoat-server-8.2.2.jar --server.port8081 --webwolf.port90913.2 方式二用Maven從源碼跑適合進(jìn)階學(xué)習(xí)WebGoat是開源Maven工程。如果你不只是想做題還想看漏洞背后的Java代碼可以選擇用源碼方式啟動(dòng)git clone https://github.com/WebGoat/WebGoat.git cd WebGoat git checkout v8.2.2 mvn clean install安裝完成后啟動(dòng)webgoat-server模塊即可。這個(gè)方式對(duì)我來說最大的價(jià)值是可以隨時(shí)打開IDE看lessons目錄下每個(gè)課程的后端實(shí)現(xiàn)弄清楚漏洞到底是哪一行代碼沒做校驗(yàn)這是單純?cè)诰W(wǎng)頁上點(diǎn)來點(diǎn)去學(xué)不到的。但它的門檻也擺在那里。Maven第一次構(gòu)建要拉一大堆依賴網(wǎng)絡(luò)差的時(shí)候等半天是很正常的。如果只是入門我建議先跳過這種方式用jar包跑通之后想深入代碼再回來。3.3 方式三用Docker Desktop跑干凈但別踩版本坑Windows上如果已經(jīng)裝了Docker DesktopWebGoat也可以直接用容器跑。它的好處是不用在宿主機(jī)上配置JDK也不會(huì)污染系統(tǒng)環(huán)境。一般拉取官方鏡像的命令類似docker run -d -p 8080:8080 -p 9090:9090 webgoat/webgoat-8.0但這里有一個(gè)我不太滿意的點(diǎn)官方Docker鏡像的tag不一定和GitHub Release版本同步。有時(shí)候你拉下來的鏡像實(shí)際版本是8.0或8.1界面和8.2.2略有差異。所以如果對(duì)版本有嚴(yán)格要求我還是建議用jar包。另一個(gè)問題是Docker Desktop在Windows上依賴Hyper-V或者WSL2舊機(jī)器上經(jīng)常會(huì)遇到虛擬化沒啟用、WSL內(nèi)核更新失敗之類的麻煩。問題繞一圈回來反而比直接跑jar更折騰。3.4 三種方式怎么選啟動(dòng)方式依賴推薦度適合人群java -jar僅JDK最推薦絕大多數(shù)學(xué)習(xí)者M(jìn)aven源碼JDK Maven 網(wǎng)絡(luò)進(jìn)階選擇想閱讀源碼的人DockerDocker Desktop備選電腦上已有Docker的人我的建議很直接如果你不是專門做Java開發(fā)的也沒裝過Docker直接用方式一。把所有精力留給后面的課程不要在環(huán)境搭建上消耗熱情。4. 啟動(dòng)后的正確打開方式注冊(cè)、登錄和WebWolf4.1 瀏覽器訪問路徑和首次注冊(cè)啟動(dòng)完成后瀏覽器打開http://localhost:8080/WebGoat第一次訪問會(huì)被引導(dǎo)到注冊(cè)頁面。用戶名、密碼都是你自己填的存儲(chǔ)在WebGoat本地的HSQLDB數(shù)據(jù)庫里并非任何線上賬號(hào)和你的GitHub賬號(hào)也沒關(guān)系。因?yàn)槭潜镜匕袌?chǎng)密碼不用搞得很復(fù)雜但一定要記住因?yàn)楹竺娴腤ebWolf也要用同一套賬號(hào)密碼登錄。這里有個(gè)身份模型要提前知道WebGoat的課程里會(huì)區(qū)分普通用戶和不同角色權(quán)限部分越權(quán)課程會(huì)讓你用兩個(gè)不同的賬號(hào)做對(duì)比實(shí)驗(yàn)。所以注冊(cè)時(shí)不用只建一個(gè)賬號(hào)后面按題目要求多建幾個(gè)也行數(shù)據(jù)庫都能存下。4.2 WebWolf的聯(lián)動(dòng)作用WebWolf是WebGoat 8.x里的配套輔助應(yīng)用默認(rèn)端口是9090。主程序啟動(dòng)成功后訪問http://localhost:9090/WebWolf/login同樣用剛才注冊(cè)的賬密登錄。你可能很快會(huì)發(fā)現(xiàn)光在WebGoat主頁面里刷題是不夠的。很多課程會(huì)明確告訴你“把結(jié)果發(fā)送到WebWolf”或者“從WebWolf中獲取一段內(nèi)容”。舉幾個(gè)實(shí)際場(chǎng)景釣魚郵件課程WebWolf里會(huì)有一個(gè)模擬收件箱你必須登錄WebWolf查看“受害用戶”收到的郵件內(nèi)容才能拿到下一步的密鑰。請(qǐng)求調(diào)試課程WebWolf提供一個(gè)帶日志的請(qǐng)求接收器你把WebGoat的請(qǐng)求轉(zhuǎn)發(fā)到WebWolf的URL上它能回顯你的Header、Body等原始請(qǐng)求數(shù)據(jù)。文件上傳課程上傳后的文件會(huì)出現(xiàn)在WebWolf的文件列表里你需要回來查看文件是否上傳成功并分析存儲(chǔ)路徑。如果你沒有啟動(dòng)WebWolfWebGoat自己也能運(yùn)行但很多課程的進(jìn)度會(huì)卡住。所以每次啟動(dòng)時(shí)最好把兩個(gè)端口都確認(rèn)一遍主程序8080、WebWolf 9090。4.3 第一次做題時(shí)看到的界面是什么樣的登錄WebGoat后左側(cè)是課程目錄右側(cè)是題目描述和交互區(qū)。有的題目要求你在輸入框里填參數(shù)有的要求你直接修改URL請(qǐng)求還有的要求你構(gòu)造一段HTTP報(bào)文發(fā)送到指定接口。課程提交后頁面會(huì)立刻給出“Correct”或“Wrong”的反饋并附上簡(jiǎn)短解釋。這種即時(shí)反饋比看書高效得多也是我推薦人們用WebGoat入門的原因——錯(cuò)了能立刻知道錯(cuò)在哪不用猜。5. Windows安裝時(shí)最常見的幾個(gè)坑以及我的排查過程5.1 Java版本不對(duì)時(shí)出現(xiàn)的異常我第一次裝8.2.2時(shí)也翻過車。當(dāng)時(shí)機(jī)器上默認(rèn)Java是8啟動(dòng)后控制臺(tái)里出現(xiàn)一大段日志里面有一句關(guān)鍵詞UnsupportedClassVersionError后面跟著一個(gè)class文件版本號(hào)。這個(gè)報(bào)錯(cuò)本身很直白說明class是更高版本編譯的當(dāng)前JVM讀不了。排查思路其實(shí)很簡(jiǎn)單當(dāng)前cmd里執(zhí)行java -version確認(rèn)實(shí)際生效的版本。如果顯示的是舊版本檢查環(huán)境變量JAVA_HOME和Path里有沒有舊JDK路徑排在前面。修正環(huán)境變量后重新開一個(gè)cmd窗口再次確認(rèn)版本。如果實(shí)在不想改全局變量就直接用JDK絕對(duì)路徑啟動(dòng)jar。我后來遇到了更隱蔽的情況電腦上裝了Oracle JDK和OpenJDK兩個(gè)版本系統(tǒng)Path里同時(shí)有兩條java路徑排在前面的先生效。Windows在執(zhí)行命令時(shí)會(huì)按Path里的順序查找不是說你裝了新JDK它就一定用新的。5.2 端口被占用導(dǎo)致啟動(dòng)失敗另一個(gè)高頻報(bào)錯(cuò)是Port 8080 was already in use。Windows下最常碰到這些情況本地其他Java服務(wù)或前端腳手架占了8080。Burp Suite默認(rèn)代理端口是8080如果你開著Burp再啟動(dòng)WebGoat必然沖突。上一次WebGoat進(jìn)程沒完全退出端口還被它占著。處理方式分兩步走。先查占用netstat -ano | findstr 8080記下最后一列的PID然后結(jié)束進(jìn)程taskkill /PID 你的PID /F但這個(gè)操作要小心別把其他正經(jīng)服務(wù)誤殺了。所以我后來更推薦換端口java -jar webgoat-server-8.2.2.jar --server.port8088改完端口后訪問地址也要跟著變否則還是打不開。5.3 防火墻彈窗和瀏覽器訪問不了Windows第一次運(yùn)行Java程序時(shí)會(huì)彈一個(gè)防火墻提示是否允許Java通過防火墻。很多人習(xí)慣性點(diǎn)取消然后發(fā)現(xiàn)瀏覽器訪問localhost:8080始終轉(zhuǎn)圈。這是因?yàn)镴ava進(jìn)程被Windows防火墻攔截了。如果你已經(jīng)踩了這個(gè)坑可以去“Windows安全中心 → 防火墻和網(wǎng)絡(luò)保護(hù) → 允許應(yīng)用通過防火墻”里找到Java相關(guān)的條目勾選專用和公用網(wǎng)絡(luò)?;蛘吒纱喟讶∠膹棿爸匦掠|發(fā)一次。這里分享一個(gè)排查技巧瀏覽器打不開時(shí)不要只看瀏覽器。先在cmd里試一下curl http://localhost:8080/WebGoat如果有HTML內(nèi)容返回說明服務(wù)本身沒問題問題出在瀏覽器代理、插件或防火墻規(guī)則上如果curl也連不上才優(yōu)先懷疑端口或服務(wù)狀態(tài)。我遇到過一個(gè)奇葩情況瀏覽器開了系統(tǒng)代理請(qǐng)求被代理轉(zhuǎn)發(fā)到公網(wǎng)當(dāng)然訪問不到本地WebGoat。在瀏覽器代理設(shè)置里把localhost加入直連列表就好了。5.4 中文亂碼和日志顯示不全Spring Boot輸出的日志在Windows中文環(huán)境下偶爾會(huì)變成亂碼尤其是控制臺(tái)默認(rèn)編碼是GBK而日志內(nèi)容按UTF-8輸出的時(shí)候。解決方式很簡(jiǎn)單在cmd里先執(zhí)行chcp 65001把代碼頁切換到UTF-8再啟動(dòng)jar。這個(gè)操作不會(huì)影響WebGoat運(yùn)行只是讓日志可讀性更好。如果你用Windows Terminal直接在配置文件里把默認(rèn)編碼改掉也行。5.5 第一次啟動(dòng)慢、磁盤IO高別誤判成卡死WebGoat第一次啟動(dòng)時(shí)要初始化課程數(shù)據(jù)庫生成HSQLDB文件所以CPU和磁盤占用會(huì)明顯上升。用的是機(jī)械硬盤的話從執(zhí)行命令到訪問頁面可能真要等一兩分鐘。很多新手反復(fù)重啟結(jié)果數(shù)據(jù)庫第一次沒初始化完就被中斷下次啟動(dòng)又從頭來反而更慢。我的建議是啟動(dòng)后至少等90秒觀察日志是否還在往下打。只要日志在動(dòng)就別管它。如果實(shí)在想確認(rèn)服務(wù)是否已經(jīng)監(jiān)聽端口可以另開一個(gè)窗口執(zhí)行netstat -ano | findstr 8080看到LISTENING狀態(tài)說明端口已經(jīng)開了。5.6 安全軟件和瀏覽器插件的干擾360等殺毒軟件有時(shí)會(huì)把WebGoat生成的本地?cái)?shù)據(jù)庫文件或Java進(jìn)程當(dāng)風(fēng)險(xiǎn)行為攔截。我遇到的情況是運(yùn)行時(shí)某個(gè)課程需要的臨時(shí)文件被安全軟件移入隔離區(qū)導(dǎo)致課程提交后收不到預(yù)期結(jié)果。所以跑WebGoat時(shí)可以先把WebGoat目錄加入殺軟白名單或者暫時(shí)退出安全軟件的主動(dòng)防御模塊。還有一類干擾來自瀏覽器插件。有些翻譯插件、廣告攔截插件會(huì)對(duì)頁面請(qǐng)求做改寫導(dǎo)致WebGoat提交時(shí)報(bào)錯(cuò)。如果你發(fā)現(xiàn)某個(gè)課程怎么都提交不對(duì)可以先開一個(gè)無痕窗口關(guān)掉所有插件再試。6. 跑通安裝后如何用8.2.2的課程把價(jià)值最大化6.1 第一輪學(xué)習(xí)建議按“攻擊類別”走而不是按編號(hào)WebGoat 8.2.2的課程目錄是按漏洞類別分的不是一個(gè)編號(hào)從頭做到尾就行。我的建議順序是General課程先熟悉HTTP基本概念、WebGoat界面和請(qǐng)求工具。Injection系列包含SQL注入、NoSQL注入這是最經(jīng)典的漏洞類型。Authentication and Authorization學(xué)習(xí)登錄繞過、會(huì)話管理和越權(quán)。Path Traversal理解文件路徑可控帶來的風(fēng)險(xiǎn)。XSS相關(guān)課程區(qū)分反射型、存儲(chǔ)型和DOM型。CSRF理解跨站請(qǐng)求偽造的攻擊前提和防御手段。Web Services熟悉REST接口里容易出現(xiàn)的漏洞。這個(gè)順序基本覆蓋了OWASP Top 10的主流類別而且難度是從簡(jiǎn)單到復(fù)雜的不會(huì)一上來就讓新手懷疑人生。6.2 把失敗當(dāng)學(xué)習(xí)素材而不是直接搜答案WebGoat的陷阱在于搜索引擎里已經(jīng)有大量題解。遇到卡住就搜答案確實(shí)能過但收獲會(huì)少一大半。我自己刷的時(shí)候的做法是每次提交失敗先看WebGoat頁面下方的提示再把請(qǐng)求包里涉及的參數(shù)對(duì)應(yīng)到課程知識(shí)點(diǎn)盡量自己構(gòu)造幾組不同的payload試。我比較推薦的復(fù)盤方式是建立一個(gè)自己的文檔記下每個(gè)課程的請(qǐng)求URL、提交參數(shù)、我的錯(cuò)誤payload和最終正確答案。這種方式對(duì)面試準(zhǔn)備非常有幫助因?yàn)槊嬖嚬賳柕降牟皇恰澳氵€記得某個(gè)靶場(chǎng)的題解嗎”而是“你怎么理解這個(gè)漏洞的利用和修復(fù)”。6.3 保持練習(xí)邊界WebGoat再怎么說也是“故意留洞”的應(yīng)用它在本地運(yùn)行就是合法的實(shí)驗(yàn)環(huán)境。但同樣的攻擊手法換到任何一臺(tái)沒有授權(quán)的系統(tǒng)上性質(zhì)就完全不同了。尤其是國(guó)內(nèi)對(duì)非授權(quán)訪問、非法入侵有明確的法律紅線學(xué)習(xí)過程中一定要把邊界意識(shí)刻進(jìn)習(xí)慣里。我給自己定的規(guī)矩很簡(jiǎn)單靶場(chǎng)只允許在本機(jī)或自己控制的實(shí)驗(yàn)網(wǎng)絡(luò)里運(yùn)行絕不主動(dòng)掃描、探測(cè)、攻擊任何不屬于自己的目標(biāo)。這句話放在這里不是為了喊口號(hào)而是每個(gè)安全從業(yè)者必須內(nèi)化的底線。6.4 進(jìn)階擴(kuò)展方向把WebGoat 8.2.2的基礎(chǔ)課程刷完后可以順手做幾件延伸的事打開WebGoat源碼看每個(gè)lesson的后端Java實(shí)現(xiàn)找到漏洞對(duì)應(yīng)的那幾行代碼思考修復(fù)方式。用Burp Suite或OWASP ZAP掛上代理把WebGoat的課程請(qǐng)求完整過一遍抓包工具熟悉攔截、重放、修改請(qǐng)求的流程。把SQL注入課程中的payload搬到本地?cái)?shù)據(jù)庫里做對(duì)照實(shí)驗(yàn)理解數(shù)據(jù)庫語法和閉合方式比單純背payload有用得多。我實(shí)際帶過的一些新人在堅(jiān)持把WebGoat從General刷到Web Services之后再看真實(shí)項(xiàng)目里的應(yīng)用層漏洞報(bào)告都會(huì)有一種“這個(gè)我在WebGoat里見過”的熟悉感。這也是我始終推薦WebGoat的原因它不是在教你怎么背答案而是把安全測(cè)試?yán)镒詈诵牡摹皹?gòu)造輸入、觀察現(xiàn)象、調(diào)整思路”這套動(dòng)作練到成為身體記憶。最后再分享一個(gè)小技巧WebGoat的數(shù)據(jù)庫文件和日志都生成在你運(yùn)行jar命令的那個(gè)目錄下。做到一半想備份進(jìn)度直接備份整個(gè)目錄就行想徹底重置從頭再刷別急著刪庫文件先復(fù)制一份留檔再清理這樣萬一后面想回去對(duì)比某道題的結(jié)果還能找得到。