陳剛 逯柳
摘? ?要:文章分析了SQL注入、XSS,CSRF、文件上傳漏洞等常見Web系統(tǒng)安全問題的攻擊方式和原理,并給出了防護機制和解決方法,能有效提高Web系統(tǒng)運作時的安全性和魯棒性。
關(guān)鍵詞:Web系統(tǒng)安全;結(jié)構(gòu)化查詢語言注入;跨站腳本攻擊;跨站請求偽造攻擊;文件上傳漏洞
隨著互聯(lián)網(wǎng)的發(fā)展,Web系統(tǒng)目前已經(jīng)成為主要的互聯(lián)網(wǎng)應(yīng)用平臺,而Web系統(tǒng)的安全性問題越來越突出,造成的損失和影響也越來越大。開放式Web應(yīng)用程序安全項目(Open Web Application Security Project,OWASP)在2017年公布了十大Web安全漏洞列表[1]。本文對常見Web系統(tǒng)安全漏洞中的攻擊原理和方法進行了分析和研究,并給出了相應(yīng)的防護措施。
1? ? Web系統(tǒng)安全問題
1.1? SQL注入
結(jié)構(gòu)化查詢語言(Structured Query Language,SQL)注入,就是把惡意SQL命令插入到統(tǒng)一資源定位符(Uniform Resource Locator,URL)中或Web表單的輸入域中,欺騙服務(wù)器執(zhí)行惡意SQL命令以達到攻擊目的。
1.1.1? SQL注入攻擊原理
SQL注入攻擊是利用Web程序設(shè)計上的漏洞或數(shù)據(jù)庫漏洞來進行攻擊。Web程序在動態(tài)生成SQL語句時沒有對用戶輸入的數(shù)據(jù)進行驗證,攻擊者通過構(gòu)建特殊輸入值作為參數(shù)傳給Web程序,這些輸入值一般是合法SQL語句的組合,通過執(zhí)行這些SQL語句進而執(zhí)行攻擊操作。
1.1.2? SQL注入攻擊基本方法
首先,判斷Web系統(tǒng)是否具有SQL注入漏洞及漏洞類型。一般在URL后使用單引號、and,or或xor等構(gòu)建注入語句,如在正常的鏈接http://xxx/yyy.php&id=num后加單引號:http://xxx/yyy.php&id=num,就能構(gòu)成基本的SQL注入漏洞存在判斷語句。其次,在鏈接后構(gòu)建數(shù)字型或字符型表達式判斷注入點的數(shù)據(jù)類型,如http://xxx/yyy.php&id=numand‘1=1返回true,而http://xxx/yyy.php&id=num and‘2=1返回false,則能斷定注入點的類型為字符型。
在判斷Web系統(tǒng)有注入點后,就可以進行數(shù)據(jù)庫、表及字段等信息的獲取。如使用注入語句and (Select count(*) from 猜測的表名)<>0或and exists (select * from 猜測的表名),進行表名猜測;猜測出表名后使用語句and (Select count(列名) from 表名)<>0或and exists (select 列名 from 表名)進行字段名猜測。也可以使用數(shù)據(jù)庫內(nèi)置函數(shù)來獲得數(shù)據(jù)庫信息,比如使用union select 1, database()獲得數(shù)據(jù)庫名,使用union select 1, table_name from information_schema.tables where table_schema=database()獲得表名。
在獲得數(shù)據(jù)庫基本信息后,就可以使用查詢語句得到Web系統(tǒng)的一些關(guān)鍵數(shù)據(jù)和信息,比如管理員的賬號和密碼,利用這些信息完成進一步的注入和攻擊。
1.2? XSS攻擊
跨站腳本(Cross Site Scripting,XSS)攻擊,XSS攻擊通常指的是利用網(wǎng)頁開發(fā)時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網(wǎng)頁,使用戶加載并執(zhí)行攻擊者惡意制造的網(wǎng)頁程序[2]。
1.2.1? XSS攻擊原理
XSS惡意攻擊者在Web頁面里插入惡意Script(PHP,js等)腳本代碼,當用戶瀏覽該頁時,如果服務(wù)器端沒有對這些數(shù)據(jù)進行過濾、驗證或者編碼,惡意腳本代碼就會在客戶端的瀏覽器上執(zhí)行,盜取客戶端Cookies等敏感信息,從而達到惡意攻擊目的。
1.2.2? XSS攻擊基本方法
XSS攻擊分為反射型、持久型和DOM型3種基本方式。
反射型XSS攻擊一般以頁面表單或URL為途徑,使用get或者post方法向服務(wù)器端傳遞包含惡意腳本的數(shù)據(jù),或是在URL的查詢字符串中包含腳本。
持久型XSS攻擊一般以留言板、評論或博客等交互平臺為途徑,在留言中嵌入惡意代碼,并上傳存儲至服務(wù)器中,只要受害者瀏覽包含此惡意代碼的頁面,就會執(zhí)行惡意代碼。
DOM型XSS攻擊類似于反射型XSS,只是DOM型攻擊是通過在網(wǎng)頁的DOM樹中嵌入惡意腳本來實現(xiàn)的。
1.3? CSRF攻擊
跨站請求偽造(Cross-Site Request Forgery,CSRF)攻擊通過偽裝來自受信任用戶的請求而達成攻擊。CSRF按照請求方式可分為GET類型和POST類型。按照攻擊方式可分為HTML CSRF,JSOM HiJacking和Flash CSRF等類型。
1.3.1? CSRF攻擊原理
CSRF攻擊者通過技術(shù)手段欺騙用戶的瀏覽器去訪問已認證過的網(wǎng)站并執(zhí)行一些惡意操作,因為瀏覽器之前被認證過,所以服務(wù)器會認為這是合法的用戶操作而去執(zhí)行,最終達到攻擊目的。
1.3.2? CSRF攻擊基本方法
首先,正常用戶使用瀏覽器登錄并訪問授信網(wǎng)站A,在用戶信息通過驗證后,網(wǎng)站A生成用戶的Cookie信息并返回給瀏覽器,此時用戶成功登錄網(wǎng)站A,可給網(wǎng)站A發(fā)送正常請求。其次,在用戶未退出網(wǎng)站(或者用戶Cookie信息沒過期)之前,用戶在同一瀏覽器中打開一個惡意網(wǎng)站B,網(wǎng)站B接收到用戶請求后,返回一些攻擊性代碼,并發(fā)出訪問站點A的請求。再次,瀏覽器在接收到這些攻擊性代碼后,根據(jù)網(wǎng)站B的請求,在用戶不知情的情況下攜帶Cookie信息,向網(wǎng)站A發(fā)出請求。最后,網(wǎng)站A并不知道該請求是由網(wǎng)站B發(fā)起的,所以會根據(jù)用戶的Cookie信息以及權(quán)限處理該請求,導(dǎo)致來自網(wǎng)站B的惡意代碼被執(zhí)行。
1.4? 文件上傳漏洞攻擊
1.4.1? 文件上傳漏洞攻擊原理
Web應(yīng)用系統(tǒng)通常具有文件上傳功能,如圖片發(fā)布和文檔文件上傳等,如果Web系統(tǒng)沒有對上傳文件的格式和內(nèi)容進行嚴格過濾和檢查,攻擊者就可把包含惡意代碼的文件上傳到Web服務(wù)器上,再通過服務(wù)器對文件的解析而達成攻擊,上傳的文件可以是木馬、病毒、惡意腳本或者WebShell等。
1.4.2? 文件上傳漏洞攻擊基本方法
現(xiàn)以漏洞庫exploit-db中編號為60560的LibrettoCMS文件上傳漏洞為例說明該攻擊方法。LibrettoCMS是一款使用PHP和MySQL開發(fā)的Web系統(tǒng),允許用戶上傳未經(jīng)驗證的文件,并可對已上傳的文件名進行修改。首先,攻擊者將惡意文件(比如采用PHP語言編寫的WebShell后門程序)后綴名改為.doc或.pdf進行上傳,上傳成功后再將后綴名修改為.php,此時已經(jīng)將惡意文件上傳到Web服務(wù)器中,通過瀏覽器直接訪問該文件便可啟動該WebShell。其次,通過該WebShell后門程序,攻擊者就可以在服務(wù)器上執(zhí)行系統(tǒng)命令,執(zhí)行任意PHP代碼,進行文件的任意操作,包括對數(shù)據(jù)庫的操作。最后,借助該WebShell,攻擊者還可擦除攻擊過程中留下的痕跡,可將該WebShell隱藏在管理員不易發(fā)現(xiàn)的位置,或者上傳更多的木馬和病毒程序。
2? ? Web系統(tǒng)安全防護
2.1? SQL注入攻擊的防護
使用正則表達式對用戶的輸入進行校驗和過濾;對單引號等特殊字符進行轉(zhuǎn)換等操作;減少動態(tài)SQL語句的使用,使用參數(shù)化的SQL語句;對數(shù)據(jù)庫中的敏感信息進行加密;使用自定義的錯誤提示信息。
2.2? XSS攻擊的防護
對輸入和URL參數(shù)進行過濾,檢查輸入的內(nèi)容中是否有非法內(nèi)容,如<>,”,,%,;,()、&和+等特殊字符;對動態(tài)輸出到頁面的內(nèi)容進行HTML編碼,使腳本無法在瀏覽器中執(zhí)行;對Session標記、HTTP引用頭進行檢查;設(shè)置Cookie的HttpOnly屬性為true。
2.3? CSRF攻擊的防護
將持久化的授權(quán)方法(例如Cookie或者HTTP授權(quán))切換為瞬時的授權(quán)方法,如在每個表單中提供隱藏字段,作為Cookie之外的驗證;驗證HTTP Referer字段,HTTP頭中有一個Referer字段,這個字段用以標明請求來源于哪個地址,在處理敏感數(shù)據(jù)請求時,Referer字段應(yīng)和請求的地址位于同一域名下;在請求地址中添加token并驗證,由于CSRF的本質(zhì)在于攻擊者欺騙用戶去訪問自己設(shè)置的地址,所以如果要求在訪問敏感數(shù)據(jù)請求時,要求用戶瀏覽器提供不保存在Cookie中,并且攻擊者無法偽造的數(shù)據(jù)作為校驗,那么攻擊者就無法再進行CSRF攻擊。
2.4? 文件上傳漏洞攻擊的防護
Web系統(tǒng)對上傳的文件進行重命名,比如上傳的文件名和目錄名由系統(tǒng)根據(jù)一定規(guī)則(如上傳時間或隨機字符串)構(gòu)成,并將其存放在數(shù)據(jù)庫中,系統(tǒng)使用文件時,通過查詢數(shù)據(jù)庫動態(tài)獲取。禁止用戶自定義或修改文件名,將文件上傳的目錄設(shè)置為不可執(zhí)行,并記錄上傳文件日志;限制并檢查上傳文件的類型和大小,比如采用白名單策略,文件擴展名不在白名單中的文件均為不合法,對于白名單中的特定文件,還可采用分析文件頭內(nèi)容的方法來驗證文件,如PNG文件頭標識為8字節(jié):89 50 4E 47 0D 0A 1A 0A,GIF文件頭標識為6字節(jié):47 49 46 38 39(37) 61。
3? ? 結(jié)語
Web系統(tǒng)安全問題種類眾多,本文僅對常見的安全問題進行了分析。由于Web系統(tǒng)在現(xiàn)實中面臨的攻擊往往是由多種攻擊方式聯(lián)合構(gòu)成。因此,在對系統(tǒng)的防護上也要采取綜合防護手段,才能有效提高系統(tǒng)的安全性。對于要上線的Web系統(tǒng),在正式上線前,需要聘請專業(yè)的安全團隊對系統(tǒng)進行完整的滲透測試,根據(jù)測試報告對系統(tǒng)進行整改,經(jīng)過試運行后才可上線。
[參考文獻]
[1]OWASP.2017 OWASP TOP 10[EB/OL].(2017-12-04)[2019-08-10].http://www.owasp.org.cn/owasp-project/2017-owasp-top-10.
[2]蘇鵬.跨站點腳本攻擊XSS的攻擊原理與防護[J].電子科學(xué)技術(shù),2014(1):83-87.
Abstract:This paper analyzes the attack mode and principle of common Web system security problems, such as SQL injection and XSS, CSRF, file upload vulnerability, and gives the protection mechanism and solution, which can effectively improve the security and robustness of Web system.
Key words:Web system security; structured query language injection; cross-site request forgery; file upload vulnerability