XSS

一、什麼是 XSS

Cross-Site Scripting(跨站腳本攻擊)簡稱 XSS,是一種代碼注入攻擊。攻擊者通過在目標網站上注入惡意腳本,使之在用戶的瀏覽器上運行。利用這些惡意腳本,攻擊者可獲取用戶的敏感信息如 Cookie、SessionID 等,進而危害數據安全。

所以,網頁上哪些部分會引起XSS攻擊?簡單來說,任何可以輸入的地方都有可能引起,包括URL!

二、XSS 常見的注入方法:

在 HTML 中內嵌的文本中,惡意內容以 script 標籤形成注入。

在內聯的 JavaScript 中,拼接的數據突破了原本的限制(字符串,變量,方法名等)。

在標籤屬性中,惡意內容包含引號,從而突破屬性值的限制,注入其他屬性或者標籤。

在標籤的 href、src 等屬性中,包含 javascript: (僞協議)等可執行代碼。

在 onload、onerror、onclick 等事件中,注入不受控制代碼。

在 style 屬性和標籤中,包含類似 background-image:url("javascript:..."); 的代碼(新版本瀏覽器已經可以防範)。

在 style 屬性和標籤中,包含類似 expression(...) 的 CSS 表達式代碼(新版本瀏覽器已經可以防範)。

三、爲什麼會存在XSS?

XSS 存在的根本原因是,對URL中的參數,對用戶輸入提交給web server的內容,沒有進行充分的過濾。如果我們能夠在web程序中,對用戶提交的URL中的參數,和提交的所有內容,進行充分的過濾,將所有的不合法的參數和輸入內容過濾掉,那麼就不會導致“在用戶的瀏覽器中執行攻擊者自己定製的腳本”。

但是,其實充分而完全的過濾,實際上是無法實現的。因爲攻擊者有各種各樣的神奇的,你完全想象不到的方式來繞過服務器端的過濾,最典型的就是對URL和參數進行各種的編碼,比如escape, encodeURI, encodeURIComponent, 16進制,10進制,8進制,來繞過XSS過濾。

四、XSS的分類:反射型、存儲型、DOM型

存儲型 XSS

存儲型 XSS 的攻擊步驟:

攻擊者將惡意代碼提交到目標網站的數據庫中。

用戶打開目標網站時,網站服務端將惡意代碼從數據庫取出,拼接在 HTML 中返回給瀏覽器。

用戶瀏覽器接收到響應後解析執行,混在其中的惡意代碼也被執行。

惡意代碼竊取用戶數據併發送到攻擊者的網站,或者冒充用戶的行爲,調用目標網站接口執行攻擊者指定的操作。

存儲型 XSS(又被稱爲持久性XSS)攻擊常見於帶有用戶保存數據的網站功能,如論壇發帖、商品評論、用戶私信等。

它是最危險的一種跨站腳本,相比反射型XSS和DOM型XSS具有更高的隱蔽性,所以危害更大,因爲它不需要用戶手動觸發。任何允許用戶存儲數據的web程序都可能存在存儲型XSS漏洞,當攻擊者提交一段XSS代碼後,被服務器端接收並存儲,當所有瀏覽者訪問某個頁面時都會被XSS。

反射型 XSS

反射型 XSS 的攻擊步驟:

攻擊者構造出特殊的 URL,其中包含惡意代碼。

用戶打開帶有惡意代碼的 URL 時,網站服務端將惡意代碼從 URL 中取出,拼接在 HTML 中返回給瀏覽器。

用戶瀏覽器接收到響應後解析執行,混在其中的惡意代碼也被執行。

惡意代碼竊取用戶數據併發送到攻擊者的網站,或者冒充用戶的行爲,調用目標網站接口執行攻擊者指定的操作。

反射型 XSS 跟存儲型 XSS 的區別是:存儲型 XSS 的惡意代碼存在數據庫裏,反射型 XSS 的惡意代碼存在 URL 裏。

反射型 XSS (也被稱爲非持久性XSS)漏洞常見於通過 URL 傳遞參數的功能,如網站搜索、跳轉等。

由於需要用戶主動打開惡意的 URL 才能生效,攻擊者往往會結合多種手段誘導用戶點擊。

POST 的內容也可以觸發反射型 XSS,只不過其觸發條件比較苛刻(需要構造表單提交頁面,並引導用戶點擊),所以非常少見。

DOM 型 XSS

DOM 型 XSS 的攻擊步驟:

攻擊者構造出特殊的 URL,其中包含惡意代碼。

用戶打開帶有惡意代碼的 URL。

用戶瀏覽器接收到響應後解析執行,前端 JavaScript 取出 URL 中的惡意代碼並執行。

惡意代碼竊取用戶數據併發送到攻擊者的網站,或者冒充用戶的行爲,調用目標網站接口執行攻擊者指定的操作。

DOM 型 XSS 跟前兩種 XSS 的區別:DOM 型 XSS 攻擊中,取出和執行惡意代碼由瀏覽器端完成,屬於前端 JavaScript 自身的安全漏洞,而其他兩種 XSS 都屬於服務端的安全漏洞。

注意:

DOM通常代表在html、xhtml和xml中的對象,使用DOM可以允許程序和腳本動態的訪問和更新文檔的內容、結構和樣式。它不需要服務器解析響應的直接參與,觸發XSS靠的是瀏覽器端的DOM解析,所以防範DOM型XSS完全就是前端的責任,必須注意!!!。

五、XSS的防禦

只要有輸入數據的地方,就可能存在 XSS 危險。

httpOnly: 在 cookie 中設置 HttpOnly 屬性後,js腳本將無法讀取到 cookie 信息。

輸入過濾: 一般是用於對於輸入格式的檢查,例如:郵箱,電話號碼,用戶名,密碼……等,按照規定的格式輸入。不僅僅是前端負責,後端也要做相同的過濾檢查。因爲攻擊者完全可以繞過正常的輸入流程,直接利用相關接口向服務器發送設置。

轉義 HTML: 如果拼接 HTML 是必要的,就需要對於url中的引號,尖括號,斜槓進行轉義,但這還不是很完善.想對 HTML 模板各處插入點進行充分的轉義,就需要採用合適的轉義庫.

白名單: 對於顯示富文本來說,不能通過上面的辦法來轉義所有字符,因爲這樣會把需要的格式也過濾掉。這種情況通常採用白名單過濾的辦法,當然也可以通過黑名單過濾,但是考慮到需要過濾的標籤和標籤屬性實在太多,更加推薦使用白名單的方式。

六、XSS的危害

掛馬

盜取用戶Cookie。

DOS(拒絕服務)客戶端瀏覽器。

釣魚攻擊,高級的釣魚技巧。

刪除目標文章、惡意篡改數據、嫁禍。

劫持用戶Web行爲,甚至進一步滲透內網。

爆發Web2.0蠕蟲。

蠕蟲式的DDoS攻擊。

蠕蟲式掛馬攻擊、刷廣告、刷瀏量、破壞網上數據

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章