網(wǎng)絡(luò)安全技術(shù)競(jìng)技(CTF賽題)_第1頁(yè)
網(wǎng)絡(luò)安全技術(shù)競(jìng)技(CTF賽題)_第2頁(yè)
網(wǎng)絡(luò)安全技術(shù)競(jìng)技(CTF賽題)_第3頁(yè)
網(wǎng)絡(luò)安全技術(shù)競(jìng)技(CTF賽題)_第4頁(yè)
網(wǎng)絡(luò)安全技術(shù)競(jìng)技(CTF賽題)_第5頁(yè)
已閱讀5頁(yè),還剩320頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

網(wǎng)絡(luò)安全技術(shù)競(jìng)技(CTF賽題)目錄TOC\h\h第1章Web類賽題\h1.1SQL注入漏洞\h關(guān)鍵字繞過(guò)\h題目1簡(jiǎn)單的編碼繞過(guò)\h題目2截?cái)嗬@過(guò)\h題目3二次注入\h1.2XSS漏洞\h題目1留言板\h題目2評(píng)論區(qū)\h題目3繞過(guò)JavaScript限制\h1.3命令執(zhí)行漏洞\h題目1上傳圖片\h題目2ping命令工具\(yùn)h1.4文件上傳漏洞\h題目1MIME\h題目2PHP標(biāo)簽\h1.5信息泄露漏洞\h題目1CBC-ATTACK\h題目2robots\h1.6代碼審計(jì)\h題目1散列值\h題目2對(duì)象注入\h題目3JavaScript代碼審計(jì)\h1.7暴力破解\h題目MD5密碼破解\h1.8反序列化\h題目messagecenter\h1.9綜合滲透\h題目1命令執(zhí)行\(zhòng)h題目2越權(quán)訪問(wèn)\h1.10其他Web類賽題\h題目1LFI\h題目2突破登錄\h第2章可執(zhí)行程序類賽題\h2.1Windows中的可執(zhí)行程序\h題目1逆向和調(diào)試基礎(chǔ)\h題目2脫殼并找出序列號(hào)\h題目3逆向算法分析和修改\h2.2Linux中的可執(zhí)行程序\h題目1逆向分析算法解密\h題目2從寄存器中取得flag\h題目3追蹤運(yùn)行庫(kù)和系統(tǒng)調(diào)用\h題目4反調(diào)試和反反調(diào)試\h2.3Android可執(zhí)行程序\h題目1反模擬器探測(cè)和APK反編譯\h題目2C運(yùn)行庫(kù)文件的逆向分析\h題目3libc函數(shù)的劫持\h題目4DEX脫殼與WebView漏洞\h2.4Python可執(zhí)行程序\h題目1Python字節(jié)碼反編譯與加密算法的暴力破解\h題目2Python打包二進(jìn)制文件的逆向\h題目3深入分析Python字節(jié)碼\h2.5.NET可執(zhí)行程序\h題目1.NET反編譯和BMP圖像\h題目2.NET程序的反混淆和調(diào)試分析\h第3章PWN類賽題\h3.1WindowsPWN\h題目FTP協(xié)議棧溢出漏洞\h3.2LinuxPWN\h題目1靜態(tài)編譯軟件棧溢出漏洞\h題目2ret2libc棧溢出漏洞\h題目3構(gòu)造浮點(diǎn)型Shellcode\h題目4Linux棧溢出漏洞\h題目5ret2plt棧溢出漏洞\h題目6unlink堆溢出漏洞\h題目7UAF堆溢出漏洞\h題目8格式化字符串漏洞\h題目9整數(shù)溢出(1)\h題目10整數(shù)溢出(2)\h題目11Linux隨機(jī)數(shù)\h3.3PythonPWN\h題目Python沙盒繞過(guò)\h第4章PPC類賽題\h4.1工具編寫\h題目1LostKey\h題目2addcodes\h4.2算法\h題目1Code400\h題目2迷宮大逃亡\h題目3能看到嗎\h4.3競(jìng)速\h題目1百米賽跑\h題目2速度爆破\h第5章安全雜項(xiàng)類賽題\h5.1密碼學(xué)\h題目1摩斯密碼\h題目2愷撒密碼\h題目3柵欄密碼\h題目4RSA算法\h題目5NTLM密碼\h題目6鍵盤圖案密碼\h題目7ROT13\h其他密碼學(xué)賽題\h5.2隱寫\h題目1通過(guò)圖片傳遞隱藏信息\h題目2文件為什么打不開\h題目3文字隱身\h題目4不是一個(gè)人在戰(zhàn)斗\h題目5到處都是廣告\h題目6最低位的藝術(shù)\h題目7ISG圖片隱寫\h題目8藏在聲音中的密碼\h第6章比賽介紹\h6.1國(guó)外CTF\hDEFCON\hUCSBiCTF\h6.2國(guó)內(nèi)CTF\hXCTF聯(lián)賽\hTCTF第1章Web類賽題Web類賽題在CTF比賽中占有很大的比重。在大部分解題模式賽制的CTF比賽中,Web類賽題占比通常為20%~40%。1.1SQL注入漏洞SQL注入(SQLInjection)是Web開發(fā)中最常見的一種安全漏洞。攻擊者可以利用SQL注入漏洞從數(shù)據(jù)庫(kù)中獲取敏感信息,或者利用數(shù)據(jù)庫(kù)的特性執(zhí)行添加用戶、導(dǎo)出文件等一系列惡意操作,甚至獲取數(shù)據(jù)庫(kù)乃至系統(tǒng)的最高權(quán)限。造成SQL注入的原因是程序沒有有效過(guò)濾用戶的輸入,使攻擊者向服務(wù)器成功提交惡意的SQL查詢代碼,程序錯(cuò)誤地將攻擊者的輸入作為查詢語(yǔ)句的一部分執(zhí)行,導(dǎo)致原始的查詢邏輯被改變,額外執(zhí)行了攻擊者精心構(gòu)造的惡意代碼。在CTF比賽中,SQL注入題目考察的是選手對(duì)各種函數(shù)、符號(hào)等進(jìn)行替換、刪除或禁止使用操作的熟悉程度。在解答SQL注入題目時(shí),往往需要選手具有發(fā)現(xiàn)手工注入與繞過(guò)各種Web應(yīng)用防護(hù)系統(tǒng)(WAF)的能力。為了讓讀者盡可能全面地了解不同類型SQL注入題目的解法,下面將列舉一些CTF比賽中出現(xiàn)過(guò)的SQL注入題目。關(guān)鍵字繞過(guò)考察的知識(shí)點(diǎn)?對(duì)常用關(guān)鍵字禁止使用或刪除的繞過(guò)。?手動(dòng)構(gòu)造注入語(yǔ)句。常見的注入繞過(guò)方式在注入過(guò)程中,攻擊者輸入“select”“union”“and”“or”“=”及空格等,往往會(huì)被程序的防御機(jī)制阻斷,即程序不允許執(zhí)行含有這些關(guān)鍵字的語(yǔ)句。攻擊者在嘗試?yán)@過(guò)這些檢測(cè)機(jī)制時(shí)通常會(huì)采取以下手段。(1)編碼繞過(guò)?selectURL編碼:%73%65%6c%65%63%74。?select雙重編碼:%25%73%25%65%25%6c%25%65%25%63%25%74。?admin:CHAR(97)+CHAR(100)+CHAR(109)+CHAR(105)+CHAR(110)SELECT(0x3C613E61646D696E3C2F613E,0x2f61))。除了可以使用在線編碼,還可以使用一些本地工具,例如BurpSuite中的Decoder,如圖1-1所示。圖1-1(2)字母大小寫繞過(guò)SeleCT、uNioN、And、Or等。(3)在關(guān)鍵字內(nèi)添加無(wú)效字符SE%00LECT、Sel%0bECT、%00-%0b及其他空字符。(4)內(nèi)聯(lián)注釋繞過(guò)/*!code*/、/*!uNION*/、/*!SelECt*/。(5)利用被刪除的關(guān)鍵字繞過(guò)如果程序?qū)δ承╆P(guān)鍵字采取了刪除措施,那么攻擊者可能會(huì)利用“SEL+SELECT+ECT”的方式構(gòu)造SELECTECT語(yǔ)句。此時(shí),如果程序刪除了SELECT關(guān)鍵字,就相當(dāng)于讓攻擊者成功輸入了SELECT關(guān)鍵字。同理,在刪除其他字符(例如“<>”)時(shí),攻擊者也可以使用該字符實(shí)現(xiàn)繞過(guò)(例如“S<>ELECT”“UN<>ion”等)。(6)等價(jià)函數(shù)與命令繞過(guò)例如:用“&&”“||”代替“and”“or”;用“%20%09%0a%0b%0c%0d%a0/**/制表符()反引號(hào)”代替空格;用“and1like1”代替“and1=1”;用“and2>1”代替“and1=1”;用“and2<1”代替“and1=2”;用sleep()代替benchmark();用concat_ws代替group_concat();用mid()、substr()、strcmp()代替substring();用@@user代替user();用@@datadir代替datadir()。(7)寬字節(jié)注入當(dāng)數(shù)據(jù)庫(kù)編碼為GBK,PHP開啟了GPC等,并且在單引號(hào)前添加了反斜杠“\”時(shí),輸入“%df%27”,程序會(huì)在“%27”前添加一個(gè)“\”,構(gòu)成“%df%5c%27”。在GBK編碼中,“%df%5c”是一個(gè)寬字符串,后面的“%27”不會(huì)被處理。這相當(dāng)于插入單引號(hào),形成了注入。(8)溢出繞過(guò)一段常見的溢出繞過(guò)代碼如下。(9)其他符號(hào)繞過(guò)不同的WAF對(duì)輸入代碼的處理方式不盡相同。如果遇到采用上述方式無(wú)法繞過(guò)且確實(shí)需要注入的題目,應(yīng)盡量進(jìn)行模糊測(cè)試(Fuzzing),看看哪些函數(shù)是不可用的,哪些函數(shù)是可用的。筆者曾遇到將\n\r\t這樣的字符添加在關(guān)鍵字中,程序在處理?yè)Q行時(shí)自動(dòng)把下一行接到上一行從而構(gòu)成語(yǔ)句的情況。還可以使用一些數(shù)學(xué)運(yùn)算函數(shù)(例如“exp(x):”,取常數(shù)e的x次方,e是自然對(duì)數(shù)的底)構(gòu)造報(bào)錯(cuò)語(yǔ)句,從而實(shí)現(xiàn)注入。題目1簡(jiǎn)單的編碼繞過(guò)題目概況編碼繞過(guò)是一類常見的SQL注入題目,在CTF比賽中經(jīng)常出現(xiàn)。下面通過(guò)一些解題關(guān)鍵點(diǎn)分析這類題目的解題思路。解題思路查看源代碼,發(fā)現(xiàn)注釋中有如下內(nèi)容,如圖1-2所示。因?yàn)檫@里使用了兩個(gè)urldecode()函數(shù),所以使用htmlspecialchars()和addslashes()函數(shù)過(guò)濾的單引號(hào)已經(jīng)沒有用了。此時(shí),可以使用%252527繞過(guò)對(duì)這兩個(gè)函數(shù)的過(guò)濾,然后引入單引號(hào),輸出以下報(bào)錯(cuò)信息。圖1-2可以看出,這里是SQLite注入。嘗試進(jìn)行UNION注入,代碼如下。報(bào)錯(cuò),可以肯定列數(shù)大于1。繼續(xù)注入,代碼如下。由于輸出為“2”,所以,可以使用sqlite_master命令得到數(shù)據(jù)庫(kù)的列和表。輸出如下內(nèi)容。使用下面的語(yǔ)句,得到相關(guān)信息。輸出如下內(nèi)容,拿到flag。相關(guān)知識(shí)點(diǎn)?urldecode()函數(shù)能將編碼后的URL字符串還原成未編碼的樣子。編碼使用“%##”格式。?htmlspecialchars()函數(shù)能把預(yù)定義的字符轉(zhuǎn)換為HTML實(shí)體。?addslashes()函數(shù)能返回在預(yù)定義字符之前添加反斜杠的字符串。題目2截?cái)嗬@過(guò)題目概況URL中的“%00”在ASCII碼中表示0,而ASCII碼中的0表示字符串的結(jié)束,所以,當(dāng)URL中出現(xiàn)“%00”時(shí),服務(wù)器會(huì)認(rèn)為URL已經(jīng)結(jié)束,不會(huì)再去檢測(cè)后面的內(nèi)容,而這將引發(fā)繞過(guò)驗(yàn)證。在0CTF比賽中就出現(xiàn)過(guò)這樣的題目。解題思路如圖1-3所示,這是一道簡(jiǎn)單的注入題。題目明示要靠注入找到flag,但WAF屏蔽了一些關(guān)鍵字。圖1-3如圖1-4所示,檢測(cè)注入點(diǎn)。在地址欄中輸入以下內(nèi)容。圖1-4可以看出,注入點(diǎn)就是id,但后面的參數(shù)中有一些被WAF檢測(cè)出來(lái)了,所以輸入的內(nèi)容被攔截了。進(jìn)行一輪模糊測(cè)試,得到下面的測(cè)試結(jié)果。?已被檢測(cè)的關(guān)鍵字:SELECT、WHERE、FROM。?未被檢測(cè)的關(guān)鍵字:UNION、LIMIT、AND、OR、LIKE,以及符號(hào)“*”“&”“#”等。接下來(lái),解題思路就可以簡(jiǎn)化成:使用SELECT語(yǔ)句且不被WAF攔截(也就是關(guān)鍵字繞過(guò))。如圖1-5所示,嘗試使用編碼繞過(guò)、大小寫繞過(guò)、內(nèi)聯(lián)注釋、在關(guān)鍵字內(nèi)添加無(wú)效字符等方法后,發(fā)現(xiàn)可以利用在關(guān)鍵字內(nèi)添加無(wú)效字符的方法繞過(guò)“SEL%00ECT”。圖1-5可以看到,在關(guān)鍵字內(nèi)添加“%00”即可成功繞過(guò)WAF的檢測(cè)。繼續(xù)進(jìn)行注入,看看數(shù)據(jù)庫(kù)中有哪些表。得到的表名如下。在結(jié)尾處有我們最關(guān)心的flag表。構(gòu)造語(yǔ)句,注入flag表,如圖1-6所示。圖1-6如果對(duì)手工注入不太熟悉,可以使用sqlmap中的template腳本。將InsertNullCharInSQLKeywords.py文件復(fù)制到sqlmap的template目錄下,py文件內(nèi)容如下。題目3二次注入題目概況二次注入是指已存儲(chǔ)在數(shù)據(jù)庫(kù)內(nèi)的數(shù)據(jù)被再次調(diào)用時(shí)導(dǎo)致的注入攻擊。在SSCTF比賽中,Web類分值達(dá)500分的題目考察的就是二次注入。下面分析一下二次注入題目的解題思路。解題思路打開題目提供的地址頁(yè)面,了解頁(yè)面的內(nèi)容和功能。在CTF比賽中,題目設(shè)置大都是有目的的,頁(yè)面內(nèi)容大都會(huì)包含指引信息。所以,了解頁(yè)面的內(nèi)容和功能,可以幫助我們判斷題目的考察點(diǎn)。如圖1-7所示,這是一個(gè)注冊(cè)頁(yè)面,也就是說(shuō),通過(guò)這個(gè)頁(yè)面可以向數(shù)據(jù)庫(kù)寫數(shù)據(jù)。還有一個(gè)查詢頁(yè)面,用于查詢郵箱和返回用戶名稱。注冊(cè)一個(gè)用戶名為“root'”、密碼為“root”、郵箱為“root@”的用戶,測(cè)試一下是否可以將單引號(hào)寫入數(shù)據(jù)庫(kù)。單擊“ok”按鈕,返回“yes”,看來(lái)注冊(cè)信息已經(jīng)寫入數(shù)據(jù)庫(kù)了。接下來(lái),嘗試一下是否可以注入。查詢注冊(cè)的郵箱,如圖1-8所示。圖1-7圖1-8如圖1-9所示,頁(yè)面報(bào)錯(cuò),看來(lái)在調(diào)用用戶名“root'”時(shí)已經(jīng)把單引號(hào)執(zhí)行了。從錯(cuò)誤信息中可以看出,目標(biāo)數(shù)據(jù)庫(kù)是MySQL數(shù)據(jù)庫(kù)。從提示語(yǔ)句中也可以知道,查詢語(yǔ)句已經(jīng)把單引號(hào)引入查詢語(yǔ)句了,說(shuō)明這里存在注入漏洞。圖1-9通過(guò)分析可知,這是一個(gè)二次注入漏洞。下面我們需要讀取有用的信息。利用報(bào)錯(cuò)信息查看數(shù)據(jù)庫(kù)表名。報(bào)錯(cuò)查詢方法有很多種,通過(guò)floor()、extractvalue()、updatexml()、NAME_CONST等函數(shù)均可查詢,如表1-1所示。表1-1這里使用的是floor()函數(shù),注冊(cè)的賬號(hào)為“1123'”,郵箱為“test1223@123.com”,代碼如下,如圖1-10所示。圖1-10如圖1-11所示,在查詢頁(yè)面輸入注冊(cè)的郵箱地址,在返回的錯(cuò)誤信息中可以看到,得到了一個(gè)表名“flag”。圖1-11既然有了表名,就修改語(yǔ)句,以便查看flag表的內(nèi)容。語(yǔ)句如下,如圖1-12所示。圖1-12從報(bào)錯(cuò)信息中可以得到flag。相關(guān)知識(shí)點(diǎn)以上介紹的是一個(gè)模擬的題目環(huán)境。在歷年的CTF比賽中,類似的題目經(jīng)常出現(xiàn)。報(bào)錯(cuò)注入是如何產(chǎn)生的?程序?yàn)楹螘?huì)報(bào)錯(cuò)?主要由rand和groupby的沖突所致。在MySQL的文檔中有這樣的描述:“RAND()inaWHEREclauseisre-evaluatedeverytimetheWHEREisexecuted.YoucannotuseacolumnwithRAND()valuesinanORDERBYclause,becauseORDERBYwouldevaluatethecolumnmultipletimes.”大意是:那些不可以作為orderby的條件字段,也不可以作為groupby的條件字段。為什么rand和orderby不可以一起使用呢?一起使用為什么會(huì)報(bào)錯(cuò)呢?新建一條記錄,執(zhí)行命令“selectcount()fromtestgroupbyfloor(rand(0)2);”,發(fā)現(xiàn)無(wú)論執(zhí)行多少遍,都不會(huì)報(bào)錯(cuò)。添加一條記錄,情況是一樣的。然而,當(dāng)有3條記錄時(shí),執(zhí)行此命令,將開始報(bào)錯(cuò)。由此可知,3條及更多的記錄才能引發(fā)報(bào)錯(cuò)。我們把隨機(jī)因子去掉,再試試看。在只有1條記錄時(shí),無(wú)論程序執(zhí)行多少次,都不會(huì)報(bào)錯(cuò);在有2條記錄時(shí),會(huì)隨機(jī)報(bào)錯(cuò);在有3條記錄時(shí),也會(huì)隨機(jī)報(bào)錯(cuò)。MySQL官方給過(guò)提示:在進(jìn)行查詢時(shí),如果使用rand()函數(shù),則該值會(huì)被多次計(jì)算?!氨欢啻斡?jì)算”是什么意思?就是在使用groupby時(shí),floor(rand(0)_2)會(huì)執(zhí)行一次;如果虛表中沒有記錄,那么在插入虛表時(shí),floor(rand(0)_2)會(huì)再執(zhí)行一次。分析floor(rand(0)_2)報(bào)錯(cuò)的過(guò)程就能明白,在一次多記錄查詢中,floor(rand(0)_2)的值是定性的,為0、1、1、0、1、1……(這個(gè)順序很重要)報(bào)錯(cuò)實(shí)際上就是floor(rand(0)_2)被多次執(zhí)行導(dǎo)致的。下面分析一下“selectcount(_)fromTSafegroupbyfloor(rand(0)_2);”的查詢過(guò)程。①在進(jìn)行查詢前,默認(rèn)建立空虛擬表。②取第1條記錄,執(zhí)行floor(rand(0)2),發(fā)現(xiàn)結(jié)果為0(第1次計(jì)算);查詢虛擬表,發(fā)現(xiàn)0的鍵值不存在,floor(rand(0)2)會(huì)再執(zhí)行一次,結(jié)果為1(第2次計(jì)算);插入虛表,這時(shí)第1條記錄查詢完畢。③查詢第2條記錄,再次執(zhí)行floor(rand(0)2),發(fā)現(xiàn)結(jié)果為1(第3次計(jì)算);查詢虛表,發(fā)現(xiàn)1這個(gè)鍵值存在,所以floor(rand(0)2)不會(huì)執(zhí)行第2次;直接使用count()函數(shù)進(jìn)行加1操作,第2條記錄查詢完畢。④查詢第3條記錄,再次執(zhí)行floor(rand(0)2),發(fā)現(xiàn)結(jié)果為0(第4次計(jì)算);查詢虛表,發(fā)現(xiàn)鍵值中沒有0,數(shù)據(jù)庫(kù)嘗試插入一條新的數(shù)據(jù)。在插入數(shù)據(jù)時(shí),floor(rand(0)2)再次執(zhí)行,作為虛表的主鍵,其值為1(第5次計(jì)算)。因?yàn)?這個(gè)主鍵已存在于虛擬表中,計(jì)算得到的值也為1(主鍵的鍵值必須是唯一的),所以插入時(shí)會(huì)直接報(bào)錯(cuò)。在整個(gè)查詢過(guò)程中,floor(rand(0)2)執(zhí)行了5次,查詢?cè)瓟?shù)據(jù)表的操作進(jìn)行了3次。這就是數(shù)據(jù)表中需要有至少3條數(shù)據(jù)且同時(shí)使用rand和orderby才會(huì)報(bào)錯(cuò)的原因。我們同樣可以對(duì)不添加隨機(jī)因子的情況進(jìn)行推理。由于沒有添加隨機(jī)因子,所以,floor(rand()2)是不可測(cè)的:在有2條數(shù)據(jù)時(shí),只要出現(xiàn)第3次計(jì)算的值與第2次和第4次計(jì)算的值不一樣的情況,就會(huì)報(bào)錯(cuò)。最重要的是:前幾條記錄被查詢后,虛表中不可能存在鍵值0和1;如果存在,那么無(wú)論有多少條記錄,都不會(huì)報(bào)錯(cuò)(floor(rand()2)不會(huì)再執(zhí)行并作為虛表的鍵值),這也是如果不添加隨機(jī)因子,則有時(shí)會(huì)報(bào)錯(cuò),有時(shí)不會(huì)報(bào)錯(cuò)的原因。在前面的記錄讓虛表變成現(xiàn)在這樣之后,由于不管查詢多少條記錄,都能在虛表中找到floor(rand()2)的值,即不會(huì)再次計(jì)算,只是簡(jiǎn)單地增加count()的值,所以,程序不會(huì)報(bào)錯(cuò)。例如,floor(rand(1)*2)表示在前2條記錄被查詢后,虛表中已經(jīng)存在鍵值0和1了,所以后面就不會(huì)報(bào)錯(cuò)了。其他函數(shù)的報(bào)錯(cuò),請(qǐng)讀者自行查找資料,找出原因——自己找到的答案更珍貴,這也是CTF比賽的樂趣所在。小結(jié)在二次注入的基礎(chǔ)上增加加密算法,是近幾年CTF比賽的一個(gè)命題趨勢(shì),即不會(huì)只考察單一的知識(shí)點(diǎn),選手需要將兩個(gè)或兩個(gè)以上的知識(shí)點(diǎn)組合使用,才能得到flag。在一些綜合性CTF比賽中,單純的Web類賽題已經(jīng)很難見到了,大部分Web類賽題都需要選手運(yùn)用逆向、密碼學(xué)、Web方面的知識(shí)點(diǎn)來(lái)解答。1.2XSS漏洞跨站腳本“Cross-SiteScripting”的英文首字母縮寫本應(yīng)為“CSS”,但因?yàn)椤癈SS”已在網(wǎng)頁(yè)設(shè)計(jì)領(lǐng)域使用,即層疊樣式表“CascadingStyleSheets”,所以將“Cross”(意為“交叉”)改以交叉形的“X”為縮寫。XSS按照一般的分類方式,可以分為兩種。?反射型XSS?存儲(chǔ)型XSS在CTF比賽中,很少碰到反射型XSS,題目涉及的基本上是存儲(chǔ)型XSS。顧名思義,存儲(chǔ)型XSS就是將XSS代碼通過(guò)代碼注入或其他方式保存在網(wǎng)頁(yè)中,如果有人打開這個(gè)頁(yè)面,就會(huì)執(zhí)行里面的攻擊代碼,完成一次被動(dòng)攻擊。簡(jiǎn)言之,XSS就是想辦法將可執(zhí)行代碼(例如JavaScript、VB、ActiveX、Flash)嵌入目標(biāo)頁(yè)面,等待“魚兒”上鉤。題目1留言板題目概況留言板是XSS漏洞的第一高發(fā)位置。下面給出一道非常簡(jiǎn)單的XSS題目(來(lái)自QUALSCTF)。讓我們從發(fā)現(xiàn)線索開始。信息收集假設(shè)你是一名警察,正在調(diào)查一個(gè)販賣違禁物品的網(wǎng)站,你需要想辦法獲得這個(gè)網(wǎng)站的管理員的線索。首先,簡(jiǎn)單瀏覽網(wǎng)站的頁(yè)面,如圖1-13所示。我們從標(biāo)題欄上面的功能看起。單擊“About”選項(xiàng),除了網(wǎng)站介紹,什么都沒有,如圖1-14所示。圖1-13圖1-14接下來(lái),看看第二個(gè)功能“Products”。界面上展示了網(wǎng)站銷售的所有物品。單擊進(jìn)入其中一個(gè)物品的界面,也只有填寫電子郵箱和購(gòu)買數(shù)量的功能??纯淳W(wǎng)站的URL,感覺可能存在一個(gè)偽靜態(tài)注入點(diǎn),如圖1-15所示。暫且不管,看看最后一個(gè)功能。圖1-15如圖1-16所示,這是一個(gè)在線給管理員留言的界面,明確告知訪問(wèn)者:管理員會(huì)閱讀并且回復(fù)你的信息。圖1-16攻擊測(cè)試一般看到留言板,就應(yīng)該想到可能存在XSS。我們來(lái)嘗試一下。打開https://requestb.in/,新建一個(gè)RequestBin,將生成的地址插入留言,代碼如下,如圖1-17和圖1-18所示。圖1-17圖1-18成功獲得了管理員的Cookie。如圖1-19所示,利用BurpSuite或?yàn)g覽器插件修改當(dāng)前Cookie為管理員的Cookie,登錄管理員賬號(hào),找到相關(guān)信息。圖1-19題目2評(píng)論區(qū)題目概況評(píng)論區(qū)是XSS漏洞的第二高發(fā)位置。在很多技術(shù)高手的博客里,我們會(huì)經(jīng)??吹结槍?duì)評(píng)論區(qū)的測(cè)試代碼。下面給出一道題目(ImgBlog-1,來(lái)自ICECTF)。解題思路打開題目網(wǎng)站,映入眼簾的是一個(gè)個(gè)人博客站點(diǎn),頁(yè)面上方有登錄和注冊(cè)的功能,如圖1-20所示。圖1-20首先,嘗試登錄。使用簡(jiǎn)單的admin/admin等弱口令組合,以及簡(jiǎn)單的注入,都沒有奏效。所以,直接注冊(cè)一個(gè)賬號(hào)。登錄后,對(duì)帖子發(fā)表評(píng)論,發(fā)現(xiàn)網(wǎng)站可能存在XSS漏洞,如圖1-21所示。圖1-21因此,嘗試執(zhí)行簡(jiǎn)單的XSS命令,以確定是否可以進(jìn)行XSS攻擊。輸入“test<scrip>alert("whoops");</scrip)”命令,提交評(píng)論——什么都沒有發(fā)生。刷新頁(yè)面——確實(shí)什么都沒有發(fā)生。仔細(xì)分析網(wǎng)站的其他功能,發(fā)現(xiàn)每條評(píng)論都包含報(bào)告按鈕和評(píng)論的固定鏈接。單擊報(bào)告按鈕,依然什么都沒有發(fā)生。單擊固定鏈接,意外地得到了我們想要的結(jié)果,如圖1-22所示。圖1-22看來(lái),可以利用XSS漏洞獲取admin賬號(hào)的Cookie,從而構(gòu)造XSS代碼。使用nc進(jìn)行監(jiān)聽,效果是一樣的。在服務(wù)器上監(jiān)聽12121端口,獲取返回的數(shù)據(jù)。到此,就利用XSS漏洞獲取了管理員的Cookie。用Chrome的EditThisCookie插件或BurpSuite將我們的Cookie修改為剛剛拿到的Cookie,刷新一下,如圖1-23所示,將跳轉(zhuǎn)到一個(gè)可以上傳圖片的界面——這里存在命令執(zhí)行漏洞。這個(gè)問(wèn)題超出了XSS的范疇,相關(guān)內(nèi)容將在1.3節(jié)講解。相關(guān)知識(shí)點(diǎn)本題的前半部分沒有難點(diǎn),算是一道初級(jí)XSS題目(在解題過(guò)程中獲取了Cookie)。在CTF比賽這種對(duì)方可能會(huì)立即單擊我們的XSS代碼的對(duì)抗情境中,可以使用nc監(jiān)聽一個(gè)端口以等待對(duì)方訪問(wèn)。在CTF比賽中,只要看到輸入框,就可以輸入XSS代碼進(jìn)行嘗試,可能會(huì)獲得意想不到的結(jié)果。圖1-23題目3繞過(guò)JavaScript限制題目概況本節(jié)分析一道簡(jiǎn)單的XSS題目,使用JavaScript處理輸入的字符串來(lái)過(guò)濾關(guān)鍵字。這是一道在線題目,見鏈接1-1。讀者可以先試著解答這道題目,如果無(wú)法完成,再來(lái)看下面的解題思路分析。解題思路訪問(wèn)題目頁(yè)面,如圖1-24所示。圖1-24題目說(shuō)明告訴我們,這是一道XSS題目,所以,可以直接輸入命令進(jìn)行嘗試,如圖1-25所示。圖1-25題目不允許我們填寫這種格式的命令。這看起來(lái)像是前端的JavaScript驗(yàn)證。打開Chrome的調(diào)試器,如圖1-26所示。在這里,用maxsize限制長(zhǎng)度為10,用pattern限制內(nèi)容只能是大小寫字母。由于js腳本的內(nèi)容可以隨意修改,所以將其內(nèi)容修改如下。圖1-26這樣,輸入就完全不受限制了。再嘗試一下,發(fā)現(xiàn)并沒有彈出我們想要的結(jié)果“1”。繼續(xù)進(jìn)行調(diào)試,如圖1-27所示。圖1-27由于“<”和“>”分別被替換成“<”和“>”,所以無(wú)法彈出。頁(yè)面中嵌了一個(gè)ex1.js腳本,具體如下。注意以下內(nèi)容。這段代碼用replace()函數(shù)將輸入的數(shù)據(jù)中的“<”“>”分別替換成“<”“>”,因此,我們只要把這段修改為以下內(nèi)容即可。執(zhí)行之前輸入的命令,如圖1-28所示,成功彈出“1”。仔細(xì)看一下題目要求,彈出的是“Ex1”,因此將彈出內(nèi)容改為“Ex1”,答題成功。小結(jié)本題主要考察如何使用JavaScript在前端進(jìn)行數(shù)據(jù)處理。只要去掉JavaScript的限制,就可以解題了。圖1-281.3命令執(zhí)行漏洞命令執(zhí)行漏洞是指攻擊者通過(guò)瀏覽器發(fā)送惡意的cmd/bash命令至服務(wù)器程序,服務(wù)器程序沒有正確處理所接收的數(shù)據(jù),而是執(zhí)行了系統(tǒng)命令,進(jìn)而對(duì)服務(wù)器造成威脅。當(dāng)應(yīng)用程序需要調(diào)用一些外部程序來(lái)處理內(nèi)容時(shí),會(huì)使用一些系統(tǒng)命令。攻擊者一般會(huì)通過(guò)“&”“|”“;”等符號(hào)來(lái)分隔原有的命令,在執(zhí)行完原有的命令后,緊接著執(zhí)行攻擊者拼接的命令,對(duì)系統(tǒng)造成危害。不管是在CTF比賽中,還是在真實(shí)的網(wǎng)絡(luò)環(huán)境中,通常都會(huì)存在執(zhí)行系統(tǒng)命令的位置。例如,在ping、文件長(zhǎng)度或類型判定、圖片編輯處理等操作中,都可能存在命令執(zhí)行漏洞。題目1上傳圖片題目概況命令執(zhí)行漏洞,除了可以用來(lái)接收URL內(nèi)容,文件名稱也是可以利用的。imgBlog-2(來(lái)自ICECTF)就是這樣一道題目。本題與1.2節(jié)的“題目2”(imgBlog-1)合并,就是一道完整的題目。imgBlog-2是一道命令執(zhí)行題目,讓我們一起來(lái)攻克它!解題思路我們已經(jīng)進(jìn)入一個(gè)圖片上傳頁(yè)面,如圖1-29所示。圖1-29在這里可以向服務(wù)器發(fā)送POST數(shù)據(jù)。首先,分析一下其中是否存在注入漏洞。經(jīng)過(guò)模糊測(cè)試,未發(fā)現(xiàn)注入漏洞。因此,可以嘗試上傳圖片,獲取Shell。上傳一個(gè)PHP文件,看一下返回結(jié)果。如圖1-30所示,提示上傳的文件不是圖片,說(shuō)明網(wǎng)站設(shè)置了文件檢測(cè)機(jī)制。嘗試使用各種上傳繞過(guò)方式,都失敗了,浪費(fèi)了很多時(shí)間,感覺走進(jìn)了死胡同——也許這道題根本不是考察上傳繞過(guò)的。圖1-30接下來(lái),上傳一個(gè)正常的圖片文件,看看結(jié)果如何。如圖1-31所示,提示網(wǎng)站的圖片上傳功能還沒有實(shí)現(xiàn),也就是說(shuō),即使能上傳PHP文件(文件沒有被攔截),也無(wú)法得到Shell。圖1-31回顧已經(jīng)進(jìn)行的操作,發(fā)現(xiàn)第一次上傳PHP文件時(shí)返回的錯(cuò)誤提示信息“asciitext,withnolineterminators”可能對(duì)我們有幫助。搜索一下,發(fā)現(xiàn)有人在網(wǎng)上問(wèn)過(guò)這個(gè)問(wèn)題,如圖1-32所示。圖1-32可以看到,問(wèn)問(wèn)題的人使用了file命令,應(yīng)該是執(zhí)行了“file+空格+圖片名稱”命令。既然執(zhí)行了file命令,那么,如果網(wǎng)站沒有對(duì)圖片名稱進(jìn)行過(guò)濾,我們?cè)诮忸}時(shí)就可以構(gòu)造類似“fileimgname;其他命令”的命令。嘗試將圖片命名為“apple;ls-a”并上傳到服務(wù)器,如圖1-33所示。圖1-33可以看到,確實(shí)執(zhí)行了ls命令并返回了內(nèi)容,其中的flag.txt正是我們想要的。接下來(lái),通過(guò)“catflag.txt”命令查看flag的內(nèi)容。將圖片命名為“apple;catflag.txt”,發(fā)現(xiàn)沒有成功讀取flag的內(nèi)容。這是為什么呢?因?yàn)樵谶M(jìn)行測(cè)試之后,程序會(huì)把“?!边^(guò)濾掉(這也是第一次上傳123.php之后返回的是“123php”的原因)。既然知道了原因,就可以使用通配符或“_”來(lái)代替文件名。將圖片命名為“`apple;catflag`”,如圖1-34所示,成功拿到flag。圖1-34小結(jié)一些應(yīng)用在處理接收到的圖片時(shí),會(huì)取原圖片的名稱來(lái)拼接成一條命令,以執(zhí)行重命名、移動(dòng)、判斷類型等操作,但對(duì)所接收的文件的名稱沒有進(jìn)行嚴(yán)格的字符判斷,使攻擊者可以通過(guò)“;”“|”“&”“&&”等字符將原來(lái)的命令擴(kuò)展,在執(zhí)行原來(lái)的命令后執(zhí)行擴(kuò)展的命令,從而形成命令執(zhí)行漏洞。還有一些應(yīng)用,為了方便用戶,使用ping命令等來(lái)檢測(cè)機(jī)器是否“存活”。在這種情況下,攻擊者可以在IP地址后面加上這些符號(hào),再執(zhí)行自己的命令。題目2ping命令工具題目概況打開網(wǎng)站,標(biāo)題是“我剛做了一個(gè)ping命令的小工具,快試一下吧!”,頁(yè)面上有一個(gè)輸入框和一個(gè)提交按鈕,如圖1-35所示。圖1-35解題思路這是一道“送分題”。一看到“ping”,我們就能梳理題目的大致邏輯:在輸入框內(nèi)輸入內(nèi)容;網(wǎng)站后端程序接收參數(shù);將輸入的內(nèi)容與ping命令進(jìn)行拼接并執(zhí)行,將結(jié)果返回前端。如果網(wǎng)站對(duì)輸入內(nèi)容的驗(yàn)證不夠嚴(yán)格,就會(huì)出現(xiàn)命令執(zhí)行漏洞。下面就按照這個(gè)思路嘗試解題。在輸入框中輸入“”,如圖1-36所示。通過(guò)返回結(jié)果的格式,猜測(cè)這可能是一臺(tái)Windows機(jī)器。圖1-36繼續(xù)進(jìn)行測(cè)試。在輸入框中輸入“|whoami”,如圖1-37所示,提示格式不正確,猜測(cè)網(wǎng)站可能使用了黑白名單功能。圖1-37進(jìn)行模糊測(cè)試。在輸入框中輸入“|dir”,發(fā)現(xiàn)dir命令是可用的。如圖1-38所示,列出了一個(gè)目錄。圖1-38目錄內(nèi)容為“|dirDERFTVYGUHJIBGVYVTY”,如圖1-39所示。圖1-39找到flag文件,直接訪問(wèn),打開了一個(gè)空白頁(yè)面(使用type等命令也無(wú)法讀取其內(nèi)容)。由于題目要求我們讀取flag文件(CTF比賽環(huán)境和實(shí)際網(wǎng)絡(luò)環(huán)境的區(qū)別就體現(xiàn)在這里:在實(shí)際網(wǎng)絡(luò)環(huán)境中,我們無(wú)法確定網(wǎng)站是否存在漏洞;在CTF比賽環(huán)境中,我們可以確定網(wǎng)站一定存在漏洞),所以這里很可能存在文件包含問(wèn)題。在輸入框中輸入“file=DERFTVYGUHJIBGVYVTY/flag.php”,果然出現(xiàn)了我們預(yù)想的結(jié)果,如圖1-40所示,答題結(jié)束。圖1-40小結(jié)在測(cè)試服務(wù)器活性、延遲及文件改名等需要使用系統(tǒng)Shell才能解答的題目中,都可能存在命令執(zhí)行漏洞。碰到這類題目,可以嘗試在“|”“||”“&”“&&”等符號(hào)后面使用其他命令。如果網(wǎng)站沒有對(duì)輸入的數(shù)據(jù)進(jìn)行校驗(yàn),就可以判斷其中存在命令執(zhí)行漏洞。此外,CTF比賽環(huán)境和實(shí)際網(wǎng)絡(luò)環(huán)境區(qū)別很大。在CTF比賽環(huán)境中,我們可以確認(rèn)網(wǎng)站一定存在問(wèn)題,只要考慮使用什么方式找出問(wèn)題即可。這道題目的文件包含問(wèn)題是在解題過(guò)程中猜出來(lái)的。其實(shí),在執(zhí)行dir命令時(shí)就發(fā)現(xiàn)了一個(gè)aa.php.bak文件,我們也可以通過(guò)閱讀這個(gè)文件的源代碼來(lái)讀取flag文件。1.4文件上傳漏洞文件上傳漏洞是在滲透測(cè)試中經(jīng)常會(huì)遇到的一個(gè)漏洞。因?yàn)樯蟼魑募牟僮骱苤苯?,所以,如果攻擊者上傳了可解析的文件,就相?dāng)于擁有了網(wǎng)站的運(yùn)行權(quán)限,在權(quán)限足夠的情況下可以執(zhí)行很多操作。在正常情況下,服務(wù)器會(huì)對(duì)上傳文件的格式或內(nèi)容進(jìn)行校驗(yàn),幾乎不可能允許直接上傳文件。攻擊者需要對(duì)不同的防御方式進(jìn)行繞過(guò),才能上傳文件。常見的上傳繞過(guò)方法列舉如下。?客戶端繞過(guò):抓包、改包。?服務(wù)端繞過(guò):文件類型、文件頭、文件后綴。?配合文件包含漏洞繞過(guò)。?配合服務(wù)器解析漏洞繞過(guò)。?CMS、編輯器漏洞繞過(guò)。?配合操作系統(tǒng)文件命名規(guī)則繞過(guò)。?配合其他規(guī)則繞過(guò)。?WAF繞過(guò)。題目1MIME題目概況在上傳過(guò)程中修改MIME(MultipurposeInternetMailExtensions,多用途互聯(lián)網(wǎng)郵件擴(kuò)展類型)是一種繞過(guò)驗(yàn)證的方法。在CTF比賽中,一般不會(huì)出現(xiàn)MIME題目,而是在題目中添加一些冷門的知識(shí)點(diǎn),以考察選手對(duì)題目的理解能力和信息搜集能力。解題思路這種題目的頁(yè)面往往只有一個(gè)上傳功能。在CTF比賽中,只有上傳表單的頁(yè)面是很常見的。這種題目主要考察選手的上傳繞過(guò)能力,至于題目的難度,一般根據(jù)題目的分值而定:低分題目通常只有一個(gè)上傳頁(yè)面;高分題目通常不會(huì)只考察上傳繞過(guò),而會(huì)伴隨對(duì)其他知識(shí)點(diǎn)的考察。在解題時(shí),首先要知道題目的上傳功能都進(jìn)行了哪些驗(yàn)證。上傳驗(yàn)證大致分為兩種:一種是前端驗(yàn)證,也就是客戶端驗(yàn)證;另一種是后端驗(yàn)證,也就是服務(wù)端驗(yàn)證。前端驗(yàn)證方法只有一種,就是JavaScript驗(yàn)證,即通過(guò)前端JavaScript語(yǔ)言對(duì)上傳的文件進(jìn)行驗(yàn)證,從而判斷文件是否合法。后端驗(yàn)證的方法要比前端驗(yàn)證的方法多一些,常見的有MIME驗(yàn)證、文件目錄驗(yàn)證、文件擴(kuò)展名驗(yàn)證、文件內(nèi)容驗(yàn)證。判斷所采用的驗(yàn)證方法,其實(shí)也很簡(jiǎn)單。打開BurpSuite抓包工具,抓取上傳的數(shù)據(jù)包并進(jìn)行修改。例如,要想驗(yàn)證JavaScript前端過(guò)濾,可以打開BurpSuite,開啟代理,在提交請(qǐng)求時(shí)查看是否可以抓到請(qǐng)求包。如果BurpSuite沒有抓到請(qǐng)求包,而瀏覽器已經(jīng)返回了結(jié)果,就說(shuō)明上傳驗(yàn)證是在前端進(jìn)行過(guò)濾的,請(qǐng)求沒有發(fā)到服務(wù)端;如果抓到了請(qǐng)求包,就說(shuō)明過(guò)濾是在服務(wù)端進(jìn)行的,在解題時(shí)就可以考慮服務(wù)端驗(yàn)證的常用方法(這也是一個(gè)簡(jiǎn)單的驗(yàn)證過(guò)程)。首先,上傳一幅正常的圖片,使用BurpSuite抓取上傳的數(shù)據(jù)包。如圖1-41所示,可以看到文件名稱、文件類型和上傳內(nèi)容。這樣,就可以通過(guò)數(shù)據(jù)包修改文件名稱、文件類型和上傳內(nèi)容,從而繞過(guò)驗(yàn)證了。放行這個(gè)數(shù)據(jù)包,上傳成功,并返回了上傳路徑和文件名稱。圖1-41接下來(lái),判斷驗(yàn)證過(guò)濾的類型。上傳一個(gè)PHP一句話木馬文件,通過(guò)BurpSuite抓取數(shù)據(jù)包,將包轉(zhuǎn)到Repeater模塊中顯示。這樣,就可以重復(fù)提交,不需要重新抓包了,如圖1-42所示。單擊“Go”按鈕,發(fā)送數(shù)據(jù)包,返回了一個(gè)錯(cuò)誤,如圖1-43所示。根據(jù)錯(cuò)誤提示,這是文件類型錯(cuò)誤,不是文件后綴錯(cuò)誤,因此,可以判斷服務(wù)器是通過(guò)MIME文件類型進(jìn)行驗(yàn)證的。這樣,就可以通過(guò)修改MIME類型來(lái)繞過(guò)驗(yàn)證了。圖1-42圖1-43上傳一幅正常的圖片,獲取圖片的格式IMAGE/JPEG。將PHP文件的格式改為這幅圖片的格式,然后上傳,如圖1-44所示。圖1-44從返回信息中可以看出,文件上傳成功,獲得了上傳后的路徑及文件名稱,如圖1-45所示。圖1-45訪問(wèn)上傳后文件的地址,并使用phpinfo()函數(shù)測(cè)試PHP文件是否可以執(zhí)行,如圖1-46所示。圖1-46可以看到,文件已經(jīng)成功上傳且可以執(zhí)行。下面,就可以查看flag文件了。通過(guò)POST方式執(zhí)行“1=echo`dir..\\`;”命令(由于題目網(wǎng)站使用的是Windows服務(wù)器,所以使用dir命令;如果題目網(wǎng)站使用的是Linux服務(wù)器,則應(yīng)使用ls或ll命令),查看當(dāng)前目錄。如圖1-47所示,返回結(jié)果里有“f1a9.php”,這應(yīng)該就是flag文件。圖1-47執(zhí)行“1=echo`type..\\f1a9.php`;”命令(type是DOS下的文本讀取命令,可用于讀取文本內(nèi)容),如圖1-48所示。這樣,我們就成功獲取了flag。圖1-48本題是SSCTF的一道Web類賽題,分值為100分。從分值和題目順序看,應(yīng)該是一道簡(jiǎn)單的題目。打開看題目頁(yè)面,也只有一個(gè)上傳表單,并無(wú)其他內(nèi)容。但是在比賽中,后面的200分甚至300分的題目都陸續(xù)有人答出,而這道題還是無(wú)人能夠解答。很多選手一度認(rèn)為題目出了問(wèn)題,而SSCTF主辦方反饋題目并無(wú)問(wèn)題。如果使用通用的上傳方法都無(wú)法解答題目,那么題目使用的很可能是一種冷門的上傳方法。冷門知識(shí)點(diǎn)在CTF比賽里經(jīng)常見到,主要考察選手的知識(shí)面和搜索能力。到網(wǎng)上搜索相關(guān)信息,找到了一篇關(guān)于某CMS上傳漏洞的文章。這個(gè)漏洞很“奇葩”,并沒有修改Content-Type的內(nèi)容,而是修改了HTTP頭的Content-Type的內(nèi)容——只要修改首字母的大小寫,就可以上傳了,如圖1-49所示。圖1-49小結(jié)文件上傳漏洞出現(xiàn)了很多年,已經(jīng)被安全人員研究透了。CTF比賽考察的知識(shí)點(diǎn)主要是繞過(guò)驗(yàn)證,難點(diǎn)是WAF的繞過(guò)。如果常規(guī)方法都失敗了,就可以去找網(wǎng)上找找已公布的上傳漏洞的相關(guān)信息,往往會(huì)有意外的收獲——這些案例是出題人的靈感來(lái)源。題目2PHP標(biāo)簽題目概況題目地址見鏈接1-2。選手需要獲得下發(fā)的題目才可以解題,默認(rèn)一次下發(fā)只有1小時(shí)的解題時(shí)間。解題思路通過(guò)頁(yè)面上的介紹很容易判斷,這道題考察的是繞過(guò)上傳驗(yàn)證,如圖1-50所示。圖1-50題目頁(yè)面非常簡(jiǎn)單,只有一個(gè)上傳表單,如圖1-51所示。圖1-51既然考察的是繞過(guò)上傳驗(yàn)證,就可以上傳一幅正常的圖片,測(cè)試上傳功能是否正常,如圖1-52所示。提示上傳成功,看來(lái)上傳功能是正常的,如圖1-53所示。圖1-52圖1-53既然上傳功能是正常的,就可以嘗試上傳一個(gè)非法文件。上傳一個(gè)PHP文件,看一下網(wǎng)站是否有驗(yàn)證機(jī)制。如圖1-54所示,文件上傳失敗,頁(yè)面訪問(wèn)被攔截,說(shuō)明網(wǎng)站有驗(yàn)證機(jī)制,不可以直接上傳非法文件。圖1-54接下來(lái),測(cè)試一下網(wǎng)站采取了哪些驗(yàn)證措施。使用BurpSuite抓包工具,抓取上傳PHP文件的請(qǐng)求包。將抓取的包發(fā)送至Repeater模塊,如圖1-55所示。圖1-55上傳一幅圖片,并把圖片改為PHP格式,測(cè)試網(wǎng)站是否會(huì)對(duì)文件后綴進(jìn)行驗(yàn)證。在這里,我們上傳的文件其實(shí)是正常的圖片文件(內(nèi)容和類型都是正常的),只有文件后綴是“.php”,因此,如果上傳成功,就說(shuō)明網(wǎng)站沒有采取驗(yàn)證文件后綴的措施,返回結(jié)果中不會(huì)提示存在405錯(cuò)誤。單擊之前上傳成功的鏈接中的“上傳成功”字樣,就可以獲取文件的地址了。由此可以判斷,網(wǎng)站沒有采取驗(yàn)證文件后綴的措施,只驗(yàn)證了文件的內(nèi)容,如圖1-56所示。圖1-56嘗試將文件的內(nèi)容全部刪除并上傳。如果網(wǎng)站使用的是白名單驗(yàn)證機(jī)制,那么將無(wú)法上傳。如果提示上傳成功,就說(shuō)明網(wǎng)站使用的是黑名單驗(yàn)證機(jī)制,如圖1-57所示。圖1-57刪除一句話木馬中的關(guān)鍵字,以檢測(cè)黑名單的內(nèi)容。刪除“eval”關(guān)鍵字,如圖1-58所示。頁(yè)面上傳成功,如圖1-59所示。圖1-58圖1-59打開/u/1.php,頁(yè)面返回的是文件的內(nèi)容,說(shuō)明PHP文件沒有執(zhí)行,只是作為文本文件顯示出來(lái)了。通過(guò)顯示的內(nèi)容可知,“<?”被刪除了,這將導(dǎo)致PHP標(biāo)簽不完整,PHP文件無(wú)法執(zhí)行,如圖1-60所示。圖1-60現(xiàn)在我們知道,服務(wù)器的黑名單里有“<?”“ecal”兩個(gè)關(guān)鍵字(這也是本題考察的知識(shí)點(diǎn))。熟悉PHP語(yǔ)言的讀者應(yīng)該知道,PHP標(biāo)簽并非只有“<?php?>”一種,而是有四種,列舉如下?,F(xiàn)在,需要從這四種標(biāo)簽里找到一種可以繞過(guò)黑名單的標(biāo)簽?!?lt;?php?>”“<??>”顯然不合適,“<%%>”需要開啟短標(biāo)簽功能,因此,只有第四種比較合適(也是繞過(guò)上傳驗(yàn)證機(jī)制時(shí)經(jīng)常使用的一種標(biāo)簽)。既然有了繞過(guò)方法,就試試看是否可以上傳文件,如圖1-61所示。圖1-61上傳成功,訪問(wèn)文件地址查看結(jié)果,如圖1-62所示。圖1-62頁(yè)面返回內(nèi)容是空白的。查看源代碼,如圖1-63所示。圖1-63還是沒有解析成功。仔細(xì)看這段代碼,發(fā)現(xiàn)字符“php”不見了,這應(yīng)該是沒有成功解析導(dǎo)致的??磥?lái),黑名單里有“php”關(guān)鍵字。把“php”替換為“PHP”(大小寫替換是繞過(guò)黑名單的常用方法),再試試看,如圖1-64所示。圖1-64源代碼頁(yè)是空白的,說(shuō)明已經(jīng)解析了上傳的代碼,如圖1-65所示。圖1-65目前,已經(jīng)繞過(guò)了標(biāo)簽和“php”關(guān)鍵字。但是,黑名單里還有一個(gè)關(guān)鍵字“eval”?!癳val”是必須繞過(guò)的嗎?其實(shí),只要傳輸這個(gè)參數(shù)的值,并將其顯示出來(lái)就可以了,代碼如下,如圖1-66所示。圖1-66重新上傳文件,顯示上傳成功,如圖1-67所示。圖1-67訪問(wèn)文件地址,執(zhí)行l(wèi)s命令,可以看到,已經(jīng)返回對(duì)方的目錄,如圖1-68所示。圖1-68執(zhí)行cat命令,查看flag.php文件,得到flag。提交flag,如圖1-69所示。圖1-69小結(jié)這道題是比較簡(jiǎn)單的,只考察了繞過(guò)上傳驗(yàn)證的知識(shí)點(diǎn)。只要選手熟悉PHP語(yǔ)言的特性,還是比較容易解答的。1.5信息泄露漏洞由于信息泄露漏洞無(wú)法幫助攻擊者直接獲得服務(wù)器權(quán)限,所以通常被網(wǎng)站管理員認(rèn)為是很“雞肋”的一種漏洞。但是,攻擊者往往能通過(guò)被泄露的關(guān)鍵信息獲取數(shù)據(jù)庫(kù)密碼、網(wǎng)頁(yè)源代碼、網(wǎng)站架構(gòu)等,并通過(guò)這些信息采取其他攻擊行為。敏感信息泄露通常有以下幾種情況。?開發(fā)工作完成后未刪除的編輯器緩存文件。?備份的.1、.bak等文件。?開發(fā)工作完成后未刪除的phpinfo、探針等文件。?安裝文件。?SVN信息。?GitHub源代碼中的賬號(hào)和密碼。?服務(wù)器配置不當(dāng)導(dǎo)致的目錄遍歷。?默認(rèn)名稱的可下載數(shù)據(jù)庫(kù)等文件。?可猜測(cè)的目錄地址。題目1CBC-ATTACK題目概況CBC-ATTACK(字節(jié)翻轉(zhuǎn)攻擊)與加密算法的關(guān)系比較緊密。在解答本題時(shí),可以先通過(guò)一個(gè)簡(jiǎn)單的信息泄露漏洞獲得源代碼,再利用字節(jié)翻轉(zhuǎn)攻擊取得flag。解題思路題目頁(yè)面的標(biāo)題為“l(fā)ogin”,頁(yè)面上只有簡(jiǎn)單的登錄框,沒有其他提示,如圖1-70所示??吹降卿浛?,就要進(jìn)行簡(jiǎn)單的注入測(cè)試。測(cè)試發(fā)現(xiàn),網(wǎng)站不存在常規(guī)的注入漏洞。接下來(lái),測(cè)試robots.txt、xxx.php.bak、xxx.php~、xxx.php.swp等文件是否存在。題目中存在test.php~文件,由此可以得到題目的源代碼,如圖1-71所示。圖1-70圖1-71在第2行代碼中,題目給出了一條注釋,是一條提示信息。將該條注釋的內(nèi)容復(fù)制出來(lái),粘貼到登錄框中,單擊登錄按鈕,如圖1-72所示。圖1-72返回信息提示我們,uid的值為1,不允許登錄??磥?lái),解題的關(guān)鍵就是這條注釋。接下來(lái),將源代碼保存到本地,以便查看。這段代碼的大意是:接收一個(gè)字符串,通過(guò)解密算法將這個(gè)字符串的原始數(shù)據(jù)解密,然后將原文數(shù)據(jù)的第17位取出,判定其值是否為4;如果為4,則直接返回flag;如果不為4,則返回不允許登錄的提示信息。題目使用的加密算法已通過(guò)源代碼給出,為CBC。整體解題思路已經(jīng)分析清楚了:構(gòu)造一段密文,使其解密后的明文的第4段的值為4??梢允褂米止?jié)翻轉(zhuǎn)攻擊來(lái)解答本題。首先,需要了解CBC算法的工作原理。圖1-73很好地說(shuō)明了CBC算法的加密方式:先將明文分組與前一個(gè)密文分組(如果是第一組,則與Ⅳ)進(jìn)行XOR運(yùn)算,再進(jìn)行加密。圖1-73CBC算法的解密方式,如圖1-74所示。對(duì)密文分組,先進(jìn)行解密,再進(jìn)行XOR運(yùn)算,就能得到明文分組。圖1-74CBC解密的公式如下。改變Ⅳ的值,只會(huì)影響解密得到的第1組明文。改變密文中的1位,會(huì)導(dǎo)致其所對(duì)應(yīng)的明文塊完全改變,以及下一個(gè)明文塊中的對(duì)應(yīng)位改變,不會(huì)影響其他明文塊的內(nèi)容。密文通常以16個(gè)字符為一組,本題剛好要取第17個(gè)字符,也就是第2組密文的第1個(gè)字符。根據(jù)上面的公式可知,修改第1組密文的第1個(gè)字符會(huì)對(duì)第2組密文的第1個(gè)字符造成影響。因此,只需要遍歷前2個(gè)字節(jié),讓第17個(gè)字符的值為4。使用BurpSuite或自行編寫腳本,用00~ff爆破前2個(gè)字節(jié),得到結(jié)果“a6e250d5bc236431cda41390a6ffbb6f5982a73b32b2371751e89bbc7892d08a”。題目2robots題目概況robots是網(wǎng)站與爬蟲之間的協(xié)議。在滲透測(cè)試前期搜集信息的過(guò)程中,可以通過(guò)robots文件獲取網(wǎng)站的目錄結(jié)構(gòu)。在JUNIORSCTF中有一道分值為500分的真題(CRYPTO-SHOP),難度不大,但如果選手不夠細(xì)心,也很難解答。題目描述如下。解題思路題目描述中多次提到“加密”,于是猜測(cè)題目可能與加密有關(guān)。打開題目頁(yè)面,其中只顯示了一些簡(jiǎn)單的內(nèi)容,具體如下。Gravitycoin的價(jià)格是140.3,而我們目前擁有的Gravitycoin為0,猜測(cè)需要將擁有的Gravitycoin提高到140.3以上才能解題。單擊右鍵,查看源代碼,其中沒有可用的信息。查看Cookie文件,具體如下。在這個(gè)Cookie文件中,先使用Base64進(jìn)行了一次編碼,再使用URL進(jìn)行了一次編碼。還原內(nèi)容,如圖1-75所示。圖1-75由于還原的內(nèi)容沒有實(shí)際意義,所以無(wú)法從Cookie中獲取有效信息。嘗試還原其他文件,例如.bak、.rar、.tar、.gz等,也都失敗了。解題暫時(shí)沒有頭緒。突然想到還沒有查看最基本的robots.tx文件。于是,打開robots.txt文件——找到了我們想要的內(nèi)容。訪問(wèn)rsa.html,頁(yè)面跳轉(zhuǎn)到403.html。查看源代碼,發(fā)現(xiàn)其中有一串JavaScript代碼進(jìn)行了重定向,指向403.html。在這里發(fā)現(xiàn)了一個(gè)公鑰,而題目的主題也是加密,所以這個(gè)公鑰應(yīng)該是解題的關(guān)鍵?,F(xiàn)在,解題思路很明確了:通過(guò)這個(gè)公鑰生成一個(gè)Cookie,將Cookie修改為已購(gòu)買足夠的Gravitycoin,從而獲得flag,如圖1-76所示。圖1-76將公鑰存儲(chǔ)在本地,然后生成一個(gè)Cookie,具體如下。對(duì)特殊符號(hào)進(jìn)行URL編碼,具體如下。用這個(gè)值替換現(xiàn)在的Cookie,我們擁有的Gravitycoin變?yōu)?333,解題成功。1.6代碼審計(jì)代碼審計(jì)就是檢查源代碼中的缺點(diǎn)和錯(cuò)誤信息,分析可能引發(fā)問(wèn)題的安全漏洞。這需要選手具備一定的代碼讀寫能力,讀懂代碼做了什么,從而分析代碼中存在的問(wèn)題。在CTF比賽中,代碼審計(jì)題目一般會(huì)通過(guò)信息泄露的方式“不小心”將源代碼文件提供給選手。選手查看源代碼中的危險(xiǎn)函數(shù)或邏輯漏洞,找出問(wèn)題,完成題目。題目1散列值題目概況“MESSOFHASH”是InternetwacheCTF的一道題目。題目介紹中說(shuō):一位學(xué)生開發(fā)了一種新的登錄管理技術(shù),但它的安全性值得懷疑;散列值是不可破解的,但沒有找到問(wèn)題在哪里。題目提供了一個(gè)附件,其中包含一段PHP代碼,具體如下。解題思路通過(guò)閱讀這些代碼我們應(yīng)該知道,本題需要使用用戶名pr0_adm1n和相應(yīng)的密碼登錄。如題目所述,散列值是不可破解的,散列值0e408306536730731920197920342119的原文幾乎不可能得到。不過(guò),這串密文的開頭是“0e”,問(wèn)題就出在這里(這是PHP代碼審計(jì)中的常見問(wèn)題)。在PHP中,三個(gè)等號(hào)“===”表示比較對(duì)象的類型一致,兩個(gè)等號(hào)“==”表示只要比較對(duì)象的值相等就滿足條件。也就是說(shuō),如果使用“==”,就可以把以“0e”開頭的散列值解釋為0。所以,如果兩個(gè)不同的密碼的散列值都是以“0e”開頭的,那么PHP將認(rèn)為它們是相同的(都是0)。在解題時(shí),只需要構(gòu)造一個(gè)以“0e”開頭的散列值。編寫一個(gè)簡(jiǎn)單的腳本,按照題目給出的代碼使用的計(jì)算方法算出一個(gè)以“0e”開頭的散列值,具體如下。大概一兩分鐘就可以得到結(jié)果。將得到的結(jié)果作為密碼登錄,得到flag。小結(jié)這是一道入門級(jí)的代碼審計(jì)題目(也可以說(shuō)是入門級(jí)的編程題目),要求選手能夠看懂簡(jiǎn)單的代碼,了解PHP中“===”和“==”的區(qū)別。理解了出題人的目的,按照出題人的思路寫出簡(jiǎn)單的腳本,就可以順利解題。題目2對(duì)象注入題目概況對(duì)象注入也稱作反序列化注入,是一種常見的漏洞類型。解題思路打開題目地址,映入眼簾的是一段PHP代碼??吹絇HP代碼,我們應(yīng)該意識(shí)到:在CTF比賽中,只有一種情況會(huì)導(dǎo)致這種現(xiàn)象,那就是代碼審計(jì)。對(duì)于無(wú)法以黑盒方式解答的題目,出題人會(huì)給出關(guān)鍵代碼,讓選手通過(guò)代碼審計(jì)找出漏洞。所以,這段代碼中一定存在漏洞。至于是什么漏洞,就讓我們分析一下吧。以上代碼聲明了一個(gè)類,這個(gè)類里面有$enter和$secret兩個(gè)成員。下面幾行代碼的意圖很明顯。首先,把傳入的$pass參數(shù)反序列化并傳參給$o。如果$o被成功傳參,那么“$o->secret”將被賦值為“*”;同時(shí),如果“$o->secret===$o->enter”成立,就輸出“o->secret”。從這個(gè)過(guò)程中可以獲得一些信息。腳本用于獲取我們傳入的參數(shù),并進(jìn)行反序列化。給$o中的secret賦值:如果$o->secret和$o->enter相等,就輸出這個(gè)值。這個(gè)值當(dāng)然不會(huì)是“*”,如果是這樣,也就不用賦值了,$o->secret的值應(yīng)該就是flag了(也就是說(shuō),輸出$o->secret就可以得到flag了)。那么,如何得到flag呢?要看這段代碼里存在什么漏洞。其實(shí),之前通過(guò)分析我們已經(jīng)有了一些發(fā)現(xiàn):unserialize()函數(shù)是反序列化函數(shù),如果這個(gè)函數(shù)存在,并且出現(xiàn)在確實(shí)有漏洞的代碼中,就可以判斷題目考察的是利用反序列化漏洞輸出$o->secret的值。在PHP中,普通的傳值賦值行為有一個(gè)例外,就是碰到對(duì)象(Object)時(shí)。在PHP5中是通過(guò)引用賦值的(除非明確使用clone關(guān)鍵字進(jìn)行復(fù)制)。PHP支持引用賦值,并使用“$var=&$othervar;”語(yǔ)法。引用賦值意味著兩個(gè)變量指向同一個(gè)數(shù)據(jù),而沒有復(fù)制任何內(nèi)容——這就是解題的關(guān)鍵。我們換一種方式來(lái)表示。由于引用了傳入的參數(shù),a和b引用的是同一個(gè)數(shù)據(jù),所以,在進(jìn)行a+1計(jì)算后,b也會(huì)變成2。于是,將代碼修改如下。根據(jù)引用傳參的特點(diǎn),讓$o->secret和$o->enter的值相等(這樣,這兩個(gè)變量就永遠(yuǎn)相等了),然后輸出序列化字符串“O:8:"just4fun":2:{s:5:"enter";N;s:6:"secret";R:2;}”,如圖1-77所示,提交后得到flag。圖1-77小結(jié)在CTF比賽中,代碼審計(jì)題目的數(shù)量是比較多的。這類題目一般用于考察選手的白盒測(cè)試水平。對(duì)漏洞原理了解得比較深入的選手在解答這類題目時(shí)不會(huì)遇到很大的阻礙。題目3JavaScript代碼審計(jì)題目概況JavaScript代碼審計(jì)是近幾年CTF比賽的寵兒,在國(guó)際和國(guó)內(nèi)的CTF比賽中都會(huì)出現(xiàn)JavaScript代碼審計(jì)方面的題目,下面介紹其中的一道。打開網(wǎng)站,如圖1-78所示,頁(yè)面內(nèi)容的大致意思是:我們認(rèn)為任何人都應(yīng)該放棄像C語(yǔ)言那樣的不安全的語(yǔ)言,使用像JavaScript這樣的更安全的語(yǔ)言。圖1-78解題思路從題目介紹中可以看出,出題人講了一個(gè)笑話,言外之意就是要找到題目中JavaScript代碼的漏洞。我們先按照正常的思路來(lái)解題。單擊導(dǎo)航欄的功能菜單,沒有獲得有用的信息。接下來(lái),輸入“admin”或“user”,將打開一個(gè)輸入框。輸入“test”,提示密碼錯(cuò)誤,如圖1-79所示。圖1-79打開Chrome的控制臺(tái),查看發(fā)送的包和當(dāng)前的Cookie,如圖1-80所示??梢钥闯?,我們向服務(wù)器發(fā)送了值為“test”的密碼,Cookie為“session=eyJhZG1pbiI6Im5vIn0=”和“session.sig=wwg0b0z2AQJ2GCyXHt53ONkIXRs”。將“eyJhZG1pbiI6Im5vIn0=”解碼,得到原始數(shù)據(jù)“{"admin":"no"}”。將其中的“no”改為“yes”,使用Base64進(jìn)行編碼,然后提交Cookie,測(cè)試結(jié)果為無(wú)效。圖1-80既然常規(guī)方法無(wú)效,我們就需要從JavaScript腳本入手了。查看app.js文件。通過(guò)“varexpress=require('express');”可以看出,使用的是expressjs。接著,查看routes/index.js文件??梢钥吹剑陨洗a將config.secret_password傳遞給了admin的flag參數(shù)。在views/admin.jade文件中可以看到如下代碼。登錄驗(yàn)證密碼是否存在,然后創(chuàng)建buffer()函數(shù),將這個(gè)緩沖器(Buffer)轉(zhuǎn)換為一個(gè)Base64字符串并與secret_password進(jìn)行比較。如果二者相等,那么將會(huì)話置為“admin='yes'”。在password里輸入一些數(shù)據(jù),進(jìn)行模糊測(cè)試,會(huì)發(fā)現(xiàn)碰到了Buffer類。輸入不同的參數(shù),執(zhí)行buffer()函數(shù),會(huì)得到不同的結(jié)果。我們用node.js測(cè)試一下。通過(guò)以上結(jié)果可知:如果Buffer的內(nèi)容是字符串,就會(huì)創(chuàng)建正常的緩沖器;如果Buffer的內(nèi)容是數(shù)字,就會(huì)創(chuàng)建一個(gè)比原來(lái)的數(shù)據(jù)大的緩沖器,并且結(jié)果是不同的。這是因?yàn)?,Buffer(number)不會(huì)清空內(nèi)存,并且可能會(huì)泄露之前的數(shù)據(jù)。這樣,就可以通過(guò)輸入數(shù)字讓Buffer造成內(nèi)存泄露,從而獲取其他信息。接下來(lái),將password置為數(shù)字,然后輸入。繼續(xù)發(fā)送這些數(shù)據(jù)。多次發(fā)送之后,就會(huì)造成數(shù)據(jù)泄露。在多次發(fā)送之后,我們發(fā)現(xiàn)這里泄露了一個(gè)會(huì)話。嘗試使用這個(gè)會(huì)話替換登錄,登錄成功,如圖1-81所示。圖1-81小結(jié)這道題目的難度比較大。通過(guò)審計(jì)JavaScript代碼可知,我們輸入的密碼將作為Buffer的參數(shù)。利用數(shù)字造成內(nèi)存泄露的方法是有一定難度的,選手們?cè)谄綍r(shí)需要多掌握一些這樣的小技巧。1.7暴力破解暴力破解就是使用窮舉法的思想根據(jù)給出的條件確定密碼的大致范圍,并在此范圍內(nèi)對(duì)所有可能的情況逐一進(jìn)行驗(yàn)證,“碰”到符合條件的那一個(gè)。在CTF比賽中,常見的暴力破解題目一般是碰撞一個(gè)以“xx”開頭的MD5值,或者碰撞一些驗(yàn)證碼和簡(jiǎn)單密碼等。題目MD5密碼破解題目概況MD5是一種被廣泛使用的密碼散列函數(shù),可以產(chǎn)生一個(gè)128位(16字節(jié))的散列值,用于確保信息傳輸?shù)囊恢滦?。在CTF比賽中,MD5密碼破解的題目多種多樣,下面介紹一種常見的題目形式。解題思路打開頁(yè)面,看到“pleaseinputa”,看來(lái)題目需要我們輸入a的值??墒?,a的值是什么,對(duì)這個(gè)值有什么要求?現(xiàn)在我們還不知道。單擊右鍵,查看源代碼。這個(gè)方法在很多時(shí)候都是獲取線索的最直接的途徑。出題人往往喜歡把一些想要讓選手們知道的內(nèi)容放在源代碼里,這道題目就是如此。我們看到了一段PHP代碼,如圖1-82所示。圖1-82在這段代碼的開頭定義了一個(gè)變量@md51,其值是字符串“QNKCDZO”的MD5值。傳入的a在@md5后傳給了@md52。接下來(lái),我們判斷傳入的a的值。該值不可能是“QNKCDZO”,并且傳入的值要等于“QNKCDZO”加密后的MD5值。滿足這些條件,就能輸出flag了。盡管現(xiàn)在知道a要傳入什么了,但相信讀者還是有些發(fā)暈。既要不等于字符串,又要等于這個(gè)字符串的MD5值——怎么看都是題目出錯(cuò)了。我們先不管這個(gè)問(wèn)題,計(jì)算一下“QNKCDZO”的MD5值,如圖1-83所示。圖1-83看到MD5值開頭的“0e”,恍然大悟——PHP有一個(gè)散列值比較漏洞,利用的就是以“0e”開頭的MD5值。在PHP中,比較一般都是用“==”和“===”實(shí)現(xiàn)的。我們先看幾個(gè)實(shí)驗(yàn),如圖1-84所示。圖1-84可以看出:在第一次比較中,a在比較時(shí)會(huì)自動(dòng)轉(zhuǎn)換為數(shù)字,所以有“0=a”;第二次比較也是這樣,如果兩邊都為數(shù)字,就會(huì)全部轉(zhuǎn)換為數(shù)值型再進(jìn)行比較;后面兩次比較使用了科學(xué)計(jì)數(shù)法,通過(guò)科學(xué)計(jì)數(shù)法的換算,“1e1”就等于前面的值。再做一個(gè)實(shí)驗(yàn),如圖1-85所示。圖1-85看到了吧,兩個(gè)MD5值在使用科學(xué)計(jì)數(shù)法換算后都等于0——兩個(gè)原本不同的MD5值在PHP的比較符下變得相等了。回到本題。我們除了需要找到代碼里的“QNKCDZO”字符串,還需要找到一個(gè)以“0e”開頭的MD5值。一段遍歷可以生成以“0e”開頭的MD5值的代碼如下。執(zhí)行以上代碼,可以獲得一個(gè)字符串,如圖1-86所示。從這些字符串中任意取一個(gè)傳給a,成功獲取flag,如圖1-87所示。圖1-86圖1-87相關(guān)知識(shí)點(diǎn)以“0e”開頭的MD5值,如表1-2所示。表1-2小結(jié)本題考察的是PHP的散列值比較漏洞。這個(gè)知識(shí)點(diǎn)在實(shí)際應(yīng)用中有一定的局限性,因此本題算是一道比較冷門的題目(符合CTF的出題思路)。1.8反序列化序列化是指把對(duì)象轉(zhuǎn)換成字節(jié)流,以便保存在內(nèi)存、文件、數(shù)據(jù)庫(kù)中。反序列化是序列化的逆過(guò)程,即把字節(jié)流還原成對(duì)象。如果應(yīng)用對(duì)用戶輸入(不可信數(shù)據(jù))進(jìn)行了反序列化處理,攻擊者就可以通過(guò)構(gòu)造惡意輸入讓反序列化產(chǎn)生非預(yù)期的對(duì)象,而非預(yù)期的對(duì)象在產(chǎn)生過(guò)程中可能導(dǎo)致任意代碼的執(zhí)行。?在Java程序中,反序列化一般可以通過(guò)執(zhí)行命令獲取相應(yīng)的權(quán)限。?在PHP程序中,反序列化一般可以通過(guò)“==”對(duì)比不嚴(yán)謹(jǐn)而造成Cookie、會(huì)話或權(quán)限繞過(guò)等。因?yàn)镴ava反序列化代碼執(zhí)行漏洞一般都有比較成熟的利用工具,所以其在CTF比賽中出現(xiàn)的概率不高。在很多時(shí)候,CTF賽題都是通過(guò)PHP的反序列化來(lái)偽造Cookie,以登錄相應(yīng)的賬號(hào),再進(jìn)行進(jìn)一步操作的。題目messagecenter題目概況本題的標(biāo)題為“messagecenter”(來(lái)自HackoverCTF),表示傳遞用戶之間發(fā)送的信息。題目主界面的內(nèi)容包括:歡迎信息;測(cè)試登錄賬號(hào)/密碼demo/demo、demo2/demo2;用戶Alice、Bob和其他用戶。解題思路題目的主界面上有一個(gè)登錄框,如圖1-88所示。配合題目概況,我們大體可以知道,本題考察的是如何通過(guò)Alice、Bob或類似admin的用戶登錄以獲取flag。如何登錄這些賬號(hào)?可以使用的方法有注入、XSS、偽造Cookie。圖1-88利用題目給出的測(cè)試賬號(hào)登錄,登錄后可以發(fā)送和讀取信息,那么解題思路很可能是利用XSS取得管理員的Cookie,然后拿到flag。測(cè)試一下,發(fā)現(xiàn)確實(shí)存在XSS,但沒有管理員、Bob、Alice和其他有價(jià)值用戶的Cookie。所以,我們剛才的想法可能“跑偏”了。檢查Cookie,發(fā)現(xiàn)其中包含用戶名等信息,如圖1-89所示。圖1-89這很像是序列化后的數(shù)據(jù)。使用PHP反序列化方法還原對(duì)象,具體如下。運(yùn)行腳本,得到如下結(jié)果。這里的Cookie是由用戶名和加密后的密碼組成的。在1.6節(jié)中,我們介紹過(guò)PHP的比較方式,分為“==”和“===”。如果程序中使用的是“==”,那么“password==正確的密碼”和“password==True”的結(jié)果是一樣的。嘗試使用賬號(hào)admin和密碼“True”生成一個(gè)Cookie,具體如下。得到Cookie的值“a%3A2%3A%7Bs%3A8%3A%22username%22%3Bs%3A5%3A%22admin%22%3Bs%3A8%3A%22password%22%3Bb%3A1%3B%7D”。進(jìn)行登錄測(cè)試,結(jié)果失敗了。接下來(lái),使用同樣的方式生成賬號(hào)Alice、Bob的Cookie。如圖1-90所示,使用Alice的Cookie登錄系統(tǒng)后,獲得了flag,答題完成。圖1-90小結(jié)本題主要考察選手對(duì)PHP反序列化漏洞的掌握程度:看到“messagecenter”這個(gè)標(biāo)題就應(yīng)該知道,可能需要利用XSS進(jìn)一步查看Cookie;了解Cookie的格式后,就應(yīng)該想到可以通過(guò)反序列化和PHP比較直接將密碼置為“True”。1.9綜合滲透綜合滲透是一種接近實(shí)戰(zhàn)的題目,包括多種漏洞的組合,重點(diǎn)考察選手的實(shí)戰(zhàn)能力。題目1命令執(zhí)行題目概況如果在實(shí)際滲透測(cè)試中碰到命令執(zhí)行漏洞,就代表可以直接獲取一個(gè)Shell。在CTF比賽中,也有很多命令執(zhí)行漏洞方面的題目。解題思路題目界面上只有一個(gè)登錄窗口,使用admin/admin無(wú)法登錄,提示密碼錯(cuò)誤。換成test/test,提示用戶名錯(cuò)誤,說(shuō)明用戶名是admin。接下來(lái),需要獲取admin的密碼。嘗試使用萬(wàn)能密碼登錄。輸入“admin'or'1'='1”,發(fā)現(xiàn)系統(tǒng)安裝了WAF,并且會(huì)返回“illegalcharacter!!@_@”。查看源代碼,發(fā)現(xiàn)其中有一段Base64編碼。將其解密,得到一個(gè)SQL查詢語(yǔ)句(這應(yīng)該是登錄查詢語(yǔ)句)。Base64編碼如下。解密得到的SQL查詢語(yǔ)句如下。通過(guò)以上測(cè)試,我們得到了WAF返回的提示?,F(xiàn)在可以測(cè)試一下過(guò)濾了哪些關(guān)鍵字。通過(guò)嘗試,發(fā)現(xiàn)WAF過(guò)濾了關(guān)鍵字“```空格```”“```or```”“```and```”“```union```”“```+```”“```*```”“```逗號(hào)```”,未被過(guò)濾的關(guān)鍵字有“```()```”“```'```”“```=```”“```select```”“```from```”“```where```”,以及不含關(guān)鍵字的MySQL自帶函數(shù)。通過(guò)前面的測(cè)試,根據(jù)返回的內(nèi)容,可以判斷這里存在盲注。盲注是一種無(wú)法通過(guò)直接顯示來(lái)獲取數(shù)據(jù)庫(kù)中的數(shù)據(jù)的方法。在盲注中,攻擊者會(huì)根據(jù)返回頁(yè)面的不同(可能是頁(yè)面內(nèi)容不同,也可能是響應(yīng)時(shí)間不同)來(lái)獲取信息。既然知道存在盲注,就要考慮如何繞過(guò)WAF并進(jìn)行注入。在MySQL中,空格可以用括號(hào)來(lái)代替。例如,下面這兩個(gè)語(yǔ)句是沒有區(qū)別的。?使用空格:```select*fromadminwhereuname="admin"```。?使用括號(hào):```select(*)from(admin)where(uname)=("admin")```。這樣,空格的問(wèn)題就解決了。查詢語(yǔ)句的結(jié)尾是一個(gè)單引號(hào),而我們構(gòu)造的語(yǔ)句的結(jié)尾肯定是一個(gè)括號(hào),因此,需要構(gòu)造單引號(hào)來(lái)閉合語(yǔ)句。在MySQL的where語(yǔ)句里,允許進(jìn)行如下比較。比較過(guò)程為從左至右依次比較。需要注意的是,在MySQL中,字符串表示為真,數(shù)字1同樣表示為真(字符串格式的數(shù)字亦然),而數(shù)字0可以表示為假(字符串格式的數(shù)字亦然),沒取到數(shù)據(jù)也可以表示為假。比較過(guò)程如下。最后的比較結(jié)果為真。所以,我們可以控制其中的邏輯:讓原來(lái)的查詢條件(uname=xxx)為假,讓最后的比較(xxx='0')為假,即可任意控制中間的數(shù)字1;加上MySQL的子查詢,即可構(gòu)造完整的Payload。SQL查詢語(yǔ)句如下。提交之后,提示“passworderror”,說(shuō)明uname被提取出來(lái)了,即我們給出的條件為真。如果uname沒有被提取,那么將會(huì)提示“usernameerror”,即我們給出的條件為假,如圖1-91所示。接下來(lái),可以利用這個(gè)盲注猜測(cè)passwd有多少位。使用二分法可知密碼為32位,應(yīng)該是一個(gè)MD5值。圖1-91現(xiàn)在就要猜測(cè)MD5的字符了。在這里發(fā)現(xiàn)逗號(hào)被過(guò)濾了,所以要先繞過(guò)逗號(hào)。在進(jìn)行盲注時(shí),需要使用substr()、mid()、limit()方法,而這些子句方法都需要使用逗號(hào)。對(duì)于substr()和mid()這兩個(gè)方法,可以使用from的方式解決。但是,for里又包含關(guān)鍵字or,所以for也不能用。嘗試直接把“for1”刪除,發(fā)現(xiàn)命令可以執(zhí)行。不斷更換最后一個(gè)from后面的1(N),則mid()或substr()將從右往左取第N位到末尾。最后的語(yǔ)句如下。判斷第32位字符是否為f,是就為真,否就為假。通過(guò)返回結(jié)果“```usernameerror```”可以判斷最后一個(gè)字符不是f(因?yàn)镸D5值只有數(shù)字0~9、字母a~f這16個(gè)字符)。只要我們逐一嘗試,就能知道每一個(gè)位置是什么字符了,如圖1-92所示。執(zhí)行如下語(yǔ)句,返回的是“```passworderror```”,可以知道第32位字符為5。繼續(xù)使用這個(gè)方法進(jìn)行測(cè)試。手工測(cè)試比較煩瑣,可以自己制作一個(gè)字典,使用BurpSuite進(jìn)行遍歷,也可以自己寫一個(gè)腳本進(jìn)行遍歷。在本題中,遍歷的結(jié)果是“```e2e31a427d2e8c4851b53f7eeb9fff95```”,通過(guò)MD5破解,密碼為“```test888```”,如圖1-93所示。圖1-92圖1-93有了密碼,就可以登錄了,如圖1-94所示。圖1-94登錄后,并沒有得到預(yù)想中的flag,而是看到了一個(gè)輸入框。這很可能是一個(gè)命令輸入框。嘗試輸入“```ls```”,顯示命令執(zhí)行成功,因此,可以判斷這里有一個(gè)命令執(zhí)行漏洞。那么,具體有什么限制呢?執(zhí)行幾條命令試試看吧。輸入常用的“```ls```”等命令,發(fā)現(xiàn)無(wú)法得到返回結(jié)果,只會(huì)提示是否成功。然而,如果沒有得到返回結(jié)果,就無(wú)法找到目錄。該怎么辦呢?這時(shí)就需要利用“```CloudEye```”或“```WebServerLog```”把數(shù)據(jù)透?jìng)鞒鰜?lái),執(zhí)行命令“```curl```”將數(shù)據(jù)轉(zhuǎn)發(fā)到我們自己的服務(wù)器,然后使用“```head```”和“```tail```”命令讀取數(shù)據(jù),最后直接查看我們自己的服務(wù)器的“```WebServerLog```”,從而獲得數(shù)據(jù)。最終的命令如下?!癭``-n```”后面的“```1```”是顯示的行數(shù)。只要調(diào)整這個(gè)值,就可以看到整個(gè)目錄。經(jīng)過(guò)不斷嘗試,執(zhí)行以下命令,就可以得到flag“```flag{7f22b26386864eba}```”了,如圖1-95所示。小結(jié)本題利用了兩個(gè)漏洞,包括一個(gè)盲注漏洞和一個(gè)命令執(zhí)行漏洞。多個(gè)漏洞組合構(gòu)成題目是近來(lái)比較流行的CTF賽題形式。圖1-95題目2越權(quán)訪問(wèn)題目概況越權(quán)漏洞,簡(jiǎn)單地理解就是用戶通過(guò)漏洞訪問(wèn)非授權(quán)的頁(yè)面或功能(越權(quán)訪問(wèn))。在中國(guó)網(wǎng)絡(luò)安全大賽中就有一道關(guān)于越權(quán)漏洞的題目。解題思路訪問(wèn)題目網(wǎng)址,可以看到一個(gè)管理后臺(tái)。查看源代碼(要養(yǎng)成這個(gè)習(xí)慣,往往會(huì)有意外發(fā)現(xiàn)),找到一個(gè)測(cè)試賬號(hào)demo,其密碼為123456,如圖1-96所示。使用測(cè)試賬號(hào)登錄,登錄失敗,看來(lái)這個(gè)賬號(hào)已經(jīng)無(wú)法使用了。圖1-96返回管理后臺(tái)首頁(yè)。登錄頁(yè)面是CTF比賽最常見的考察點(diǎn),一共有三種破解方法:暴力破解;SQL注入(萬(wàn)能密碼);越權(quán)訪問(wèn)。在本題中,我們從暴力破解開始進(jìn)行測(cè)試。首先,使用默認(rèn)賬號(hào)admin,密碼可以通過(guò)暴力破解獲取。在這里,使用BurpSuite進(jìn)行爆破,如圖1-97所示。接下來(lái),抓取登錄請(qǐng)求的數(shù)據(jù)包。要實(shí)現(xiàn)抓包功能,就必須將BurpSuite設(shè)置為瀏覽器代理。這樣,從瀏覽器向服務(wù)器發(fā)送的數(shù)據(jù)包就會(huì)被BurpSuite攔截下來(lái)。圖1-97代理設(shè)置完成后,就可以進(jìn)行爆破了。單擊“Interceptison”按鈕,開啟抓包模式,如圖1-98所示。然后,在題目的管理后臺(tái)頁(yè)面填寫用戶名“admin”和任意密碼,單擊登錄按鈕,就可以看到剛剛輸入的用戶名和密碼了。圖1-98按“Ctrl+R”快捷鍵,或者單擊右鍵,在彈出的快捷菜單中選擇“SendtoIntruder”選項(xiàng),進(jìn)入BurpSuite的“Intruder”標(biāo)簽頁(yè),在“Positions”頁(yè)面中單擊“Clear”按鈕,清除所有默認(rèn)參數(shù)。由于我們只需要破解密碼,所以,選中wf_upawd參數(shù),然后單擊“Add”按鈕,添加密碼項(xiàng),如圖1-99所示。圖1-99進(jìn)入“Payloads”頁(yè)面,在“Addfromlist…”下拉列表中選擇“passwords”選項(xiàng)(這

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論