忽海娜,劉宇建,丁 豹,平 源
(許昌學院 信息工程學院,河南 許昌 461000)
隨著互聯網信息化的不斷發展,Web應用得到了迅速開發,為互聯網的進步發揮著非常重要的作用,但同時,隨之而來的安全問題也日益凸顯.《Radware 2018年Web應用安全現狀》報告中指出,應用層攻擊的頻率和復雜性在不斷增長,至少89%的受訪者在過去一年都遭遇過針對Web應用或Web服務器的攻擊[1].因此,Web安全問題成了當前信息安全領域的熱門關注點,國內各高校信息安全相關專業也相繼開設《Web應用安全》《Web安全技術》等相關課程關注這一熱點問題[2-4].
以我校為例,《Web安全技術》是信息安全專業的核心課程,具有很強的實踐性和應用性,在教學過程中需引入大量的實驗任務,幫助學生更好地理解Web攻擊的原理和漏洞的成因,從而提高學生的漏洞檢測能力和修復能力.但是,課程應該包括哪些方面的實驗內容,如何對實驗內容進行合理的設計,選擇什么樣的實驗平臺,如何開展實驗教學,這些都是亟待解決和研究的問題.

圖1 Web攻擊態勢分析
Web技術日新月異,Web 安全的威脅狀況也在不斷變化,因此,在設計《Web 安全技術》實驗教學內容時,緊跟當前Web安全的行業和技術發展態勢,同時按照我校應用型人才的培養要求[5],從實踐角度出發,圍繞2017年OWASP(Open Web Application Security Project,開放式Web應用程序安全項目)公布的Web安全十大威脅[6],同時結合國內阿里云發布的《2019上半年Web應用安全報告》[7]中的Web攻擊態勢分析(如圖1所示),最終將常見的SQL注入、代碼注入、XML外部實體注入(XXE注入)、敏感信息泄露、XSS跨站腳本攻擊、文件包含、文件上傳、不安全的反序列化等作為主要教學內容.針對每部分的教學內容,設計操作性較強的實驗案例,對Web漏洞的成因和原理進行分析,同時對相關技術進行驗證.
此外,考慮到Web安全問題的復雜性,即Web安全問題不僅僅是由某個單一的漏洞造成的,基于此,在基礎實驗項目完成之后,設計了一個綜合的Web滲透測試實驗項目,包含網絡嗅探、漏洞掃描、信息收集、漏洞檢測與利用、提權等相關內容,可以多維度地對Web服務器的安全問題進行分析.最終,《Web安全技術》課程設計的實驗內容,如表1所示.

表1 Web安全實驗設計
因Web安全相關的實驗項目具有一定的攻擊性和破壞性,不能在真實的Web網站上進行,需要自主搭建Web安全實驗教學平臺.而在實驗平臺的遴選上,國內高校更傾向于選擇開源的Web漏洞平臺,其中大多選擇的是DVWA平臺[8].
DVWA是一套開源的、適用于常規Web漏洞教學和檢測的Web脆弱性測試程序,包含了諸如SQL注入、XSS等常見的一些Web安全漏洞,可以滿足基本的實驗需求.但因后續版本更新太慢的問題,導致新的Web 漏洞未在平臺中及時更新,比如2017版OWASP TOP 10公布的一些漏洞,像XML外部實體注入、不安全的反序列化、越權等漏洞并未被包含在DVWA平臺中,平臺的實驗場景過于陳舊,而過于陳舊的安全攻防內容以及環境受限的實驗設計缺乏實際應用價值.
Pikachu平臺也是一套開源的且易于搭建的Web漏洞平臺.與DVWA相比,Pikachu平臺以最新發布的OWASP TOP 10為核心不斷更新漏洞模塊,截止目前,Pikachu平臺包含了常見的SQL注入、代碼注入、XML外部實體注入、敏感信息泄露、XSS跨站腳本攻擊、文件包含、文件上傳、PHP反序列化等15種Web漏洞場景,如圖2所示.同時,Pikachu平臺中的每類漏洞,根據不同的情況分別設計了不同的子類,以SQL注入漏洞為例,又分為數字型注入、字符型注入、搜索型注入、HTTP Header注入、布爾盲注(Base on Boolean)、時間盲注(Base on Time)和寬字節注入等十種不同類型的SQL注入漏洞.豐富的漏洞場景可以滿足不同的Web安全實驗需求.此外,Pikachu平臺的代碼結構清晰,內容易讀,在虛擬機搭建好之后,學生可以根據實驗的不同需求,修改Pikachu平臺的源代碼.比如,適當添加一些過濾函數,增加實驗的難度等.
課程在對DVWA和Pikachu兩大平臺進行對比分析的基礎上,最終確定采用Pikachu平臺作為《Web安全技術》的實驗教學平臺.
以2019級信息安全專業為例,根據Web安全的實驗項目和班級的學生人數,將學生以3人為單位,分為10個小組,每組學生可以選擇Pikachu平臺的不同漏洞模塊或者同一漏洞模塊的不同內容.在掌握漏洞基本原理的基礎上,各小組在搭建好的Pikachu平臺上進行實驗,并將實驗的整個過程,包括漏洞成因分析、漏洞檢測、漏洞利用以及漏洞防御等過程撰寫成文檔報告,同時將漏洞檢測和利用的過程在課堂上進行演示、分享.
以寬字節注入為例,學生在掌握寬字節注入的基本原理后,在Pikachu平臺上完成了實驗的整個過程,整理形成的報告如下.

圖2 Pikachu平臺漏洞模塊
當GPC開啟或使用addslashes、mysql_escape_string等函數過濾提交的參數時,SQL注入的經典語句【id=1'】,其中的單引號會被轉義而變成【id=1’】,這樣就使得單引號無法閉合SQL語句,從而達到防御SQL注入的目的,這種防御方式一般情況下是很難繞過的.此時,針對字符轉義,可以嘗試使用寬字節注入方式.
寬字節注入發生的原因就是PHP發送請求到MySQL時,字符集使用character_set_client設置值進行了一次編碼,如果編碼為GB2312、GBK等雙字節編碼,就會存在寬字節注入漏洞[9].
寬字節帶來的安全問題主要是編碼轉換引起的“吃ASCII字符”的現象,如果拼接合理,可以在吃掉一個字節后,將剩余內容重新拼接成一個單引號.簡單來說,就是“’”轉義了單引號“'”,當PHP連接MySQL的編碼為GBK時,注入格式為【id=1%df'】,因為反斜杠“”的編碼為“%5c”,所以參數傳到后端經過轉義后就會變成【id=1%df%5c'】,其中GBK會將“%df%5c”編碼成一個繁體字“運”,這樣反斜杠就失去了轉義的效果,使得單引號逃逸出來閉合了語句,具體分析如圖3所示.

圖3 寬字節注入漏洞成因分析
第1步:訪問Pikachu平臺地址“http://192.168.136.135/pikachu/”,選擇“SQL-Inject”模塊的“寬字節注入”.通過測試,發現這是一個POST傳參,所以結合Burp Suite截獲數據包,利用Repeater 重放模塊進行測試分析.
第2步:在Repeater模塊中,嘗試修改參數【name=vince'】后發送數據包,頁面無任何返回信息.此時,對Pikachu后臺的源代碼文件“sqli_widebyte.php”進行修改,添加一條輸入語句“echo$query”,將SQL查詢的語句顯示在頁面上,便于對輸出結果進行分析.
第3步:再次發送上述數據包,頁面返回SQL查詢的語句為:【select id,email from member where username='vince’'】,單引號“'”被轉義為“’”.
第4步:嘗試使用寬字節注入的方式.在Burp Suite截獲數據包中,直接修改參數【name=vince%df' or 1=1#】 后發送數據包,瀏覽器頁面返回SQL查詢的語句為:【select id,email from member where username='vince運' or 1=1 #'】(此處需設置瀏覽器的編碼為中文模式),查詢結果如圖4所示.數據表中相關字段的內容都顯示在了頁面上.從圖4中也可以看出,寫入的參數在實際執行語句中發生了較大的變化,前面輸入的“%df”已經吃掉了反斜杠“”,并將其轉換為一個繁體字“運”,使得單引號逃逸出來閉合了語句.說明,此處存在寬字節注入漏洞.

圖4 漏洞測試返回結果
利用聯合查詢,對存在的寬字節注入漏洞進一步利用.
第1步:構造Payload為“vince%df' union select database(),2 #”,爆出當前數據庫名為“pikachu”.
第2步:構造Payload為“vince%df' union select(select group_concat(table_name)from information_schema.tables where table_schema=database()),2 #”,爆出當前數據表名為“httpinfo,member,message,users,xssblind”.
第3步:構造Payload為“vince%df' union select group_concat(column_name)from information_schema.columns where table_name=0x7573657273,2 #”,爆出數據表“users”的字段名為“id,username,password,level”.
第4步:構造Payload為“vince%df' union select group_concat(username),group_concat(password)from users #”,爆出用戶名和密碼,如圖5所示.

圖5 爆出用戶名和密碼
寬字節注入漏洞的最好防御方式就是統一編碼標準,Web頁面及數據庫均使用UTF-8進行編碼.
在Pikachu平臺上進行驗證.修改Pikachu后臺的源代碼文件“sqli_widebyte.php”,將此行代碼$set=“set character_set_client=gbk”,修改為:$set=“set character_set_client=utf8”.保存退出后,在Burp Suite的Repeater模塊中重新發送Payload:“vince%df' union select group_concat (username),group_concat (password) from users #”,后臺數據庫未查詢出數據,返回結果如圖6所示.

圖6 漏洞代碼修復后的查詢結果
在對Web常見漏洞的基本原理、成因及檢測方式熟練掌握的基礎上,本課程設置的最后一個實驗項目為Web滲透測試,要求學生以滲透測試的思路,完成Web平臺的漏洞檢測與利用的整個過程.其中,在Web滲透測試平臺的遴選上,建議每組學生從VulnHub或者GitHub網站上下載漏洞平臺源代碼,搭建在虛擬機環境中,并按照Web滲透測試的流程,對漏洞平臺進行網絡嗅探、端口掃描、信息收集、漏洞檢測、漏洞利用、提權等攻擊行為,盡可能地挖掘出Web平臺中存在的漏洞.
截止目前,學生在完成實驗項目的過程中,遴選出了一些非常不錯的Web滲透測試平臺,其中包括Zico2、Billu_b0x、HackInOS、Wakanda、Hackme等靶機平臺.以HackInOS平臺為例,它是一款CTF風格的Web漏洞平臺,學生在虛擬機上搭建完成后,找到了平臺中存在的文件上傳漏洞,之后利用該漏洞上傳WebShell拿到權限,最終利用Docker逃逸成功提權,拿到了“flag”文件的信息,如圖7所示.

圖7 HackInOS平臺滲透測試報告
圍繞Web安全十大威脅,對《Web安全技術》課程的實驗項目設計、實驗平臺遴選、實驗開展過程等環節進行了一系列的探索與實踐.在基礎實驗項目的開展過程中,以Pikachu平臺的漏洞實例為導向,將知識點與實驗項目緊密結合,學生在完成實驗的過程中,通過對代碼的深入分析,可以透徹理解漏洞的成因,掌握漏洞的挖掘技術和防御策略.而Web綜合滲透測試實驗的開展,一方面學生需要自主搜尋合適的“靶機”平臺,充分調動了學生的主動性,另一方面,學生需要采用“黑盒測試”的模式,對“靶機”平臺中存在的漏洞進行檢測與利用,最大限度地激發了學生的學習興趣.課程實踐表明,《Web安全技術》實驗教學效果良好,學生在具體實驗過程中能夠牢牢地掌握知識要點和專業技能.