Michael Cobb:自上世紀(jì)90年代,攻擊者就已經(jīng)開始利用XSS漏洞,并且,最主要的網(wǎng)站(例如谷歌、雅虎和Facebook)都在一定程度上受到過XSS漏洞的影響。與大多數(shù)應(yīng)用層攻擊(例如SQL注入),基于XSS的攻擊會攻擊應(yīng)用的用戶,而不是應(yīng)用或服務(wù)器。這些攻擊的工作原理是注入代碼(通常例如JavaScript客戶端腳本)到Web應(yīng)用的輸出。大部分網(wǎng)站有很多注入點(diǎn),包括搜索域、cookies和表格。雖然這些惡意腳本不能直接感染服務(wù)器端信息,它們?nèi)匀豢梢云茐木W(wǎng)站的安全性。通過使用Document Object Model操作來更改表格值,改變網(wǎng)頁的外觀或切換表格操作以張貼提交的數(shù)據(jù)到攻擊者的網(wǎng)站,攻擊者可以竊取數(shù)據(jù)、控制用戶的會話、運(yùn)行惡意代碼或用作網(wǎng)絡(luò)釣魚欺詐的一部分。
XSSI是XSS的一種形式,它利用了這樣一個(gè)事實(shí),即瀏覽器不會阻止網(wǎng)頁加載圖像和文字等資源,這些資源通常托管在其他域和服務(wù)器。例如,腳本可能提供攻擊者需要的功能,幫助創(chuàng)建特定的頁面—很多網(wǎng)站包含托管在https://developers.google.com/speed/libraries/#jquery的JavaScript庫jQuery。然而,這種包含可能被利用來從一個(gè)域名讀取用戶數(shù)據(jù)—當(dāng)用戶正在訪問另一個(gè)域名時(shí)。例如,如果ABC銀行有一個(gè)腳本用于讀取用戶的私人賬戶信息,攻擊者可以在其自己的惡意網(wǎng)站包含這個(gè)腳本,當(dāng)ABC銀行的客戶訪問攻擊者的網(wǎng)站時(shí),攻擊者就可以從ABC銀行的服務(wù)器提取用戶信息。
開發(fā)者可以部署多種措施來抵御XSSI攻擊。其中一種方法是向用戶提供獨(dú)特的不可預(yù)測的授權(quán)令牌,在服務(wù)器響應(yīng)任何請求之前,需要發(fā)送回該令牌作為額外的HTTP參數(shù)。腳本應(yīng)該只能響應(yīng)POST請求,這可以防止授權(quán)令牌作為GET請求中的URL參數(shù)被暴露,同時(shí),這可以防止腳本通過腳本標(biāo)簽被加載。瀏覽器可能會重新發(fā)出GET請求,這可能會導(dǎo)致一個(gè)操作會執(zhí)行一次以上,而重新發(fā)出的POST請求需要用戶的同意。
在處理JSON請求時(shí),在響應(yīng)中增加非可執(zhí)行前綴,例如“\n”,以確保腳本不可執(zhí)行。在相同域名運(yùn)行的腳本可以讀取響應(yīng)內(nèi)容以及刪除前綴,但在其他域名運(yùn)行的腳本則不能。此外,開發(fā)者還應(yīng)該避免使用JSONP(具有填充功能的JSON)來從不同域名加載機(jī)密數(shù)據(jù),因?yàn)檫@會允許釣魚網(wǎng)站收集數(shù)據(jù)。同時(shí),發(fā)送響應(yīng)表頭“X-Content-Type-Options: nosniff”也將幫助保護(hù)IE和谷歌Chrome用戶免受XSSI攻擊。
為了應(yīng)對XSS攻擊,可在HTTP Content-Type響應(yīng)表頭或者HTML代碼中meta標(biāo)簽中http-equiv屬性中指定CHARSET,讓瀏覽器不會解譯其他字符集的特殊字符編碼。對于使用ASP.NET開發(fā)網(wǎng)站的開發(fā)者,微軟Anti-Cross Site Scripting Library可以幫助保護(hù)Web應(yīng)用抵御跨站腳本漏洞。
現(xiàn)在有很多開源漏洞掃描工具可供開發(fā)者使用,以測試其代碼是否容易遭受XSS攻擊,例如Vega、Wapiti、OWASP的Zed Attack Proxy和Skipfish。企業(yè)應(yīng)該定期對網(wǎng)站進(jìn)行掃描,同時(shí),在底層代碼變更或依靠第三方庫的功能集成到各種網(wǎng)頁時(shí),也應(yīng)該掃描網(wǎng)站。
讀完此文,大家應(yīng)該知道兩者的區(qū)別在哪了。