摘要:是一種經(jīng)常出現(xiàn)在應(yīng)用程序中的計算機安全漏洞,是由于應(yīng)用程序?qū)τ脩舻妮斎脒^濾不足而產(chǎn)生的。常見的攻擊有三種反射型型存儲型。但是作為開發(fā)人員依然要了解基本知識于細節(jié)處避免制造漏洞。
編者說:作為JS系工程師接觸最多的漏洞我想就是 XSS 漏洞了,然鵝并不是所有的同學(xué)對其都有一個清晰的認識。今天我們請來了@盧士杰 同學(xué)為我們分享他眼中的 XSS 漏洞攻擊,希望能幫助到大家。
什么是 XSS 攻擊XSS(Cross-Site Scripting)又稱跨站腳本,XSS的重點不在于跨站點,而是在于腳本的執(zhí)行。XSS是一種經(jīng)常出現(xiàn)在 Web 應(yīng)用程序中的計算機安全漏洞,是由于 Web 應(yīng)用程序?qū)τ脩舻妮斎脒^濾不足而產(chǎn)生的。
常見的 XSS 攻擊有三種:反射型、DOM-based 型、存儲型。 其中反射型、DOM-based 型可以歸類為非持久型 XSS 攻擊,存儲型歸類為持久型 XSS 攻擊。
1.反射型反射型 XSS 一般是攻擊者通過特定手法(如電子郵件),誘使用戶去訪問一個包含惡意代碼的 URL,當(dāng)受害者點擊這些專門設(shè)計的鏈接的時候,惡意代碼會直接在受害者主機上的瀏覽器執(zhí)行。
對于訪問者而言是一次性的,具體表現(xiàn)在我們把我們的惡意腳本通過 URL 的方式傳遞給了服務(wù)器,而服務(wù)器則只是不加處理的把腳本“反射”回訪問者的瀏覽器而使訪問者的瀏覽器執(zhí)行相應(yīng)的腳本。反射型 XSS 的觸發(fā)有后端的參與,要避免反射性 XSS,必須需要后端的協(xié)調(diào),后端解析前端的數(shù)據(jù)時首先做相關(guān)的字串檢測和轉(zhuǎn)義處理。
此類 XSS 通常出現(xiàn)在網(wǎng)站的搜索欄、用戶登錄口等地方,常用來竊取客戶端 Cookies 或進行釣魚欺騙。
整個攻擊過程大約如下:
2.DOM-based 型客戶端的腳本程序可以動態(tài)地檢查和修改頁面內(nèi)容,而不依賴于服務(wù)器端的數(shù)據(jù)。例如客戶端如從 URL 中提取數(shù)據(jù)并在本地執(zhí)行,如果用戶在客戶端輸入的數(shù)據(jù)包含了惡意的 JavaScript 腳本,而這些腳本沒有經(jīng)過適當(dāng)?shù)倪^濾和消毒,那么應(yīng)用程序就可能受到 DOM-based XSS 攻擊。需要特別注意以下的用戶輸入源 document.URL、location.hash、location.search、document.referrer 等。
整個攻擊過程大約如下:
3.存儲型攻擊者事先將惡意代碼上傳或儲存到漏洞服務(wù)器中,只要受害者瀏覽包含此惡意代碼的頁面就會執(zhí)行惡意代碼。這就意味著只要訪問了這個頁面的訪客,都有可能會執(zhí)行這段惡意腳本,因此儲存型XSS的危害會更大。
存儲型 XSS 一般出現(xiàn)在網(wǎng)站留言、評論、博客日志等交互處,惡意腳本存儲到客戶端或者服務(wù)端的數(shù)據(jù)庫中。
整個攻擊過程大約如下:
XSS 攻擊的危害XSS 可以導(dǎo)致:
攻擊劫持訪問;
盜用 cookie 實現(xiàn)無密碼登錄;
配合 csrf 攻擊完成惡意請求;
使用 js 或 css 破壞頁面正常的結(jié)構(gòu)與樣式等;
防御方法 1. XSS 防御之 HTML 編碼應(yīng)用范圍:將不可信數(shù)據(jù)放入到 HTML 標(biāo)簽內(nèi)(例如div、span等)的時候進行HTML編碼。
編碼規(guī)則:將 & < > " " / 轉(zhuǎn)義為實體字符(或者十進制、十六進制)。
示例代碼:
function encodeForHTML(str, kwargs){ return ("" + str) .replace(/&/g, "&") .replace(/ < HEX=> < Entity=> < .replace(/>/g, ">") .replace(/"/g, """) .replace(/"/g, "'") // ' 不推薦,因為它不在HTML規(guī)范中 .replace(///g, "/"); };
HTML 有三種編碼表現(xiàn)方式:十進制、十六進制、命名實體。例如小于號(<)可以編碼為 "十進制> <", "十六進制=> <", "命名實體=> <" 三種方式。對于單引號(")由于實體字符編碼方式不在 HTML 規(guī)范中,所以此處使用了十六進制編碼。
2. XSS 防御之 HTML Attribute 編碼應(yīng)用范圍:將不可信數(shù)據(jù)放入 HTML 屬性時(不含src、href、style 和事件處理屬性),進行 HTML Attribute 編碼
編碼規(guī)則:除了字母數(shù)字字符以外,使用 HH;(或者可用的命名實體)格式來轉(zhuǎn)義ASCII值小于256所有的字符???????
示例代碼:
function encodeForHTMLAttibute(str, kwargs){ let encoded = ""; for(let i = 0; i < str.length; i++) { let ch = hex = str[i]; if (!/[A-Za-z0-9]/.test(str[i]) && str.charCodeAt(i) < 256) { hex = "" + ch.charCodeAt(0).toString(16) + ";"; } encoded += hex; } return encoded; };3. XSS 防御之 JavaScript 編碼
作用范圍:將不可信數(shù)據(jù)放入事件處理屬性、JavaScirpt值時進行 JavaScript 編碼
編碼規(guī)則:除字母數(shù)字字符外,請使用xHH格式轉(zhuǎn)義ASCII碼小于256的所有字符
示例代碼:
function encodeForJavascript(str, kwargs) { let encoded = ""; for(let i = 0; i < str.length; i++) { let cc = hex = str[i]; if (!/[A-Za-z0-9]/.test(str[i]) && str.charCodeAt(i) < 256) { hex = "x" + cc.charCodeAt().toString(16); } encoded += hex; } return encoded; };4. XSS 防御之 URL 編碼
作用范圍:將不可信數(shù)據(jù)作為 URL 參數(shù)值時需要對參數(shù)進行 URL 編碼
編碼規(guī)則:將參數(shù)值進行 encodeURIComponent 編碼
示例代碼:
function encodeForURL(str, kwargs){ return encodeURIComponent(str); };5. XSS 防御之 CSS 編碼
作用范圍:將不可信數(shù)據(jù)作為 CSS 時進行 CSS 編碼
編碼規(guī)則:除了字母數(shù)字字符以外,使用XXXXXX格式來轉(zhuǎn)義ASCII值小于256的所有字符
示例代碼:
function encodeForCSS (attr, str, kwargs){ let encoded = ""; for (let i = 0; i < str.length; i++) { let ch = str.charAt(i); if (!ch.match(/[a-zA-Z0-9]/) { let hex = str.charCodeAt(i).toString(16); let pad = "000000".substr((hex.length)); encoded += "" + pad + hex; } else { encoded += ch; } } return encoded; };后記
在任何時候用戶的輸入都是不可信的。對于 HTTP 參數(shù),理論上都要進行驗證,例如某個字段是枚舉類型,其就不應(yīng)該出現(xiàn)枚舉以為的值;對于不可信數(shù)據(jù)的輸出要進行相應(yīng)的編碼;此外httpOnly、CSP、X-XSS-Protection、Secure Cookie 等也可以起到有效的防護。
XSS 漏洞有時比較難發(fā)現(xiàn),所幸當(dāng)下React、Vue等框架都從框架層面引入了 XSS 防御機制,一定程度上解放了我們的雙手。
但是作為開發(fā)人員依然要了解 XSS 基本知識、于細節(jié)處避免制造 XSS 漏洞。框架是輔助,我們?nèi)孕枰匀藶楸荆?guī)范開發(fā)習(xí)慣,提高 Web 前端安全意識。
http://www.qa-knowhow.com/?p=1467
https://brajeshwar.github.io/entities/
https://excess-xss.com/
https://github.com/chrisisbeef/jquery-encoder
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/108694.html
摘要:網(wǎng)絡(luò)黑白一書所抄襲的文章列表這本書實在是垃圾,一是因為它的互聯(lián)網(wǎng)上的文章拼湊而成的,二是因為拼湊水平太差,連表述都一模一樣,還抄得前言不搭后語,三是因為內(nèi)容全都是大量的科普,不涉及技術(shù)也沒有干貨。 《網(wǎng)絡(luò)黑白》一書所抄襲的文章列表 這本書實在是垃圾,一是因為它的互聯(lián)網(wǎng)上的文章拼湊而成的,二是因為拼湊水平太差,連表述都一模一樣,還抄得前言不搭后語,三是因為內(nèi)容全都是大量的科普,不涉及技術(shù)...
摘要:禁止內(nèi)聯(lián)腳本執(zhí)行規(guī)則較嚴格,目前發(fā)現(xiàn)使用。典型的攻擊流程受害者登錄站點,并保留了登錄憑證。站點接收到請求后,對請求進行驗證,并確認是受害者的憑證,誤以為是無辜的受害者發(fā)送的請求。攻擊完成,攻擊者在受害者不知情的情況下,冒充受害者完成了攻擊。 隨著互聯(lián)網(wǎng)的發(fā)展,各種Web應(yīng)用變得越來越復(fù)雜,滿足了用戶的各種需求的同時,各種網(wǎng)絡(luò)安全問題也接踵而至。作為前端工程師的我們也逃不開這個問題,今天一起...
摘要:禁止內(nèi)聯(lián)腳本執(zhí)行規(guī)則較嚴格,目前發(fā)現(xiàn)使用。典型的攻擊流程受害者登錄站點,并保留了登錄憑證。站點接收到請求后,對請求進行驗證,并確認是受害者的憑證,誤以為是無辜的受害者發(fā)送的請求。攻擊完成,攻擊者在受害者不知情的情況下,冒充受害者完成了攻擊。 隨著互聯(lián)網(wǎng)的發(fā)展,各種Web應(yīng)用變得越來越復(fù)雜,滿足了用戶的各種需求的同時,各種網(wǎng)絡(luò)安全問題也接踵而至。作為前端工程師的我們也逃不開這個問題,今天...
摘要:應(yīng)用常見安全漏洞一覽注入注入就是通過給應(yīng)用接口傳入一些特殊字符,達到欺騙服務(wù)器執(zhí)行惡意的命令。此外,適當(dāng)?shù)臋?quán)限控制不曝露必要的安全信息和日志也有助于預(yù)防注入漏洞。 web 應(yīng)用常見安全漏洞一覽 1. SQL 注入 SQL 注入就是通過給 web 應(yīng)用接口傳入一些特殊字符,達到欺騙服務(wù)器執(zhí)行惡意的 SQL 命令。 SQL 注入漏洞屬于后端的范疇,但前端也可做體驗上的優(yōu)化。 原因 當(dāng)使用外...
閱讀 1085·2021-10-14 09:42
閱讀 1381·2021-09-22 15:11
閱讀 3293·2019-08-30 15:56
閱讀 1251·2019-08-30 15:55
閱讀 3620·2019-08-30 15:55
閱讀 896·2019-08-30 15:44
閱讀 2032·2019-08-29 17:17
閱讀 2079·2019-08-29 15:37