網(wǎng)站安全之XSS漏洞攻擊以及防范措施
XSS漏洞是網(wǎng)站漏洞中最容易出現(xiàn)的一種,至少現(xiàn)在的各大網(wǎng)站中基本都存在,傳聞只有g(shù)mail是唯一一個(gè)完全不存在的,或者說攻擊者沒找出漏洞的,也許是因?yàn)閄SS漏洞看起來危害并不是那么的大吧,所以基本上沒有得到過太大的重視,從而也就造成了這么多的網(wǎng)站存在著一些很簡(jiǎn)單就能發(fā)現(xiàn)的XSS漏洞,在這篇blog中以我這個(gè)網(wǎng)站安全的外行人的角度來侃侃XSS漏洞攻擊以及防范的措施。
XSS漏洞的出現(xiàn)簡(jiǎn)單來說,就是讓不支持富文本的區(qū)域支持了富文本的執(zhí)行,例如blog的標(biāo)題是不支持富文本的,但由于頁(yè)面顯示時(shí)沒去做處理,導(dǎo)致了可以在標(biāo)題中嵌入像文本加粗、變顏色等等的普通HTML,當(dāng)然,攻擊者也就可以嵌入惡意的javascript了,例如獲取你在當(dāng)前網(wǎng)站的cookie的javascript:document.cookie等等,另外一種就是支持富文本的區(qū)域沒有去過濾一些惡意的javascript,例如blog的文章內(nèi)容中內(nèi)嵌獲取cookie等惡意的javascript代碼,這兩類現(xiàn)象太多了,反倒是富文本的區(qū)域會(huì)好一些,例如多數(shù)論壇采用的UBB等等,而且對(duì)于富文本,大家都會(huì)比較重視,但反而是非富文本區(qū)域,很容易忽略其會(huì)產(chǎn)生XSS漏洞。
上面說的好像有些太抽象了,舉個(gè)例子來說吧,例如blog的標(biāo)題,假設(shè)在存到數(shù)據(jù)庫(kù)的時(shí)候是直接將blog標(biāo)題文本框中的內(nèi)容存儲(chǔ),在顯示的時(shí)候直接用$blog.title這樣的方式去顯示的話,那么只要在blog標(biāo)題中輸入<script>alert(document.cookie);</script>,然后保存,在顯示的時(shí)候這段javascript就會(huì)被正常執(zhí)行了,雖然這樣的看似沒有什么大的危害,但攻擊者同樣不會(huì)采取這么簡(jiǎn)單的方式,例如可以直接給你一段經(jīng)過url編碼的串,而其中就是利用網(wǎng)站的XSS漏洞將你的cookie信息發(fā)送至一個(gè)攻擊性質(zhì)的記錄cookie的網(wǎng)站等,又或者完全可以利用網(wǎng)站的XSS漏洞埋上一段隱藏的img來嵌入這樣而已的url,那么你的cookie就會(huì)不知不覺的被盜用,而偏偏現(xiàn)在大部分的網(wǎng)站都是借助cookie來代表用戶的身份,這樣,當(dāng)攻擊者拿到cookie之后,也就可以假冒你的身份大搖大擺的進(jìn)入相應(yīng)的網(wǎng)站了。
上面說的是比較典型的一種XSS漏洞產(chǎn)生的情況,另外一種比較典型的是dom xss的情況,這種情況多數(shù)是攻擊者利用直接閉合標(biāo)簽,從而執(zhí)行惡意的javascript代碼,例如頁(yè)面中有個(gè)文本框,這個(gè)文本框的內(nèi)容在提交后會(huì)被記錄并繼續(xù)顯示在結(jié)果頁(yè)面的文本框架中,假設(shè)第二個(gè)頁(yè)面中文本框是這么寫的:<input type=text value="$!prevPage.someText">,那么只要在前一頁(yè)面中輸入"><script>alert(document.cookie);</script>這樣的內(nèi)容,在第二個(gè)頁(yè)面顯示的時(shí)候就會(huì)變成:<input type=text value=""><script>alert(document.cookie);</script>>,攻擊者通過閉合input標(biāo)簽實(shí)現(xiàn)了執(zhí)行惡意的javascript代碼,同樣,如果你的javascript中也有類似的讀取url參數(shù)或前頁(yè)提交的內(nèi)容,又或數(shù)據(jù)庫(kù)中的內(nèi)容的話,攻擊者都有可能利用這種閉合標(biāo)簽的方式來實(shí)施攻擊。
這樣看起來,產(chǎn)生XSS漏洞的地方確實(shí)可能會(huì)有很多,說完上面這些,大家估計(jì)仍然覺得xss漏洞即使被利用也沒什么吧,確實(shí),也許xss漏洞只能做到盜用個(gè)用戶cookie來玩玩,但是一旦它盜用了cookie,然后再結(jié)合一些其他的攻擊手段,例如csrf的話,很有可能會(huì)造成非常嚴(yán)重的后果,當(dāng)年的MySpace攻擊事件就源于此,更何況對(duì)于大部分的網(wǎng)站來說,用戶身份被盜也不是什么好事。
因此還是有必要對(duì)XSS漏洞進(jìn)行防范的,根據(jù)上面闡述的XSS漏洞產(chǎn)生的原因來說,對(duì)于非富文本的區(qū)域來講,其實(shí)只需要對(duì)其進(jìn)行HTML編碼就沒問題了,而對(duì)于富文本的區(qū)域,則相對(duì)麻煩一些,需要有一個(gè)有效的過濾攻擊性質(zhì)的html代碼的方式,但這個(gè)確實(shí)很難很難完全做到100%的防范,因?yàn)榫帉憪阂鈎tml代碼的方式實(shí)在太多了,url編碼方式,注釋方式,十六進(jìn)制方式等等,完全無法窮舉,但目前出現(xiàn)在網(wǎng)站中的,其實(shí)大部分都是非富文本的XSS漏洞,只要對(duì)這些非富文本的XSS漏洞進(jìn)行了防范的話,至少可以很大程度的提升網(wǎng)站攻擊的門檻,不至于被一些很簡(jiǎn)單的攻擊手段攻擊,像freemarker模板中,可以直接支持變量字符的html編碼,例如${user?html}這樣的方式就可以了,還是很簡(jiǎn)單的,:)。
XSS漏洞的出現(xiàn)簡(jiǎn)單來說,就是讓不支持富文本的區(qū)域支持了富文本的執(zhí)行,例如blog的標(biāo)題是不支持富文本的,但由于頁(yè)面顯示時(shí)沒去做處理,導(dǎo)致了可以在標(biāo)題中嵌入像文本加粗、變顏色等等的普通HTML,當(dāng)然,攻擊者也就可以嵌入惡意的javascript了,例如獲取你在當(dāng)前網(wǎng)站的cookie的javascript:document.cookie等等,另外一種就是支持富文本的區(qū)域沒有去過濾一些惡意的javascript,例如blog的文章內(nèi)容中內(nèi)嵌獲取cookie等惡意的javascript代碼,這兩類現(xiàn)象太多了,反倒是富文本的區(qū)域會(huì)好一些,例如多數(shù)論壇采用的UBB等等,而且對(duì)于富文本,大家都會(huì)比較重視,但反而是非富文本區(qū)域,很容易忽略其會(huì)產(chǎn)生XSS漏洞。
上面說的好像有些太抽象了,舉個(gè)例子來說吧,例如blog的標(biāo)題,假設(shè)在存到數(shù)據(jù)庫(kù)的時(shí)候是直接將blog標(biāo)題文本框中的內(nèi)容存儲(chǔ),在顯示的時(shí)候直接用$blog.title這樣的方式去顯示的話,那么只要在blog標(biāo)題中輸入<script>alert(document.cookie);</script>,然后保存,在顯示的時(shí)候這段javascript就會(huì)被正常執(zhí)行了,雖然這樣的看似沒有什么大的危害,但攻擊者同樣不會(huì)采取這么簡(jiǎn)單的方式,例如可以直接給你一段經(jīng)過url編碼的串,而其中就是利用網(wǎng)站的XSS漏洞將你的cookie信息發(fā)送至一個(gè)攻擊性質(zhì)的記錄cookie的網(wǎng)站等,又或者完全可以利用網(wǎng)站的XSS漏洞埋上一段隱藏的img來嵌入這樣而已的url,那么你的cookie就會(huì)不知不覺的被盜用,而偏偏現(xiàn)在大部分的網(wǎng)站都是借助cookie來代表用戶的身份,這樣,當(dāng)攻擊者拿到cookie之后,也就可以假冒你的身份大搖大擺的進(jìn)入相應(yīng)的網(wǎng)站了。
上面說的是比較典型的一種XSS漏洞產(chǎn)生的情況,另外一種比較典型的是dom xss的情況,這種情況多數(shù)是攻擊者利用直接閉合標(biāo)簽,從而執(zhí)行惡意的javascript代碼,例如頁(yè)面中有個(gè)文本框,這個(gè)文本框的內(nèi)容在提交后會(huì)被記錄并繼續(xù)顯示在結(jié)果頁(yè)面的文本框架中,假設(shè)第二個(gè)頁(yè)面中文本框是這么寫的:<input type=text value="$!prevPage.someText">,那么只要在前一頁(yè)面中輸入"><script>alert(document.cookie);</script>這樣的內(nèi)容,在第二個(gè)頁(yè)面顯示的時(shí)候就會(huì)變成:<input type=text value=""><script>alert(document.cookie);</script>>,攻擊者通過閉合input標(biāo)簽實(shí)現(xiàn)了執(zhí)行惡意的javascript代碼,同樣,如果你的javascript中也有類似的讀取url參數(shù)或前頁(yè)提交的內(nèi)容,又或數(shù)據(jù)庫(kù)中的內(nèi)容的話,攻擊者都有可能利用這種閉合標(biāo)簽的方式來實(shí)施攻擊。
這樣看起來,產(chǎn)生XSS漏洞的地方確實(shí)可能會(huì)有很多,說完上面這些,大家估計(jì)仍然覺得xss漏洞即使被利用也沒什么吧,確實(shí),也許xss漏洞只能做到盜用個(gè)用戶cookie來玩玩,但是一旦它盜用了cookie,然后再結(jié)合一些其他的攻擊手段,例如csrf的話,很有可能會(huì)造成非常嚴(yán)重的后果,當(dāng)年的MySpace攻擊事件就源于此,更何況對(duì)于大部分的網(wǎng)站來說,用戶身份被盜也不是什么好事。
因此還是有必要對(duì)XSS漏洞進(jìn)行防范的,根據(jù)上面闡述的XSS漏洞產(chǎn)生的原因來說,對(duì)于非富文本的區(qū)域來講,其實(shí)只需要對(duì)其進(jìn)行HTML編碼就沒問題了,而對(duì)于富文本的區(qū)域,則相對(duì)麻煩一些,需要有一個(gè)有效的過濾攻擊性質(zhì)的html代碼的方式,但這個(gè)確實(shí)很難很難完全做到100%的防范,因?yàn)榫帉憪阂鈎tml代碼的方式實(shí)在太多了,url編碼方式,注釋方式,十六進(jìn)制方式等等,完全無法窮舉,但目前出現(xiàn)在網(wǎng)站中的,其實(shí)大部分都是非富文本的XSS漏洞,只要對(duì)這些非富文本的XSS漏洞進(jìn)行了防范的話,至少可以很大程度的提升網(wǎng)站攻擊的門檻,不至于被一些很簡(jiǎn)單的攻擊手段攻擊,像freemarker模板中,可以直接支持變量字符的html編碼,例如${user?html}這樣的方式就可以了,還是很簡(jiǎn)單的,:)。
posted on 2008-11-23 19:02 BlueDavy 閱讀(5006) 評(píng)論(2) 編輯 收藏 所屬分類: 業(yè)界隨想