)
先說下這道題的背景。ACTF2020新生賽是給剛接觸CTF不久的選手準備的一場入門級比賽Upload題是Web方向最經(jīng)典的文件上傳類型。對于剛?cè)肟覹eb安全的人來說這道題的價值不在于知識點多深而在于它把文件上傳漏洞從看文章理解原理變成了親手打一遍的完整閉環(huán)。我第一次做這道題的時候卡了很久甚至一度卡在后端到底過濾了什么這個問題上。后來把上傳文件名、Content-Type、文件頭全部試了一遍才意識到這類題的套路其實是固定的先分析過濾規(guī)則再構(gòu)造對應(yīng)繞過方式最后用工具完成連接。這篇文章會以我實際做題的過程為主線把一句話木馬構(gòu)造、上傳繞過思路、蟻劍連接的整套流程都過一遍同時把我在這個過程中踩過的坑和排查方法整理出來。文章更適合剛接觸Web安全、準備入門CTF的讀者。如果你還不會寫一句話木馬也不用擔(dān)心看完第一部分你就能自己寫出來并理解它為什么能工作。1. 題目認知從一道新生賽Upload題說起1.1 這道題到底考什么文件上傳漏洞的考點看起來很集中應(yīng)用允許用戶上傳文件但對上傳內(nèi)容沒有做嚴格校驗導(dǎo)致攻擊者上傳了可被服務(wù)器解析的腳本文件。一旦這類腳本在服務(wù)器上運行攻擊者就能拿到一定權(quán)限后續(xù)無論是讀文件、執(zhí)行命令還是橫向移動都建立在上傳成功并解析成功這個前提上。不過在真實做題中你會發(fā)現(xiàn)這個前提沒那么容易達成。出題人會在上傳點后面加各種限制前端JavaScript校驗、后端Content-Type檢查、文件頭檢查、擴展名黑名單/白名單甚至還會對文件內(nèi)容做關(guān)鍵字過濾。ACTF2020新生賽的這道Upload題雖然難度不高但它把最常見的過濾方式都集中在了這一道題里。練好它上傳類的入門題目基本就掌握了大半。這道題沒有考特別激進的利用方式不需要你研究CVE、不需要分析框架漏洞核心就是上傳一個Webshell并用工具連接。上傳一句話木馬、用蟻劍連接是CTF里最標準的Webshell利用流程也是很多老手口中最簡單的Web題的典型代表。我記得一道類似題目的環(huán)境通常是一個普通的上傳頁面可能還會帶一個文件預(yù)覽功能。從用戶體驗來看它就是一個允許上傳圖片或個人文件的小應(yīng)用。但作為攻擊者我們首先想到的不是我想傳什么合規(guī)文件而是這個上傳點能不能讓我傳一個能被解析的PHP文件。這個思維切換是很多新手從普通用戶視角轉(zhuǎn)向安全視角的第一步。1.2 一句話木馬和蟻劍在題目里的定位先解釋一個概念。一句話木馬One-Line Web Shell指的就是代碼量極小、功能卻完整的后門腳本。以PHP為例最常見的寫法是?php eval($_POST[a]);?這行代碼表面上很簡短但它完成的事情不小接收外部POST請求中名為a的參數(shù)然后把參數(shù)值交給eval函數(shù)執(zhí)行。發(fā)送aphpinfo();服務(wù)器就會執(zhí)行phpinfo()發(fā)送asystem(ls);服務(wù)器就會執(zhí)行系統(tǒng)命令ls。從能執(zhí)行任意PHP代碼這個角度講它已經(jīng)是一個完整的Webshell了。但問題來了如果每次執(zhí)行命令都要手動構(gòu)造POST請求效率太低了。尤其是一個命令輸出幾百行結(jié)果時用瀏覽器或命令行工具肉眼去看體驗很差。這時候蟻劍就派上用場了。蟻劍AntSword是目前CTF和滲透測試里最常用的Webshell管理工具之一。它做的事情可以理解成一個專門為Webshell打造的圖形化終端你把Webshell的URL和連接密碼填進去它就能幫你管理這個后門包括文件管理、虛擬終端、數(shù)據(jù)庫管理等功能。用了蟻劍之后上傳一句話木馬相當(dāng)于在服務(wù)器上裝了一個遠程控制臺你可以像操作自己電腦一樣查看文件、執(zhí)行命令。所以這道題的完整鏈路是上傳一句話木馬 - 找到木馬文件的URL - 在蟻劍里配置URL和密碼 - 連接成功 - 在虛擬終端中查找flag文件。這五個步驟里難點在第二步繞過上傳限制其他步驟只要熟練掌握基本不會出錯。2. 核心原理解析文件上傳漏洞為什么會出現(xiàn)2.1 上傳功能的信任邊界很多人第一次接觸文件上傳漏洞時會有一個疑惑為什么上傳一個圖片會變成執(zhí)行代碼問題就出在應(yīng)用信任了不該信任的東西。正常情況下的上傳流程是用戶選擇一個文件瀏覽器把文件內(nèi)容發(fā)送到服務(wù)器服務(wù)器保存到一個指定的目錄。如果服務(wù)器只關(guān)心文件能不能被保存下來而對這個文件被保存成什么類型、將來會不會被執(zhí)行沒有約束那就出了大問題。比如一個站點接受用戶上傳頭像但它把文件直接保存在web目錄下文件名和擴展名都沿用用戶提交的。如果攻擊者上傳的是一個包含PHP代碼的文件擴展名是.php服務(wù)器就會把它放在web目錄中。當(dāng)其他人訪問這個文件的URL時服務(wù)器會把其中的PHP代碼當(dāng)作應(yīng)用程序執(zhí)行而不是當(dāng)作靜態(tài)資源返回。這樣一來上傳操作就從保存文件變成了在服務(wù)器上部署了一段可執(zhí)行代碼。我用一個生活類比來解釋一下這個過程相當(dāng)于房東允許租客往自己家搬箱子但不檢查箱子里裝的是什么。租客搬進來的箱子里藏了一個能自動運行的程序房東又把這個箱子放在了廚房可執(zhí)行目錄里。程序一運行可能就把整個房子翻了個底朝天。在做題時這個信任邊界體現(xiàn)在哪幾個位置呢大致有三個瀏覽器端前端JavaScript校驗服務(wù)端接收文件時的類型檢查Content-Type、文件頭等服務(wù)端保存文件時的擴展名/目錄策略這三個位置對應(yīng)三種不同的繞過思路后面我會分別展開。2.2 一句話木馬為什么能生效一句話木馬能生效核心前提是服務(wù)器把上傳的文件當(dāng)作PHP代碼來解析。這取決于兩個條件第一文件上傳到web目錄下且能被外部通過URL訪問到。如果上傳的路徑是用戶不可預(yù)覽的那攻擊者就找不到觸發(fā)點木馬等于白傳。這就是為什么上傳后頁面會回顯文件路徑或文件名這個信息在利用時要格外留意。第二文件中包含的PHP代碼必須完整保留。有的應(yīng)用會對文件內(nèi)容做處理比如轉(zhuǎn)義引號、過濾關(guān)鍵字、刪除某些字符串。如果一句話木馬里的eval或$_POST被過濾掉了代碼就無法執(zhí)行。一個經(jīng)驗總結(jié)一句話木馬的寫法不止一種不是因為寫法花哨而是每種寫法應(yīng)對的過濾規(guī)則不同。比如有的環(huán)境把eval列入了黑名單你可以用assert有的環(huán)境禁止字母開頭的函數(shù)你可以用可變函數(shù)有的環(huán)境對單引號敏感你可以換雙引號。所以做題時如果發(fā)現(xiàn)傳上去但連不上除了檢查路徑還要想想是不是代碼本身被過濾了。PHP里常見的一句話木馬變種有?php eval($_POST[a]);? ?php assert($_POST[a]);? ?php system($_POST[a]);? ?php $_POST[a]($_POST[b]);?其中第一種最常見第二個和第四個用于繞過部分函數(shù)黑名單。第三個嚴格說不是執(zhí)行任意代碼而是執(zhí)行系統(tǒng)命令但在蟻劍里可以通過選擇相應(yīng)的連接方式來使用。2.3 蟻劍在解題中解決什么問題如果沒有蟻劍利用一個Webshell的過程是這樣的手工構(gòu)造POST請求攜帶要執(zhí)行的命令再從響應(yīng)中提取結(jié)果。命令一多、結(jié)果一長你就會發(fā)現(xiàn)這個流程痛苦到不行。蟻劍在解題中的角色可以理解為把Webshell連接過程可視化、自動化。它內(nèi)置了多種通訊協(xié)議和數(shù)據(jù)編碼方式可以適配不同木馬寫法。在CTF題里我最常用的功能有三個。第一個是文件管理。連接成功后左邊是目錄樹右邊是文件列表你可以像用FTP客戶端一樣瀏覽服務(wù)器上的文件。做CTF時flag往往就是一個普通文件可能在根目錄、可能在/flag、可能在某個隱藏目錄里用文件管理器翻一遍就能找到。第二個是虛擬終端。它通過Webshell執(zhí)行系統(tǒng)命令并在界面里模擬出一個終端的樣子。你可以輸入ls、cat /flag這類命令。如果Webshell執(zhí)行命令受限虛擬終端就會報錯或沒有輸出這時要回到木馬本身去排查。第三個是插件系統(tǒng)。蟻劍有很多插件比如端口掃描、繞過disable_functions等。不過在新手賽的這道題里用不到太復(fù)雜的插件能連上、能列目錄、能執(zhí)行命令就夠了。這里我想強調(diào)一點蟻劍不是黑客專用工具它是開源的安全測試工具在CTF、靶場練習(xí)、授權(quán)滲透測試中很常見。用它的前提是這是題目環(huán)境或者你有授權(quán)這一點在后續(xù)實戰(zhàn)中一定要明確。好原理部分講清楚后接下來進入實操環(huán)節(jié)。3. 實操過程從上傳到拿flag的完整鏈路3.1 環(huán)境準備與信息收集先說一下我通常的做法。拿到一個CTF的Web題目第一步不是立刻上傳木馬而是先做信息收集。信息收集決定后面往哪個方向走尤其在上傳題里至少要搞清楚三個問題。第一個問題上傳點接受什么類型的文件頁面有沒有提示頁面源代碼里有沒有線索有些題目會在前端代碼里直接寫出允許的擴展名列表這個信息非常有用。第二個問題上傳成功后的文件存在哪個路徑頁面是否有回顯如果沒有回顯看看是否有文件預(yù)覽功能預(yù)覽功能往往會暴露真實的存儲路徑。第三個問題后端到底是PHP、JSP還是其他語言這個可以通過響應(yīng)頭、頁面后綴、報錯信息來判斷。以ACTF2020新生賽這道題為例打開靶場一般就是一個上傳頁面可能會有一個選擇文件的按鈕和一個上傳按鈕。我通常先上傳一個正常的文本文件或者圖片比如一個hello.txt看它返回什么。這一步是為了摸清規(guī)則不是為了拿flag。如果頁面回顯了上傳成功并且給出了訪問路徑比如/uploads/xxx.png那你就可以分析路徑結(jié)構(gòu)了。如果上傳失敗觀察錯誤信息是前端彈窗還是后端返回。這里有第一個實操技巧看到頁面之后先按F12看源代碼。有些題目的前端JavaScript直接限制了上傳后綴這種限制只存在于瀏覽器端改包就能繞過。更簡單的做法是直接把JS禁掉重試不過在后端也有校驗的賽題中改包才是通用解。我平時做信息收集時會抓包看一眼POST請求的內(nèi)容重點看Content-Type。這一項非常關(guān)鍵。有些后端校驗只看上傳請求包的Content-Type如果請求頭里寫的是application/octet-stream或者image/png它可能就直接放行或直接攔截。這比解析文件內(nèi)容快得多也更容易被繞。3.2 構(gòu)造一句話木馬搞定信息收集后開始準備彈藥——一句話木馬。這道題是PHP環(huán)境所以我的首選是?php eval($_POST[cmd]);?這里的cmd是我自己起的參數(shù)名蟻劍連接時密碼一欄就填cmd。參數(shù)名可以隨便起但要注意參數(shù)名要在蟻劍配置里保持一致否則連接時會提示連接失敗或返回空白。我的習(xí)慣是故意把一個明顯的命令參數(shù)暴露出來便于蟻劍識別。有些木馬會在代碼里加上判斷只有在收到預(yù)期參數(shù)時才會執(zhí)行比如?php eval($_POST[pass]);?這種寫法簡潔明了。如果你擔(dān)心太短被WAF規(guī)則匹配可以在前后補充一些干擾內(nèi)容但在新生賽里一般不需要這么做。另外如果你想練得更細一點可以先構(gòu)造一個phpinfo探針木馬驗證上傳是否生效?php phpinfo();?先傳這個文件如果訪問URL能看到PHP信息頁說明這個目錄可以被外部訪問、PHP解析正常接下來再把真正的Webshell傳上去。這個先探路再上馬的思路在新手期特別值得養(yǎng)成可以省下很多排查時間。3.3 繞過上傳限制的三種情況上傳限制到底限在哪一層直接決定了你要用什么方式繞。下面我按三種情況展開每一條都是實際做題中容易遇到的。情況一前端JavaScript校驗如果你選擇了一個.php文件頁面上立刻彈出只允許上傳圖片之類的提示而且根本沒有把請求發(fā)出去說明是前端JS在做限制。這時候有兩種繞過方式。第一種是修改上傳請求。用Burp Suite抓包把文件名改成1.php再觀察請求是否正常發(fā)送。前端校驗只攔你的點擊操作不攔構(gòu)造好的HTTP請求所以直接改包就能繞過。第二種是干脆繞開前端控制。在瀏覽器里禁用JavaScript或者用開發(fā)者工具刪除負責(zé)校驗的腳本標簽刷新頁面后再上傳。這種方法在某些題目里也能成功但我更推薦學(xué)改包因為后端校驗是更常見的場景改包是通吃的基礎(chǔ)技能。情況二后端Content-Type校驗把請求發(fā)給后端之后如果返回文件類型不正確之類的提示就要看Content-Type了。很多后端會檢查POST請求中文件部分的Content-Type要求必須是image/jpeg、image/png或image/gif之一。比如說你用Burp抓包看到請求中的文件部分寫著Content-Type: application/octet-stream把它改成Content-Type: image/png然后重新發(fā)送。注意這里要改的是multipart/form-data里具體文件的那個Content-Type字段不是整個請求頭里的Content-Type。改完以后很多只檢查Content-Type的后端就會放行。這也是新生賽里最常見的一種繞過方式。我當(dāng)時做這道題第一次就是因為只改了請求頭沒改文件部分的Content-Type結(jié)果連繞三次都沒成功。后來仔細一看才發(fā)現(xiàn)后端校驗的就是文件塊內(nèi)部的類型字段。這個細節(jié)如果不注意很容易讓你懷疑自己思路錯了。情況三后端擴展名/內(nèi)容校驗如果Content-Type也改了還是在攔截那后端可能在檢查擴展名或文件內(nèi)容。擴展名檢查一般有兩種策略黑名單禁止上傳.php、.asp、.jsp等危險后綴白名單只允許上傳.jpg、.png、.gif等安全后綴黑名單的繞過方式比較多常見的有大小寫繞過將.php改成.Php、.PHP適用于Windows服務(wù)器雙重擴展名shell.php.jpg如果后端只檢查最后一個后綴就會放行中間加特殊字符shell.php.、shell.php空格、shell.php%00可解析的其他后綴.phtml、.php3、.php5等白名單通常比較難繞但如果在代碼里存在邏輯漏洞比如允許上傳jpg但保存時拼接了文件名后綴之類的場景還是有機會的。不過新生賽一般不會白名單卡死多數(shù)是黑名單Content-Type的組合。內(nèi)容校驗主要看文件頭。很多應(yīng)用會檢查文件的前幾個字節(jié)是不是GIF89a、PNG、JPEG等圖片頭。這種情況下可以做一個圖片馬在圖片文件末尾拼接PHP代碼。執(zhí)行的時候解析器會跳過圖片內(nèi)容執(zhí)行后面的PHP代碼。一個簡單的構(gòu)造方式是準備一個正常的1x1像素的GIF文件用十六進制編輯器或腳本在文件末尾追加一句話木馬內(nèi)容上傳這個文件把后綴改成.php如果后端不檢查擴展名或者保持圖片后綴如果配合文件包含不過我后來做這道題時發(fā)現(xiàn)題目環(huán)境其實沒有要求必須做圖片馬直接把一句話木馬改一下擴展名就過了。這說明做題時先試最簡單的路徑每一步都做好記錄不要上來就整復(fù)雜方案。很多新手容易犯的毛病就是一上來做圖片馬明明普通繞過就夠了。3.4 用蟻劍建立會話上傳成功后頁面上通常會給出一個文件路徑。如果題目沒有回顯路徑可以嘗試從常見路徑去猜比如uploads目錄、upload目錄、files目錄或者結(jié)合題目源碼去分析。這道題我做完后上傳的文件一般在/uploads/目錄下URL類似http://靶場地址/uploads/shell.php接下來打開蟻劍。第一次使用蟻劍的人可能會被它的啟動方式搞暈因為蟻劍本身是Electron應(yīng)用加載器AntSword Loader負責(zé)加載源碼目錄。裝好依賴后打開加載器選擇源碼目錄就能啟動。啟動后界面比較簡潔就是一個常規(guī)的圖形化界面。連接Webshell的操作流程是右鍵點擊數(shù)據(jù)管理區(qū)域選擇添加數(shù)據(jù)在URL一欄填木馬的完整地址http://目標地址/uploads/shell.php在密碼一欄填一句話木馬里的參數(shù)名比如cmd編碼器先選擇默認的base64類型選擇PHP點擊測試連接如果成功會有提示連接成功后雙擊這個會話就能進入管理界面。到這里你已經(jīng)在服務(wù)器上擁有了一個可以執(zhí)行PHP代碼的入口。進入管理界面后我一般會先看文件管理功能。左邊是目錄樹右邊是文件列表。找flag的套路通常是先看根目錄點擊左側(cè)的/瀏覽根目錄下的文件尋找名稱里帶flag的文件比如flag、flag.txt、flag.php等。如果根目錄沒有再看常見敏感目錄比如/tmp、/var/www/html。如果文件管理器找不到就切換到虛擬終端用命令搜索。比如Linux環(huán)境下可以執(zhí)行find / -name flag* 2/dev/null這個命令會在整個文件系統(tǒng)里查找名字中帶flag的文件把錯誤輸出丟棄只顯示可讀的結(jié)果。找到后再執(zhí)行cat命令讀取內(nèi)容cat /flag讀完flag后把它提交到題目環(huán)境這道題就算完成了。整個過程看下來最核心的技術(shù)點其實就兩個一個是上傳繞過另一個是用工具管理Webshell。蟻劍只是讓第二步變得高效真正決定你做不做得出來的是第一步。4. 常見問題與排查技巧實錄4.1 文件傳不上去怎么辦這個問題出現(xiàn)頻率最高。根據(jù)我踩過的坑把排查順序列成一個速查表你按照順序查一遍基本能定位到問題?,F(xiàn)象可能原因排查/解決方向上傳時頁面直接彈窗提示前端JS校驗抓包改請求或禁用JS后再試返回文件類型不正確Content-Type校驗修改multipart中文件塊的Content-Type為image/png返回文件格式不支持擴展名校驗嘗試大小寫、雙重后綴、可解析后綴上傳成功但訪問是下載而不是解析PHP解析未生效檢查文件路徑、確認擴展名在可解析列表上傳成功但蟻劍連接失敗代碼被處理/函數(shù)被禁用換一句話木馬寫法檢查phpinfo路徑可用性這里我想特別強調(diào)一個容易犯的錯改Content-Type時有的新手把整個請求頭里的Content-Type改了但multipart里的文件塊還是原來的類型。后端讀取的是文件塊內(nèi)部的Content-Type所以改錯位置等于沒改。另外如果后端對擴展名做了黑名單過濾不要只試一次就放棄。這里有一個經(jīng)驗黑名單過濾往往會漏掉一些少見但可解析的后綴比如.phtml、.php3、.php5。在PHP運行環(huán)境里只要服務(wù)器配置了把對應(yīng)后綴當(dāng)作PHP來解析就可以用。建議多試幾個后綴不要只死磕.php。4.2 蟻劍連接失敗怎么排查連接失敗是第二高頻問題。我通常按照下面幾個步驟排查。第一步確認木馬文件真的存在。用瀏覽器直接訪問上傳后的URL如果返回的是404說明文件沒在這個路徑或者上傳時文件被改名了。此時回到上傳頁面看回顯的文件路徑到底是什么。第二步確認PHP代碼能被解析。訪問木馬URL時如果頁面返回的是源碼比如顯示出了?php eval...說明服務(wù)器沒有解析PHP代碼而是把它當(dāng)作文本返回了。這種情況通常是擴展名不在解析列表里建議換一種擴展名重新上傳。第三步確認參數(shù)密碼正確。蟻劍連接的密碼填的是一句話木馬里的參數(shù)名不是登錄口令。如果你上傳的是?php eval($_POST[cmd]);?密碼就是cmd。如果參數(shù)不匹配蟻劍會提示連接失敗或者返回空數(shù)據(jù)。第四步檢查是不是函數(shù)被禁用。有些環(huán)境會禁用eval、assert等危險函數(shù)。如果eval被禁用你可以臨時換一個不依賴eval的木馬比如?php system($_POST[cmd]);?這種方式直接執(zhí)行系統(tǒng)命令蟻劍連接時在連接類型里選擇命令執(zhí)行模式即可。不過要注意不同環(huán)境對函數(shù)的禁用情況不同多備幾套木馬寫法總沒壞處。還有一個容易被忽略的點上傳到服務(wù)器后文件內(nèi)容里可能會有一些隱藏字符或編碼問題。如果你在自己電腦上編輯木馬時用了帶BOM的UTF-8編碼PHP解析時會在文件開頭多出幾個不可見字符可能導(dǎo)致執(zhí)行失敗。解決方法是保存文件時選擇無BOM的UTF-8編碼或者用ASCII編碼保存一句話木馬。4.3 拿到shell之后flag在哪里這個問題看似簡單但很多新手會在拿到shell后卡殼。因為不同題目放置flag的位置不一樣有的在web目錄下有的在根目錄有的在環(huán)境變量里有的在數(shù)據(jù)庫里。ACTF2020新生賽的這道題規(guī)格比較標準flag一般是文件形式放在服務(wù)器上。我的查找順序是這樣的。首先看文件管理器的根目錄。點根目錄后不要只看一層注意目錄權(quán)限。如果某個目錄無法訪問說明當(dāng)前Webshell的權(quán)限不夠那就需要再用命令嘗試提權(quán)或換個路徑繞過。不過新生賽里權(quán)限通常給得比較足直接能讀到。其次用命令查找。在虛擬終端里執(zhí)行l(wèi)s -la / find / -name *flag* 2/dev/null如果find命令不可用可以改用grep -r flag{ / 2/dev/null不過grep整個根目錄會比較耗時可以先在常見的web目錄里查比如/var/www/html、/tmp、/opt等。最后如果flag是base64編碼或者其他編碼讀出來之后還需要解碼提交但這類題目一般不會太復(fù)雜。讀到內(nèi)容后直接復(fù)制到題目提交框中注意不要多復(fù)制空行或隱藏字符。提交前可以用cat -A命令查看文件里是否有多余內(nèi)容。就這道題而言我記得flag是放在根目錄的flag文件里的算是最標準的放法。不過我不建議直接背flag放哪因為每個比賽都不一樣關(guān)鍵是掌握用find搜索、用cat讀取這個能力。5. 從這道題延伸出去的經(jīng)驗做完這道題之后我意識到一個問題很多新手打CTF容易陷入一個題一個套路的思維學(xué)會上傳就只會上傳碰到別的題就不會變通。其實文件上傳漏洞的利用思路有很多可遷移的地方。首先是控制輸入點的思路。任何允許用戶輸入內(nèi)容、并能被保存在服務(wù)器上的功能都可能成為漏洞點。不只是上傳文件還包括寫日志、寫配置、寫入緩存等。當(dāng)你拿到一個Web應(yīng)用先梳理所有輸入能落盤的位置再思考這些位置是否會影響后續(xù)解析這個思維比背繞過技巧重要得多。其次是工具只是效率放大器的認知。蟻劍再強大如果Webshell本身沒上傳成功它就只是個空殼。反過來如果你能手工用Burp或curl發(fā)送構(gòu)造好的POST請求來驗證Webshell那你理解工具的原理就會更深。我建議新手在能用蟻劍之前先用curl手動連一次Webshell確認流程再用工具。還有一個經(jīng)驗是做題要留記錄。我每次打一道題都會在一個本地筆記里記下目標環(huán)境是什么、上傳過濾了什么、試了哪些后綴、哪個后綴成功了、蟻劍的URL和密碼是什么。這個過程看似繁瑣但當(dāng)你連續(xù)打多個比賽、面對多個環(huán)境時這些記錄就是你最快的查找手冊。尤其是碰到相似題目時翻到之前的記錄直接復(fù)用思路能節(jié)省大量時間。我在實際解題過程中最深的感受是一道上傳題做完不應(yīng)該只記住我拿到了flag而應(yīng)該沉淀出這個漏洞的判定點在哪、繞過方式為什么有效、工具連接的原理是什么。把這三件事想明白再做新的上傳題你會發(fā)現(xiàn)它們之間只是換了層外殼內(nèi)里的邏輯是通的。這種遷移能力比多刷一道題要值錢得多。