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