這里給大家分享我在網(wǎng)上總結(jié)出來的一些知識,希望對大家有所幫助
前言:我們知道同源策略可以隔離各個(gè)站點(diǎn)之間的 DOM 交互、頁面數(shù)據(jù)和網(wǎng)絡(luò)通信,雖然嚴(yán)格的同源策略會(huì)帶來更多的安全,但是也束縛了 Web。這就需要在安全和自由之間找到一個(gè)平衡點(diǎn),所以我們默認(rèn)頁面中可以引用任意第三方資源,然后又引入 CSP 策略來加以限制;默認(rèn) XMLHttpRequest 和 Fetch 不能跨站請求資源,然后又通過 CORS 策略來支持其跨域。
不過支持頁面中的第三方資源引用和 CORS 也帶來了很多安全問題,其中最典型的就是 XSS 攻擊。
什么是 XSS 攻擊
XSS 全稱是 Cross Site Scripting,為了與“CSS”區(qū)分開來,故簡稱 XSS,翻譯過來就是“跨站腳本”。XSS 攻擊是指黑客往 HTML 文件中或者 DOM 中注入惡意腳本,從而在用戶瀏覽頁面時(shí)利用注入的惡意腳本對用戶實(shí)施攻擊的一種手段。
最開始的時(shí)候,這種攻擊是通過跨域來實(shí)現(xiàn)的,所以叫“跨域腳本”。但是發(fā)展到現(xiàn)在,往 HTML 文件中注入惡意代碼的方式越來越多了,所以是否跨域注入腳本已經(jīng)不是唯一的注入手段了,但是 XSS 這個(gè)名字卻一直保留至今。
當(dāng)頁面被注入了惡意 JavaScript 腳本時(shí),瀏覽器無法區(qū)分這些腳本是被惡意注入的還是正常的頁面內(nèi)容,所以惡意注入 JavaScript 腳本也擁有所有的腳本權(quán)限。下面我們就來看看,如果頁面被注入了惡意 JavaScript 腳本,惡意腳本都能做哪些事情。
- 可以竊取 Cookie 信息。惡意 JavaScript 可以通過“document.cookie”獲取 Cookie 信息,然后通過 XMLHttpRequest 或者 Fetch 加上 CORS 功能將數(shù)據(jù)發(fā)送給惡意服務(wù)器;惡意服務(wù)器拿到用戶的 Cookie 信息之后,就可以在其他電腦上模擬用戶的登錄,然后進(jìn)行轉(zhuǎn)賬等操作。
- 可以監(jiān)聽用戶行為。惡意 JavaScript 可以使用“addEventListener”接口來監(jiān)聽鍵盤事件,比如可以獲取用戶輸入的信用卡等信息,將其發(fā)送到惡意服務(wù)器。黑客掌握了這些信息之后,又可以做很多違法的事情。
- 可以通過修改 DOM偽造假的登錄窗口,用來欺騙用戶輸入用戶名和密碼等信息。
- 還可以在頁面內(nèi)生成浮窗廣告,這些廣告會(huì)嚴(yán)重地影響用戶體驗(yàn)。
惡意腳本是怎么注入的
現(xiàn)在我們知道了頁面中被注入惡意的 JavaScript 腳本是一件非常危險(xiǎn)的事情,所以網(wǎng)站開發(fā)者會(huì)盡可能地避免頁面中被注入惡意腳本。要想避免站點(diǎn)被注入惡意腳本,就要知道有哪些常見的注入方式。通常情況下,主要有存儲(chǔ)型 XSS 攻擊、反射型 XSS 攻擊和基于 DOM 的 XSS 攻擊三種方式來注入惡意腳本。
1. 存儲(chǔ)型 XSS 攻擊
我們先來看看存儲(chǔ)型 XSS 攻擊是怎么向 HTML 文件中注入惡意腳本的,你可以參考下圖:
通過上圖,我們可以看出存儲(chǔ)型 XSS 攻擊大致需要經(jīng)過如下步驟:
- 首先黑客利用站點(diǎn)漏洞將一段惡意 JavaScript 代碼提交到網(wǎng)站的數(shù)據(jù)庫中;
- 然后用戶向網(wǎng)站請求包含了惡意 JavaScript 腳本的頁面;
- 當(dāng)用戶瀏覽該頁面的時(shí)候,惡意腳本就會(huì)將用戶的 Cookie 信息等數(shù)據(jù)上傳到服務(wù)器。
下面我們來看個(gè)例子,2015 年喜馬拉雅就被曝出了存儲(chǔ)型 XSS 漏洞。起因是在用戶設(shè)置專輯名稱時(shí),服務(wù)器對關(guān)鍵字過濾不嚴(yán)格,比如可以將專輯名稱設(shè)置為一段 JavaScript,如下圖所示:
當(dāng)黑客將專輯名稱設(shè)置為一段 JavaScript 代碼并提交時(shí),喜馬拉雅的服務(wù)器會(huì)保存該段 JavaScript 代碼到數(shù)據(jù)庫中。然后當(dāng)用戶打開黑客設(shè)置的專輯時(shí),這段代碼就會(huì)在用戶的頁面里執(zhí)行,這樣就可以獲取用戶的 Cookie 等數(shù)據(jù)信息。
當(dāng)用戶打開黑客設(shè)置的專輯頁面時(shí),服務(wù)器也會(huì)將這段惡意 JavaScript 代碼返回給用戶,因此這段惡意腳本就在用戶的頁面中執(zhí)行了。惡意腳本可以通過 XMLHttpRequest 或者 Fetch 將用戶的 Cookie 數(shù)據(jù)上傳到黑客的服務(wù)器。
2. 反射型 XSS 攻擊
在一個(gè)反射型 XSS 攻擊過程中,惡意 JavaScript 腳本屬于用戶發(fā)送給網(wǎng)站請求中的一部分,隨后網(wǎng)站又把惡意 JavaScript 腳本返回給用戶。當(dāng)惡意 JavaScript 腳本在用戶頁面中被執(zhí)行時(shí),黑客就可以利用該腳本做一些惡意操作。
這樣講有點(diǎn)抽象,下面我們結(jié)合一個(gè)簡單的 Node 服務(wù)程序來看看什么是反射型 XSS。首先我們使用 Node 來搭建一個(gè)簡單的頁面環(huán)境,搭建好的服務(wù)代碼如下所示:
var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) { ?res.render('index', { title: 'Express',xss:req.query.xss }); }); module.exports = router;
<!DOCTYPE html> <html> <head> ?<title><%= title %></title> ?<link rel='stylesheet' href='/stylesheets/style.css' /> </head> <body> ?<h1><%= title %></h1> ?<p>Welcome to <%= title %></p> ?<div> ? ? ?<%- xss %> ?</div> </body> </html>
上面這兩段代碼,第一段是路由,第二段是視圖,作用是將 URL 中 xss 參數(shù)的內(nèi)容顯示在頁面。我們可以在本地演示下,比如打開http://localhost:3000/?xss=123
這個(gè)鏈接,這樣在頁面中展示就是“123”了(如下圖),是正常的,沒有問題的。
但當(dāng)打開http://localhost:3000/?xss=<script>alert('你被xss攻擊了')</script>
這段 URL 時(shí),我們會(huì)發(fā)現(xiàn)用戶將一段含有惡意代碼的請求提交給 Web 服務(wù)器,Web 服務(wù)器接收到請求時(shí),又將惡意代碼反射給了瀏覽器端,這就是反射型 XSS 攻擊。在現(xiàn)實(shí)生活中,黑客經(jīng)常會(huì)通過 QQ 群或者郵件等渠道誘導(dǎo)用戶去點(diǎn)擊這些惡意鏈接,所以對于一些鏈接我們一定要慎之又慎。
另外需要注意的是,Web 服務(wù)器不會(huì)存儲(chǔ)反射型 XSS 攻擊的惡意腳本,這是和存儲(chǔ)型 XSS 攻擊不同的地方。
3. 基于 DOM 的 XSS 攻擊
基于 DOM 的 XSS 攻擊是不牽涉到頁面 Web 服務(wù)器的。具體來講,黑客通過各種手段將惡意腳本注入用戶的頁面中,比如通過網(wǎng)絡(luò)劫持在頁面?zhèn)鬏斶^程中修改 HTML 頁面的內(nèi)容,這種劫持類型很多,有通過 WiFi 路由器劫持的,有通過本地惡意軟件來劫持的,它們的共同點(diǎn)是在 Web 資源傳輸過程或者在用戶使用頁面的過程中修改 Web 頁面的數(shù)據(jù)。
如何阻止 XSS 攻擊
我們知道存儲(chǔ)型 XSS 攻擊和反射型 XSS 攻擊都是需要經(jīng)過 Web 服務(wù)器來處理的,因此可以認(rèn)為這兩種類型的漏洞是服務(wù)端的安全漏洞。而基于 DOM 的 XSS 攻擊全部都是在瀏覽器端完成的,因此基于 DOM 的 XSS 攻擊是屬于前端的安全漏洞。
但無論是何種類型的 XSS 攻擊,它們都有一個(gè)共同點(diǎn),那就是首先往瀏覽器中注入惡意腳本,然后再通過惡意腳本將用戶信息發(fā)送至黑客部署的惡意服務(wù)器上。
所以要阻止 XSS 攻擊,我們可以通過阻止惡意 JavaScript 腳本的注入和惡意消息的發(fā)送來實(shí)現(xiàn)。
接下來我們就來看看一些常用的阻止 XSS 攻擊的策略。
1. 服務(wù)器對輸入腳本進(jìn)行過濾或轉(zhuǎn)碼
不管是反射型還是存儲(chǔ)型 XSS 攻擊,我們都可以在服務(wù)器端將一些關(guān)鍵的字符進(jìn)行轉(zhuǎn)碼,比如最典型的:
code:<script>alert('你被 xss 攻擊了')</script> // 過濾后 code:
這樣,當(dāng)用戶再次請求該頁面時(shí),由于<script>
標(biāo)簽的內(nèi)容都被過濾了,所以這段腳本在客戶端是不可能被執(zhí)行的。
除了過濾之外,服務(wù)器還可以對這些內(nèi)容進(jìn)行轉(zhuǎn)碼,還是上面那段代碼,經(jīng)過轉(zhuǎn)碼之后,效果如下所示:
code:<script>alert(' 你被 xss 攻擊了 ')</script>
經(jīng)過轉(zhuǎn)碼之后的內(nèi)容,如<script>
標(biāo)簽被轉(zhuǎn)換為<script>
,因此即使這段腳本返回給頁面,頁面也不會(huì)執(zhí)行這段腳本。
2. 充分利用 CSP
雖然在服務(wù)器端執(zhí)行過濾或者轉(zhuǎn)碼可以阻止 XSS 攻擊的發(fā)生,但完全依靠服務(wù)器端依然是不夠的,我們還需要把 CSP 等策略充分地利用起來,以降低 XSS 攻擊帶來的風(fēng)險(xiǎn)和后果。
實(shí)施嚴(yán)格的 CSP 可以有效地防范 XSS 攻擊,具體來講 CSP 有如下幾個(gè)功能:
- 限制加載其他域下的資源文件,這樣即使黑客插入了一個(gè) JavaScript 文件,這個(gè) JavaScript 文件也是無法被加載的;
- 禁止向第三方域提交數(shù)據(jù),這樣用戶數(shù)據(jù)也不會(huì)外泄;
- 禁止執(zhí)行內(nèi)聯(lián)腳本和未授權(quán)的腳本;
- 還提供了上報(bào)機(jī)制,這樣可以幫助我們盡快發(fā)現(xiàn)有哪些 XSS 攻擊,以便盡快修復(fù)問題。
因此,利用好 CSP 能夠有效降低 XSS 攻擊的概率。
3. 使用 HttpOnly 屬性
由于很多 XSS 攻擊都是來盜用 Cookie 的,因此還可以通過使用 HttpOnly 屬性來保護(hù)我們 Cookie 的安全。
通常服務(wù)器可以將某些 Cookie 設(shè)置為 HttpOnly 標(biāo)志,HttpOnly 是服務(wù)器通過 HTTP 響應(yīng)頭來設(shè)置的。
由于 JavaScript 無法讀取設(shè)置了 HttpOnly 的 Cookie 數(shù)據(jù),所以即使頁面被注入了惡意 JavaScript 腳本,也是無法獲取到設(shè)置了 HttpOnly 的數(shù)據(jù)。因此一些比較重要的數(shù)據(jù)我們建議設(shè)置 HttpOnly 標(biāo)志。
總結(jié)
好了,就介紹到這里,下面總結(jié)下本文的主要內(nèi)容。
XSS 攻擊就是黑客往頁面中注入惡意腳本,然后將頁面的一些重要數(shù)據(jù)上傳到惡意服務(wù)器。常見的三種 XSS 攻擊模式是存儲(chǔ)型 XSS 攻擊、反射型 XSS 攻擊和基于 DOM 的 XSS 攻擊。
這三種攻擊方式的共同點(diǎn)是都需要往用戶的頁面中注入惡意腳本,然后再通過惡意腳本將用戶數(shù)據(jù)上傳到黑客的惡意服務(wù)器上。而三者的不同點(diǎn)在于注入的方式不一樣,有通過服務(wù)器漏洞來進(jìn)行注入的,還有在客戶端直接注入的。
針對這些 XSS 攻擊,主要有三種防范策略,第一種是通過服務(wù)器對輸入的內(nèi)容進(jìn)行過濾或者轉(zhuǎn)碼,第二種是充分利用好 CSP,第三種是使用 HttpOnly 來保護(hù)重要的 Cookie 信息。
當(dāng)然除了以上策略之外,我們還可以通過添加驗(yàn)證碼防止腳本冒充用戶提交危險(xiǎn)操作。而對于一些不受信任的輸入,還可以限制其輸入長度,這樣可以增大 XSS 攻擊的難度。文章來源:http://www.zghlxwxcb.cn/news/detail-480198.html
本文轉(zhuǎn)載于:
https://juejin.cn/post/7146867780308959262
如果對您有所幫助,歡迎您點(diǎn)個(gè)關(guān)注,我會(huì)定時(shí)更新技術(shù)文檔,大家一起討論學(xué)習(xí),一起進(jìn)步。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-480198.html
到了這里,關(guān)于記錄--詳解 XSS(跨站腳本攻擊)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!