本文優先發布於簡書https://www.jianshu.com/p/04e0f8971890
1、百度百科
XSS,跨站腳本攻擊(Cross Site Scripting)縮寫為CSS,但這會與層疊樣式表(Cascading Style Sheets,CSS)的縮寫混淆。因此,通常將跨站腳本攻擊縮寫為XSS。
XSS攻擊,通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使用戶加載並執行攻擊者惡意制造的網頁程序。
這些惡意網頁程序通常是JavaScript,但實際上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。
攻擊成功后,攻擊者可能得到包括但不限於更
高的權限(如執行一些操作)、私密網頁內容、會話和cookie等各種內容。
參考:[百度百科](https://baike.baidu.com/item/XSS%E6%94%BB%E5%87%BB/954065?fr=aladdin)
***
2、攻擊條件
1)向web頁面注入惡意代碼;
2)這些惡意代碼能夠被瀏覽器成功的執行
***
3、XSS攻擊類型
1)反射型XSS(非持久型跨站):反射型跨站腳本漏洞,最普遍的類型。用戶訪問服務器-跨站鏈接-返回跨站代碼。
這類通常使用URL,具體流程:
①攻擊者構造出特殊的 URL,其中包含惡意代碼。
②用戶打開帶有惡意代碼的 URL 時,網站服務端將惡意代碼從 URL 中取出,拼接在 HTML 中返回給瀏覽器。
③惡意頁面中的JavaScript打開一個具有漏洞的HTML頁面並將其安裝在用戶電腦上。
④用戶瀏覽器接收到響應后解析執行,混在其中的惡意代碼也被執行。
⑤惡意代碼竊取用戶數據並發送到攻擊者的網站,或者冒充用戶的行為,調用目標網站接口執行攻擊者指定的操作。
反射型 XSS 跟存儲型 XSS 的區別是:存儲型 XSS 的惡意代碼存在數據庫里,反射型 XSS 的惡意代碼存在 URL 里。
反射型 XSS 漏洞常見於通過 URL 傳遞參數的功能,如網站搜索、跳轉等。
由於需要用戶主動打開惡意的 URL 才能生效,攻擊者往往會結合多種手段誘導用戶點擊。
POST 的內容也可以觸發反射型 XSS,只不過其觸發條件比較苛刻(需要構造表單提交頁面,並引導用戶點擊),所以非常少見。
示例:
①`http://xxx/xsstest?key=<script>alert("XSS")</script>`
②`http://xxx/xsstest?key=<img src='w.123' onerror='alert("XSS")'>`
③`http://xxx/xsstest?key=<a onclick='alert("XSS")'>點我</a>`
2)存儲型XSS(持久型跨站):最直接的危害類型,跨站代碼存儲在服務器(數據庫)
攻擊流程:
①攻擊者構造出特殊的 URL,其中包含惡意代碼。
②用戶打開帶有惡意代碼的 URL。
③用戶瀏覽器接收到響應后解析執行,前端 JavaScript 取出 URL 中的惡意代碼並執行。
④惡意代碼竊取用戶數據並發送到攻擊者的網站,或者冒充用戶的行為,調用目標網站接口執行攻擊者指定的操作。
DOM 型 XSS 跟前兩種 XSS 的區別:DOM 型 XSS 攻擊中,取出和執行惡意代碼由瀏覽器端完成,屬於前端 JavaScript 自身的安全漏洞,而其他兩種 XSS 都屬於服務端的安全漏洞。
示例:
①竊取用戶信息,如cookie,token,賬號密碼等。
`<script>alert("xss")</script>`
②生成一些惡意圖片,文字,用戶點擊圖片或文字,跳轉至相應目標網站
`<img onclick="window.location.href='http://xxx.com'" width='300' src='img/testxss.jpg'/>`
③劫持流量實現惡意跳轉
`<script>window.location.href="http://xxx.com";</script>`
3)DOM跨站(DOM XSS):DOM(document object model文檔對象模型),客戶端腳本處理邏輯導致的安全問題。
攻擊流程:
①攻擊者構造出特殊的 URL,其中包含惡意代碼。
②用戶打開帶有惡意代碼的 URL。
③用戶瀏覽器接收到響應后解析執行,前端 JavaScript 取出 URL 中的惡意代碼並執行。
④惡意代碼竊取用戶數據並發送到攻擊者的網站,或者冒充用戶的行為,調用目標網站接口執行攻擊者指定的操作。
DOM 型 XSS 跟前兩種 XSS 的區別:DOM 型 XSS 攻擊中,取出和執行惡意代碼由瀏覽器端完成,屬於前端 JavaScript 自身的安全漏洞,而其他兩種 XSS 都屬於服務端的安全漏洞。
參考:
[網絡攻擊-XSS攻擊詳解](https://www.cnblogs.com/mao2080/p/9460397.html)
[web安全之XSS攻擊](https://www.cnblogs.com/stefanieszx11/p/8602138.html)
[前端安全系列(一):如何防止XSS攻擊?](https://www.freebuf.com/articles/web/185654.html)
***
4、漏洞總結
①在 HTML 中內嵌的文本中,惡意內容以 script 標簽形成注入。
②在內聯的 JavaScript 中,拼接的數據突破了原本的限制(字符串,變量,方法名等)。
③在標簽屬性中,惡意內容包含引號,從而突破屬性值的限制,注入其他屬性或者標簽。
④在標簽的 href、src 等屬性中,包含 javascript: 等可執行代碼。
⑤在 onload、onerror、onclick 等事件中,注入不受控制代碼。
⑥在 style 屬性和標簽中,包含類似 background-image:url("javascript:…"); 的代碼(新版本瀏覽器已經可以防范)。
⑦在 style 屬性和標簽中,包含類似 expression(…) 的 CSS 表達式代碼(新版本瀏覽器已經可以防范)。
5、防御規則
1)不要在允許位置插入不可信數據
2)在向HTML元素內容插入不可信數據前對HTML解碼
3)在向HTML常見屬性插入不可信數據前進行屬性解碼
4)在向HTML JavaScript DATA Values插入不可信數據前,進行JavaScript解碼
5)在向HTML樣式屬性插入不可信數據前,進行CSS解碼
6)在向HTML URL屬性插入不可信數據前,進行URL解碼
***
5、防御攻擊方法
①驗證所有輸入數據,有效監測攻擊;
②對所有輸出數據進行適當編碼,防止任何已成功注入的腳本在瀏覽器端運行;
③輸入長度做限制(對於不受信任的輸入,都應該限定一個合理的長度。雖然無法完全防止 XSS 發生,但可以增加 XSS 攻擊的難度);
④禁止加載外域代碼,防止復雜的攻擊邏輯;
⑤禁止外域提交,網站被攻擊后,用戶的數據不會泄露到外域;
⑥禁止內聯腳本執行(規則較嚴格,目前發現 GitHub 使用);
⑦禁止未授權的腳本執行(新特性,Google Map 移動版在使用);
⑧合理使用上報可以及時發現 XSS,利於盡快修復問題;
⑨禁止 JavaScript 讀取某些敏感 Cookie,攻擊者完成 XSS 注入后也無法竊取此 Cookie。
