XSS 介紹
XSS 是跨站腳本攻擊(Cross Site Scripting)的簡寫,但是從首寫字母命名的方式來看,應該取名 css,但這樣就和層疊樣式表(Cascading Style Sheets,css)重名了,所以取名為 XSS。
XSS 攻擊,一般是指攻擊者通過在網頁中注入惡意腳本,當用戶瀏覽網頁時,惡意腳本執行,控制用戶瀏覽器行為的一種攻擊方式。
XSS 危害
- 竊取用戶Cookie,獲取用戶隱私,盜取用戶賬號。
- 劫持用戶(瀏覽器)會話,從而執行任意操作,例如進行非法轉賬、強制發表日志、發送電子郵件等。
- 強制彈出廣告頁面,刷流量等。
- 傳播跨站腳本蠕蟲,網頁掛馬等。
- 結合其他漏洞,如 CSRF 漏洞,實施進一步的攻擊。
- ......
XSS 分類
XSS 攻擊按是否把攻擊數據存進服務器端,攻擊行為是否伴隨着攻擊數據一直存在,可分為 非持久型 XSS 攻擊 和 持久型 XSS 攻擊。
XSS 攻擊按攻擊方式又可分為 反射型 XSS、DOM 型 XSS、存儲型 XSS,其中 反射型 XSS 和 DOM 型 XSS 算是 非持久型 XSS 攻擊,而 存儲型 XSS 算是 持久型 XSS 攻擊。
反射型 XSS(Reflected XSS)
攻擊者誘導用戶訪問一個帶有惡意代碼的 URL 后,服務器端接收數據后處理,然后把帶有惡意代碼的數據發送到瀏覽器端,瀏覽器端解析這段帶有 XSS 代碼的數據后當做腳本執行,最終完成 XSS 攻擊。
因為這個過程就像一次反射,故稱為反射型 XSS。
攻擊步驟:
1、攻擊構造出特殊的 URL ,其中包含惡意代碼。
2、用戶被誘導打開帶有惡意代碼的 URL,服務器端將惡意代碼從 URL 中取出當做參數處理,然后返回給用戶帶有惡意代碼的數據。
3、用戶瀏覽器接收到響應解析執行,混在其中的惡意代碼也被執行。
4、惡意代碼竊取用戶敏感數據發送給攻擊者,或者冒充用戶的行為,調用目標網站接口執行攻擊者指定的操作。
DOM 型 XSS(DOM-based XSS)
DOM 型 XSS 形成原因是通過修改頁面的 DOM 節點形成的 XSS。
DOM 型 XSS 攻擊中,取出和執行惡意代碼都由瀏覽器端完成,屬於前端自身的安全漏洞。
攻擊步驟:
1、攻擊者構造出特殊的 URL,其中包含惡意代碼。
2、用戶被誘導打開帶有惡意代碼的 URL。
3、用戶瀏覽器接收到響應后解析執行,前端 JavaScript 取出 URL 中的惡意代碼並執行。
4、惡意代碼竊取用戶數據並發送到攻擊者的網站,或者冒充用戶的行為,調用目標網站接口執行攻擊者指定的操作。
存儲型 XSS(Stored XSS)
存儲型 XSS 跟 反射型 XSS 的區別是:存儲型 XSS 的惡意代碼存在服務器上,反射型 XSS 的惡意代碼存在 URL 里。
存儲型 XSS 攻擊時惡意腳本會存儲在目標服務器上。當瀏覽器請求數據時,腳本從服務器傳回並執行。它是最危險的一種跨站腳本,比反射性 XSS 和 DOM 型 XSS 都更有隱蔽性,因為它不需要用戶手動觸發。任何允許用戶存儲數據的 Web 程序都可能存在存儲型 XSS 漏洞。若某個頁面遭受存儲型 XSS 攻擊,所有訪問該頁面的用戶都會被 XSS 攻擊。
攻擊步驟:
1、攻擊者把惡意代碼提交到目標網站的服務器中。
2、用戶打開目標網站,網站服務器端把帶有惡意代碼的數據取出,當做正常數據返回給用戶。
3、用戶瀏覽器接收到響應解析執行,混在其中的惡意代碼也被執行。
4、惡意代碼竊取用戶敏感數據發送給攻擊者,或者冒充用戶的行為,調用目標網站接口執行攻擊者指定的操作。
資源搜索網站大全 https://www.renrenfan.com.cn 廣州VI設計公司https://www.houdianzi.com
防御方法
瀏覽器自帶防御 (X-XSS-Protection )
HTTP X-XSS-Protection 響應頭是 Internet Explorer,Chrome 和 Safari 的一個功能,當檢測到跨站腳本攻擊(XSS)時,瀏覽器將停止加載頁面。
他可以設置4個值:
X-XSS-Protection: 0
禁止XSS過濾。
X-XSS-Protection: 1
啟用XSS過濾(通常瀏覽器是默認的)。 如果檢測到跨站腳本攻擊,瀏覽器將清除頁面(刪除不安全的部分)。
X-XSS-Protection: 1; mode=block
啟用XSS過濾。 如果檢測到攻擊,瀏覽器將不會清除頁面,而是阻止頁面加載。
X-XSS-Protection: 1; report=<reporting-uri> 啟用XSS過濾。 如果檢測到跨站腳本攻擊,瀏覽器將清除頁面並使用CSP report-uri指令的功能發送違規報告。
這種瀏覽器自帶的防御功能只對反射型 XSS 有一定的防御力,其原理是檢查 URL 和 DOM 中元素的相關性,但這並不能完全防止反射型 XSS,而且也並不是所有瀏覽器都支持 X-XSS-Protection。
轉義
在 XSS 攻擊中,攻擊者主要是通過構造特殊字符來注入腳本,所以對用戶的輸入進行檢測就很有必要,並且需要在客戶端與服務端都進行輸入檢測,然后對用戶輸入的數據進行轉義。
主要就是對輸入所包含的特殊字符進行轉義,如 <,>,&,",',來防止 XSS 攻擊。
下面是一個用於轉義的方法:
function escapehtml(str) { if (!str) return ''; str = str.replace(/&/g, "&"); str = str..replace(/</g, "<"); str = str..replace(/>/g, ">"); str = str..replace(/"/g, """); str = str..replace(/'/g, "'"); return str; };
過濾
在富文本中因為需要保留 html ,所以我們不能使用轉義的方法防御 XSS 攻擊,這里使用過濾的方式防御 XSS 攻擊,也就是通過只使用白名單允許的 HTML 標記及其屬性,來防御攻擊。
這里推薦一個名為 XSS 的組件 ,這就是一個根據白名單過濾 HTML,防止 XSS 攻擊的組件。
內容安全策略(CSP)
內容安全策略(Content Security Policy,CSP),實質就是白名單制度,開發者明確告訴客戶端,哪些外部資源可以加載和執行,大大增強了網頁的安全性。
兩種方法可以啟用 CSP。一種是通過 HTTP 頭信息的 Content-Security-Policy 的字段。
Content-Security-Policy: script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:
另一種是通過網頁的 <meta> 標簽。
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">
上面代碼中,CSP 做了如下配置。
- 腳本: 只信任當前域名
- <object>標簽: 不信任任何 URL,即不加載任何資源
- 樣式表: 只信任 cdn.example.org 和 third-party.org
- 頁面子內容,如 <frame>、<iframe>: 必須使用HTTPS協議加載
- 其他資源: 沒有限制
啟用后,不符合 CSP 的外部資源就會被阻止加載。
總結
XSS 攻擊的本質就是輸入的內容被當做程序執行了,所以我們對於用戶輸入的內容不能完全的信任,需要考慮如何避免其被當做程序執行。