跨站腳本(Cross-Site Scripting,XSS)是一種經(jīng)常出現(xiàn)在Web應用程序中的計算機安全漏洞唤崭,是由于Web應用程序?qū)τ脩舻妮斎脒^濾不足而產(chǎn)生的。攻擊者利用網(wǎng)站漏洞把惡意的腳本代碼(通常包括HTML代碼和客戶端Javascript腳本)注入到網(wǎng)頁之中脖律,當其他用戶瀏覽這些網(wǎng)頁時谢肾,就會執(zhí)行其中的惡意代碼,對受害用戶可能采取Cookie資料竊取小泉、會話劫持芦疏、釣魚欺騙等各種攻擊。
XSS跨站腳本攻擊本身對Web服務器沒有直接危害微姊,它借助網(wǎng)站進行傳播酸茴,使網(wǎng)站的大量用戶受到攻擊。攻擊者一般通過留言兢交、電子郵件或其他途徑向受害者發(fā)送一個精心構造的惡意URL薪捍,當受害者在Web瀏覽器中打開該URL的時侯,惡意腳本會在受害者的計算機上悄悄執(zhí)行。
XSS可能造成的危害
(1)網(wǎng)絡釣魚酪穿,包括盜取各類用戶賬號与倡;
(2)竊取用戶cookies資料,從而獲取用戶隱私信息昆稿,或利用用戶身份進一步對網(wǎng)站執(zhí)行操作;
(3)劫持用戶(瀏覽器)會話息拜,從而執(zhí)行任意操作溉潭,例如進行非法轉(zhuǎn)賬、強制發(fā)表日志少欺、發(fā)送電子郵件等喳瓣;
(4)傳播跨站腳本蠕蟲等;
(5)提升用戶權限赞别,包括進一步滲透網(wǎng)站畏陕;
(6)大量的客戶端攻擊,如DDoS攻擊仿滔;
(7)獲取客戶端信息惠毁,例如用戶的瀏覽歷史、真實IP崎页、開放端口等鞠绰;
(8)控制受害者機器向其他網(wǎng)站發(fā)起攻擊;
(9)結合其他漏洞飒焦,如CSRF漏洞蜈膨,實施進一步作惡。
為什么XSS如此普遍和流行牺荠?
僅從技術上看該問題:
(1)Web瀏覽器本身的設計是不安全的翁巍。瀏覽器包含了解析和執(zhí)行JavaScript等腳本語言的能力,這些語言可用來創(chuàng)建各種格式豐富的功能休雌,而瀏覽器只會執(zhí)行灶壶,不會判斷數(shù)據(jù)和程序代碼是否惡意。
(2)輸入與輸出是Web應用程序最基本的交互杈曲,在這過程之中若沒做好安全防護例朱,Web程序很容易會出現(xiàn)XSS漏洞。
一個JavaScripts腳本來舉例說明:
<html>
<head>test</head>
<body>
<script>alert("XSS")</script>
</body>
</html>
把JavaScript加入到Web頁面中非常簡單鱼蝉,只要頁面中包含一個 script 標記洒嗤,就可以增加想要的JavaScript代碼。HTML的script元素標記中間包含JavaScript魁亦,這使瀏覽器知道:當它遇到script 標記時渔隶,不將此標記內(nèi)容處理成 HTML或XHTML,從這一點開始,對于內(nèi)容的控制權已轉(zhuǎn)移給另一個內(nèi)置的瀏覽器代理——腳本引擎處理间唉。
XSS攻擊就是將非法的JavaScript绞灼、VBscript等腳本注入到用戶瀏覽的網(wǎng)頁上執(zhí)行,而Web瀏覽器本身的設計是不安全的呈野,它只負責解釋和執(zhí)行JavaScript等腳本語言低矮,而不會判斷代碼本身是否對用戶有害。
XSS的分類
XSS根據(jù)其特性和利用手法的不同被冒,主要分成兩大類型:一種是反射型跨站腳本军掂;另一種是持久型跨站腳本。
反射型跨站腳本(Reflected Cross-site Scripting)也稱作非持久型昨悼、參數(shù)型跨站腳本蝗锥。這種類型的跨站腳本是最常見,也是使用最廣的一種率触,主要用于將惡意腳本附加到URL地址的參數(shù)中终议。
反射型XSS的利用一般是攻擊者通過特定手法(比如利用電子郵件),誘使用戶去訪問一個包含惡意代碼的URL葱蝗,當受害者單擊這些專門設計的鏈接的時候穴张,惡意JavaScript代碼會直接在受害者主機上的瀏覽器執(zhí)行。它的特點是只在用戶單擊時觸發(fā)两曼,而且只執(zhí)行一次陆馁,非持久化,所以稱為反射型跨站式腳本合愈。
此類 XSS 通常出現(xiàn)在網(wǎng)站的搜索欄叮贩、用戶登入口等地方,常用來竊取客戶端 Cookies 或進行釣魚欺騙佛析。
反射型XSS的危害往往不如持久型益老,因為惡意代碼暴露在URL參數(shù)中,只有用戶單擊方可觸發(fā)寸莫,稍微有點安全意識的用戶可以輕易看穿該鏈接是不可信任的捺萌。但一般URL轉(zhuǎn)碼后帶有迷惑性,路邊的URL不要隨便采膘茎。
持久型跨站腳本(Persistent Cross-site Scripting)也等于存儲型跨站腳本(Stored Cross-site Scripting)桃纯,比反射型跨站腳本更具威脅性,并且可能影響到Web服務器自身的安全披坏。此類XSS不需要用戶單擊特定URL就能執(zhí)行跨站腳本态坦,攻擊者事先將惡意JavaScript代碼上傳或存儲到漏洞服務器中,只要受害者瀏覽包含此惡意JavaScript代碼的頁面就會執(zhí)行惡意代碼棒拂。
持久型 XSS 一般出現(xiàn)在網(wǎng)站的留言伞梯、評論玫氢、博客日志等交互處,惡意腳本被存儲到客戶端或者服務器的數(shù)據(jù)庫中谜诫,當其他用戶瀏覽該網(wǎng)頁時漾峡,站點即從數(shù)據(jù)庫中讀取惡意用戶存入的非法數(shù)據(jù),然后顯示在頁面中喻旷,即在受害者主機上的瀏覽器執(zhí)行惡意代碼生逸。
測試的福音:XSS語句列表
XSS語句列表羅列了各種各樣的XSS代碼,這些XSS代碼在不同的瀏覽器且预、不同的應用場景槽袄、不同的環(huán)境下均有跨站觸發(fā)的可能。通常辣之,此類列表被稱為Cheat Sheet,即我們平時所指的備忘單皱炉。
國外著名安全工程師Rsnake是研究XSS方面的高手怀估,他把自己對XSS的研究心得總結成Cheat Sheet,并在其個人主頁分享了一份常見的XSS攻擊腳本列表合搅,可用來檢測Web應用程序是否存在XSS 漏洞多搀。
可以通過http://ha.ckers.org/xss.html 看到這份XSS Cheat Sheet。一些測試用例如下
開發(fā)編程注意
通常情況下灾部,為了防御跨站腳本攻擊康铭,會在Web應用中設計一個XSS Filter,即跨站腳本過濾器赌髓,用于分析用戶提交的輸入从藤,并消除潛在的跨站腳本攻擊、惡意的HTML或簡單的HTML格式錯誤等锁蠕。XSS Filter一般是基于黑白名單的安全過濾策略夷野,即把要處理的數(shù)據(jù)分成白名單和黑名單兩大列表,白名單存放的是可信賴荣倾、對應用程序不構成威脅的數(shù)據(jù)列表悯搔,黑名單則相反。
(1)利用< >標記注射Html /Javascript舌仍。
如果用戶可以隨心所欲地引入< >等標記妒貌,那么他就能操作一個HTML標簽,然后通過<scirpt>標簽就能任意插入由JavaScript或Vbscript編寫的惡意腳本代碼铸豁,如:<script>alert('XSS'); </script>
因此灌曙,XSS Filter首當其沖要進行過濾和轉(zhuǎn)義的就是“< >”或 “<script>” 等字符。
(2)利用HTML標簽屬性值執(zhí)行XSS节芥。
很多HTML標記中的屬性都支持javascript:[code]偽協(xié)議的形式平匈,這個特殊的協(xié)議類型聲明了URL的主體是任意的JavaScript代碼,由JavaScript的解釋器運行。因為不是所有的Web瀏覽器都支持JavaScript偽協(xié)議增炭,所以此類XSS攻擊具有一定的局限性忍燥。
并不是所有標記的屬性值都能產(chǎn)生XSS,通常只有引用文件的屬性才能觸發(fā)跨站腳本隙姿。
總而言之梅垄,要防御基于屬性值的XSS,就要過濾JavaScript等關鍵字输玷。并非所有嵌入到Web頁面中的腳本都是JavaScript队丝,還有其他允許值,比如Vbscript欲鹏。
(3)空格回車Tab机久。
如果XSS Filter僅僅把敏感的輸入字符列入黑名單處理,如對敏感字 javascript而言赔嚎,用戶可以利用空格膘盖、回車和Tab鍵繞過限制,請看下面的例子:<img src="javas cript:alert(/xss/)" width=100>尤误,請注意javas和cript之間的間隔不是由空格鍵添加的侠畔,而是用【Tab】鍵添加的。
(4)對標簽屬性值轉(zhuǎn)碼损晤。
對普通HTML標記的屬性值進行過濾软棺,用戶可以通過編碼處理來繞過,因為HTML中屬性值本身支持ASCII碼形式尤勋。舉例把XSS代碼:<img src="javascript:alert('XSS');"> 換成:<img src="javascript:alert(/XSS/);" >
(5)產(chǎn)生自己的事件喘落。
假設用戶不依靠屬性值進行跨站,那還有沒有其他方法最冰?答案是肯定的揖盘,事件就是其中一種方法。JavaScript與HTML之間的交互是通過事件來實現(xiàn)的锌奴,事件就是用戶或瀏覽器自身執(zhí)行的某種動作兽狭,比如click、mouseover鹿蜀、load等箕慧,而響應事件的函數(shù)就叫做事件處理函數(shù)(或事件偵聽器)。
(6)利用CSS跨站剖析茴恰。
XSS跨站腳本的另一個載體是CSS樣式表颠焦,使用CSS樣式表執(zhí)行JavaScript具有隱蔽、靈活多變等特點往枣,但是 CSS 樣式表有一個很大的缺點:各瀏覽器之間不能通用伐庭,甚者可能同一瀏覽器不同版本之間都不能通用粉渠。使用CSS直接執(zhí)行JavaScript代碼的如下:
<div style="background-image:url(javascript:alert('XSS'))">
<style>
body {background-image: url("javascript:alert('XSS')");}
</style>
(7)擾亂過濾規(guī)則。
利用前面所述的各種技巧圾另,包括 HTML 標簽屬性值霸株、事件、CSS集乔、編碼技術等去件,用戶能順利繞過XSS Filter的重重過濾。
一個正常的XSS輸入:<img src="javascript:alert(0);">
轉(zhuǎn)換大小寫后的XSS:<IMG SRC="javascript:alert(0);">
大小寫混淆的XSS:<iMg sRC="jaVasCript:alert(0);">
不用雙引號扰路,而是使用單引號的XSS:<img src='javascript:alert(0);'>
不使用引號的XSS:<img src=javascript:alert(0);>
拋開正常的XSS測試用例尤溜,運用以上的任何一種示例都有可能繞過XSS Filter。
看完上邊內(nèi)容大致了解了:在什么環(huán)境下可以觸發(fā)XSS汗唱,利用XSS漏洞可以做什么宫莱,如何防范此類攻擊等。