跨站腳本攻擊

利用網站漏洞盜取信息的行為

跨站腳本攻擊(也稱為XSS)指利用網站漏洞從用戶那裡惡意盜取信息。

背景


網站包含量態容提戶驗,複雜。謂態容,根據戶環境需,程序夠輸容。態站“跨站腳攻擊”(Cross Site Scripting, 安全專家們通常將其縮寫成XSS,原本應當是css,但為了和層疊樣式表(Cascading Style Sheet,CSS )有所區分,故稱XSS)的威脅,而靜態站點則完全不受其影響。

簡介


戶瀏覽網站、即訊軟體、甚閱讀郵件,擊鏈。攻擊鏈插惡碼,夠盜取戶息。攻擊六制(編碼式)鏈編碼,免戶懷疑合。網站收包含惡碼請求產包含惡碼頁,頁網站合頁。流留言論壇程序允戶包含javascript的帖子。假設用戶甲發表了一篇包含惡意腳本的帖子,那麼用戶乙在瀏覽這篇帖子時,惡意腳本就會執行,盜取用戶乙的session信息。有關攻擊方法的詳細情況將在下面闡述。

攻擊分類


跨站腳攻擊(  )縮CSS,但這會與層疊樣式表(Cascading Style Sheets,CSS)的縮寫混淆。因此有人將跨站腳本攻擊縮寫為XSS。如果你聽到有人說“我發現了一個XSS漏洞”,顯然他是在說跨站腳本攻擊。

類型


(1)持久型跨站:最直接的危害類型,跨站代碼存儲在伺服器(資料庫)。(2)非持久型跨站:反射型跨站腳本漏洞,最普遍的類型。用戶訪問伺服器-跨站鏈接-返回跨站代碼。(3)DOM跨站(DOM XSS):DOM(document object model文檔對象模型),客戶端腳本處理邏輯導致的安全問題。

危害


為了搜集用戶信息,攻擊者通常會在有漏洞的程序中插入 JavaScript、VBScript、 ActiveX或Flash以欺騙用戶(詳見下文)。一旦得手,他們可以盜取用戶帳戶,修改用戶設置,盜取/污染cookie,做虛假廣告等。每天都有大量的XSS攻擊的惡意代碼出現。 Brett Moore的下面這篇文章詳細地闡述了“拒絕服務攻擊”以及用戶僅僅閱讀一篇文章就會受到的“自動攻擊”。

三部曲

1.HTML注入。所有HTML注入範例只是注入一個JavaScript彈出式的警告框:alert(1)。
2.做壞事。如果您覺得警告框還不夠刺激,當受害者點擊了一個被注入了HTML代碼的頁面鏈接時攻擊者能作的各種的惡意事情。
3.誘捕受害者。

攻擊事件

“微博病毒”攻擊事件
回顧:
2011年6月28日晚,新浪微博出現了一次比較大的XSS攻擊事件。大量用戶自動發送諸如:“郭美美事件的一些未注意到的細節”,“建黨大業中穿幫的地方”,“讓女人心動的100句詩歌”,“3D肉團團高清普通話版種子”,“這是傳說中的神仙眷侶啊”,“驚爆!范冰冰艷照真流出了”等等微博和私信,並自動關注一位名為hellosamy的用戶。
事件的經過線索如下:
20:14,開始有大量帶V的認證用戶中招轉發蠕蟲
20:30,某網站中的病毒頁面無法訪問
20:32,新浪微博中hellosamy用戶無法訪問
21:02,新浪漏洞修補完畢

下一代

隨著AJAX(Asynchronous JavaScript and XML,非同步JavaScript和XML)技術的普遍應用,XSS的攻擊危害將被放大。使用AJAX的最大優點,就是可以不用更新整個頁面來維護數據,Web應用可以更迅速地響應用戶請求。AJAX會處理來自Web伺服器及源自第三方的豐富信息,這對XSS攻擊提供了良好的機會。AJAX應用架構會泄漏更多應用的細節,如函數和變數名稱、函數參數及返回類型、數據類型及有效範圍等。AJAX應用架構還有著較傳統架構更多的應用輸入,這就增加了可被攻擊的點。

預防


從網站開發者角度,如何防護XSS攻擊?
來自應用安全國際組織OWASP的建議,對XSS最佳的防護應該結合以下兩種方法:驗證所有輸入數據,有效檢測攻擊;對所有輸出數據進行適當的編碼,以防止任何已成功注入的腳本在瀏覽器端運行。具體如下:
輸入驗證:某個數據被接受為可被顯示或存儲之前,使用標準輸入驗證機制,驗證所有輸入數據的長度、類型、語法以及業務規則。
輸出編碼:數據輸出前,確保用戶提交的數據已被正確進行entity編碼,建議對所有字元進行編碼而不僅局限於某個子集。
明確指定輸出的編碼方式:不要允許攻擊者為你的用戶選擇編碼方式(如ISO 8859-1或 UTF 8)。
注意黑名單驗證方式的局限性:僅僅查找或替換一些字元(如"<" ">"或類似"script"的關鍵字),很容易被XSS變種攻擊繞過驗證機制。
警惕規範化錯誤:驗證輸入之前,必須進行解碼及規範化以符合應用程序當前的內部表示方法。請確定應用程序對同一輸入不做兩次解碼。
從網站用戶角度,如何防護XSS攻擊?
當你打開一封Email或附件、瀏覽論壇帖子時,可能惡意腳本會自動執行,因此,在做這些操作時一定要特別謹慎。建議在瀏覽器設置中關閉JavaScript。如果使用IE瀏覽器,將安全級別設置到“高”。具體可以參照瀏覽器安全的相關文章。
這裡需要再次提醒的是,XSS攻擊其實伴隨著社會工程學的成功應用,需要增強安全意識,只信任值得信任的站點或內容。可以通過一些檢測工具進行xss的漏洞檢測,類似工具有億思網站安全檢測平台。針對xss的漏洞帶來的危害是巨大,如有發現,應立即修復漏洞。

XSS防禦規則


下列規則旨在防止所有發生在應用程序的XSS攻擊,雖然這些規則不允許任意向HTML文檔放入不可信數據,不過基本上也涵蓋了絕大多數常見的情況。你不需要採用所有規則,很多企業可能會發現第一條和第二條就已經足以滿足需求了。請根據自己的需求選擇規則。

1

– 不要在允許位置插入不可信數據
第一條規則就是拒絕所有數據,不要將不可信數據放入HTML文檔,除非是下列定義的插槽。這樣做的理由是在理列有解碼規則的HTML中有很多奇怪的context,讓事情變得很複雜,因此沒有理由將不可信數據放在這些context中。
 directlyinascript
insideanHTMLcomment
 inanattributename
<...NEVERPUTUNTRUSTEDDATAHERE...href="/test"/> inatagname
更重要的是,不要接受來自不可信任來源的JavaScript代碼然後運行,例如,名為“callback”的參數就包含JavaScript代碼段,沒有解碼能夠解決。

2

– 在向HTML元素內容插入不可信數據前對HTML解碼
這條規則適用於當你想把不可信數據直接插入HTML正文某處時,這包括內部正常標籤(div、p、b、td等)。大多數網站框架都有HTML解碼的方法且能夠躲開下列字元。但是,這對於其他HTML context是遠遠不夠的,你需要部署其他規則。
...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE...
...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE...
以及其他的HTML常用元素
使用HTML實體解碼躲開下列字元以避免切換到任何執行內容,如腳本、樣式或者事件處理程序。在這種規格中推薦使用十六進位實體,除了XML中5個重要字元(&、<、 >、 "、 ')外,還加入了斜線符,以幫助結束HTML實體。
&-->&
<--><
>-->>
"-->"
'-- >''isnotrecommended
/-- >/forwardslashisincludedasithelpsendanHTMLentity

3

– 在向HTML常見屬性插入不可信數據前進行屬性解碼
這條規則是將不可信數據轉化為典型屬性值(如寬度、名稱、值等),這不能用於複雜屬性(如href、src、style或者其他事件處理程序)。這是及其重要的規則,事件處理器屬性(為HTML JavaScript Data Values)必須遵守該規則。
content
 insideUNquotedattribute
content
 insidesinglequotedattribute
content
 insidedoublequotedattribute
除了字母數字字元外,使用小於256的ASCII值&#xHH格式(或者命名的實體)對所有數據進行解碼以防止切換屬性。這條規則應用廣泛的原因是因為開發者常常讓屬性保持未引用,正確引用的屬性只能使用相應的引用進行解碼。未引用屬性可以被很多字元破壞,包括[space] % * + , - / ; < = > ^ 和 |。

4

– 在向HTML JavaScript Data Values插入不可信數據前,進行JavaScript解碼
這條規則涉及在不同HTML元素上制定的JavaScript事件處理器。向這些事件處理器放置不可信數據的唯一安全位置就是“data value”。在這些小代碼塊放置不可信數據是相當危險的,因為很容易切換到執行環境,因此請小心使用。
 insideaquotedstring
 onesideofanexpression
 insideUNquotedeventhandler
 insidequotedeventhandler
 insidequotedeventhandler
除了字母數字字元外,使用小於256的ASCII值xHH格式 對所有數據進行解碼以防止將數據值切換至腳本內容或者另一屬性。不要使用任何解碼捷徑(如" )因為引用字元可能被先運行的HTML屬性解析器相匹配。如果事件處理器被引用,則需要相應的引用來解碼。這條規則的廣泛應用是因為開發者經常讓事件處理器保持未引用。正確引用屬性只能使用相應的引用來解碼,未引用屬性可以使用任何字元(包括[space] % * + , - / ; < = > ^ 和|)解碼。同時,由於HTML解析器比JavaScript解析器先運行,關閉標籤能夠關閉腳本塊,即使腳本塊位於引用字元串中。

5

– 在向HTML 樣式屬性值插入不可信數據前,進行CSS解碼
當你想將不可信數據放入樣式表或者樣式標籤時,可以用此規則。CSS是很強大的,可以用於許多攻擊。因此,只能在屬性值中使用不可信數據而不能在其他樣式數據中使用。不能將不可信數據放入複雜的屬性(如url,、behavior、和custom (-moz-binding))。同樣,不能將不可信數據放入允許JavaScript的IE的expression屬性值。
 propertyvalue
text propertyvalue
除了字母數字字元外,使用小於256的ASCII值HH格式對所有數據進行解碼。不要使用任何解碼捷徑(如" )因為引用字元可能被先運行的HTML屬性解析器相匹配,防止將數據值切換至腳本內容或者另一屬性。同時防止切換至expression或者其他允許腳本的屬性值。如果屬性被引用,將需要相應的引用進行解碼,所有的屬性都應該被引用。未引用屬性可以使用任何字元(包括[space] % * + , - / ; < = > ^ 和|)解碼。同時,由於HTML解析器比JavaScript解析器先運行,標籤能夠關閉腳本塊,即使腳本塊位於引用字元串中。

6

- 在向HTML URL屬性插入不可信數據前,進行URL解碼
當你想將不可信數據放入鏈接到其他位置的link中時需要運用此規則。這包括href和src屬性。還有很多其他位置屬性,不過我們建議不要在這些屬性中使用不可信數據。需要注意的是在javascript中使用不可信數據的問題,不過可以使用上述的HTML JavaScript Data Value規則。
link anormallink
 animagesource
 ascriptsource
除了字母數字字元外,使用小於256的ASCII值%HH 解碼格式對所有數據進行解碼。在數據中保護不可信數據:URL不能夠被允許,因為沒有好方法來通過解碼來切換URL以避免攻擊。所有的屬性都應該被引用。未引用屬性可以使用任何字元(包括[space] % * + , - / ; < = > ^ 和|)解碼。請注意實體編碼在這方面是沒用的。