跨站腳本是應(yīng)用程序安全開源基金會 (OWASP) 前 10 名中第二個最普遍的問題——它存在于大約 2/3 的所有應(yīng)用程序中。雖然自動化工具可以發(fā)現(xiàn)其中的一些問題,但也有一些旨在檢測和利用這些漏洞的自動化工具。
什么是跨站腳本?
當(dāng)數(shù)據(jù)通過不受信任的來源(如 Web 請求)進入 Web 應(yīng)用程序并未經(jīng)驗證就發(fā)送給用戶時,就會發(fā)生 XSS 攻擊。
XSS 會導(dǎo)致腳本在用戶的瀏覽器中執(zhí)行,從而導(dǎo)致會話被劫持、網(wǎng)站篡改以及將用戶重定向到惡意站點。
從本質(zhì)上講,攻擊者將惡意代碼輸入到用戶輸入的部分中,服務(wù)器希望該部分是數(shù)據(jù)(但實際上是為了執(zhí)行而設(shè)計的代碼)。
如果處理不當(dāng),惡意代碼可能會突破“數(shù)據(jù)平面”并作為正常代碼(“控制平面”)執(zhí)行。
我們可以將大多數(shù) XSS 攻擊分為兩類:存儲的和反射的。第三種不太常見,稱為基于 DOM 的 XSS。
當(dāng)數(shù)據(jù)通過不受信任的來源進入并發(fā)送給用戶(在動態(tài)內(nèi)容中)而沒有檢查惡意內(nèi)容時,就會發(fā)生任何 XSS 攻擊。惡意內(nèi)容可以是 JavaScript、Flash、HTML 或瀏覽器能夠執(zhí)行的任何其他代碼。
反射型 XSS(影響:中等)
這是最基本的 XSS 類型,其中應(yīng)用程序接收數(shù)據(jù),然后以不安全的方式將這些數(shù)據(jù)包含在對用戶的響應(yīng)中。
例如,如果攻擊者說服用戶單擊此網(wǎng)絡(luò)釣魚鏈接:
http://legitwebsite.com/message=<script>惡意代碼</script>
如果合法站點不處理數(shù)據(jù)而只是將其返回給用戶,則用戶的瀏覽器將執(zhí)行惡意代碼。
存儲型 XSS(影響:嚴重)
當(dāng)注入永久存儲在目標的服務(wù)器上時,就會發(fā)生存儲型 XSS,例如論壇或評論部分、數(shù)據(jù)庫中的消息等。從本質(zhì)上講,這意味著該漏洞會影響站點/應(yīng)用程序的每個訪問者。
例如,如果站點允許用戶發(fā)表評論,然后顯示他們的評論,則用戶可以輸入以下內(nèi)容:
<p><script>惡意代碼</script></p>
如果站點沒有適當(dāng)?shù)貦z查用戶輸入,則可能會導(dǎo)致腳本為看到此消息的任何其他用戶執(zhí)行。
基于DOM的XSS/客戶端XSS(影響:中等)
反射型 XSS 和存儲型 XSS 與基于 DOM 的最大區(qū)別在于攻擊的注入位置。
反射和存儲 XSS 是服務(wù)器端問題,而基于 DOM 是客戶端(瀏覽器)端問題?;?DOM 的 XSS 發(fā)生在 DOM(文檔對象模型)中,而不是作為 HTML 的一部分。
這種攻擊不是在頁面中插入惡意代碼,而是允許加載合法頁面,然后利用用戶輸入向頁面添加 HTML,執(zhí)行惡意腳本。這利用了客戶端生成的 HTML 數(shù)量不斷增加的優(yōu)勢。
例如,攻擊者可以通過社會工程使受害者點擊惡意鏈接(例如 http://www.legitimatewebsite.com/contact#<script>malicious code</script>)。該網(wǎng)站將收到對該頁面的合法請求,但不會收到惡意片段(因為瀏覽器不會向站點的服務(wù)器發(fā)送 # 字符后的任何內(nèi)容)。受害者會看到合法網(wǎng)站,但受害者的瀏覽器也會執(zhí)行惡意腳本。
由于這種攻擊的工作方式,服務(wù)器端保護不會阻止它,因為惡意代碼根本沒有發(fā)送到服務(wù)器。
相反,防止這種攻擊需要確保 JavaScript 不會以不安全的方式解釋 URI 片段(統(tǒng)一資源標識符 - URI 標識指定位置的資源,例如 URL)。
XSS 攻擊的緩解措施
有效緩解 XSS 攻擊需要結(jié)合以下措施,當(dāng)您將它們結(jié)合使用時,可以提供強大的 XSS 防御。
避免在指定位置以外的任何地方插入用戶提供的/不受信任的數(shù)據(jù)
這是第一個也是最重要的規(guī)則。編碼、轉(zhuǎn)義、驗證和過濾輸入極其困難且非常復(fù)雜。
限制某人可以輸入不可信數(shù)據(jù)的位置要容易得多。最安全的假設(shè)是所有不受信任的數(shù)據(jù)都是惡意的。
驗證/過濾輸入
理想情況下,所有輸入都應(yīng)根據(jù)可接受的值列表進行驗證。
編碼輸出
任何用戶輸入的數(shù)據(jù)都應(yīng)該被編碼以防止它被讀取為活動的。這可能需要 CSS、JavaScript、URL 和/或 HTML 編碼。
確保輸出在任何暴露的點都被編碼尤為重要,因為相同的數(shù)據(jù)可以存儲并顯示在多個位置。
謹慎選擇框架
使用提供自動轉(zhuǎn)義功能的框架(如 Go 模板)或具有針對 XSS 的本機防御(如 .NET 的請求驗證)的框架。
設(shè)置 HttpOnly 標志
XSS 攻擊通常使用 JavaScript 來竊取會話 cookie(而普通的 Web 應(yīng)用程序很少需要使用 JavaScript 來訪問會話 cookie)。因此,設(shè)置 HttpOnly 標志可以保護會話 cookie 免受攻擊者的攻擊,同時不會限制正常行為。大多數(shù)瀏覽器都支持設(shè)置這個標志。
使用響應(yīng)頭
與 HttpOnly 標志類似,任何不應(yīng)包含 HTML 或 JavaScript 的 HTTP 響應(yīng)都可以利用“Content-Type”和“X-Content-Type-Options”標頭來確保瀏覽器僅以預(yù)期的方式解釋響應(yīng)。
對開發(fā)人員進行安全教育
專門針對開發(fā)人員的教育,例如將應(yīng)用程序安全團隊成員與開發(fā)人員配對的“安全冠軍”計劃,很重要。它們可以幫助開發(fā)人員了解安全漏洞(如 XSS)以及如何防止它們。
制定內(nèi)容安全政策
內(nèi)容安全策略 (CSP) 可以幫助您檢測和緩解 XSS 和其他數(shù)據(jù)注入攻擊。
他們?yōu)槭苄湃蝺?nèi)容的來源設(shè)置了許可名單,并且只能應(yīng)用于敏感頁面(如支付頁面),或者理想情況下,應(yīng)用于整個網(wǎng)站。如果內(nèi)容是從不應(yīng)加載的頁面加載的,他們甚至可以提供通知。
它們相當(dāng)容易部署 - 只需將 Content-Security-Policy HTTP 標頭添加到網(wǎng)頁和任何適當(dāng)?shù)闹噶罴纯伞?/p>
該CSP提琴手擴展可以幫助您生成一個基準CSP。該工具將圍繞瀏覽器提交的報告構(gòu)建策略,創(chuàng)建可更改的基線策略。
此外,您可以使用由 Troy Hunt 和 Scott Helme 運行的Report URI來獲取有關(guān) CSP 違規(guī)的警報,以便更主動地監(jiān)控您的站點。
通常,策略由一系列指令組成,這些指令將描述一種資源或區(qū)域的策略。這些指令之一,子資源完整性檢查,用于確保瀏覽器驗證第三方內(nèi)容(來自 CDN 之類的來源)是在沒有被操縱的情況下交付的。
本質(zhì)上,提供的加密哈希必須與加載的文件匹配。如果黑客修改了第三方的內(nèi)容,該站點將不會加載惡意內(nèi)容。
問題是,如果內(nèi)容提供者更新文件或進行合法更改,內(nèi)容也不會加載(因為哈希值已更改)。
解決此問題的主要方法是利用版本化的 JavaScript 資源,例如 chatbot_0.1.23.js,而不是 chatbot.js。這是一般的最佳實踐,也保證了JS文件發(fā)生變化時服務(wù)的連續(xù)性。
雖然瀏覽器并不普遍支持此功能,但對于那些缺少該功能的瀏覽器,使用它不會破壞站點(它只是不會利用該技術(shù))。