眾所周知,XSS幾乎在最常見、危害最大的WEB漏洞。針對這個危害,我們應該怎麼防範呢。
下面簡單說一下思路。
作者:輕輕的煙霧(z281099678)
XSS漏洞網上的資料太多,這裡只簡單說一下。
大概分為3種型別:反射型、儲存型、DOM型。
但其實我認為,DOM型是被包含在反射型和儲存型裡的,只不過它具有一定的特殊性,所以經常把它獨立出來說明。
就是攻擊者對存在XSS漏洞的系統,通過構建一個具有攻擊功能的URL連結,然後想方設法讓被攻擊者存取這個連結。一旦被攻擊者存取了攻擊連結,則暴露了自己的資訊。
就是攻擊者提交具有攻擊功能的內容給有XSS漏洞的系統,系統把內容儲存之後,就像一個地雷一樣埋伏在系統裡。被攻擊者一旦存取這個地雷所在的頁面,就不知不覺的洩漏了這個資訊。
注意:這個地雷是永久有效的,可無限制的爆炸,而且爆炸並不會引起被攻擊者的注意。
就是利用反射型或者儲存型漏洞,讓被攻擊者存取的頁面的DOM發生改變,進而引起XSS攻擊。
XSS臭名昭著,因為這類攻擊簡單,而危險極大。可能洩漏任何後臺管理員的cookie,導致攻擊者直接繞開登入檢測的「大門」,直接進入後臺系統,進而進行下一步可能危害性更大的攻擊。
防範手段大概如下:
開發者或者安全工程師要有一個理念:所有使用者都不可信。對於使用者提交的資訊,做完善的過濾、轉移。
針對前端使用者提交的資料,進行HTML字元轉移、標籤過濾等操作,對於需要提交富文字的後臺使用者,做好嚴格的允許和禁止的標籤及屬性的檢查。
嚴格做好資料的檢測和過濾,理論上可以控制絕大部分XSS攻擊。當然事實上要做到完美的控制很難。
設定內容安全策略,限制瀏覽器對資源參照。這樣可以一定程度上避免攻擊者引入攻擊資源。
對敏感Cookie進行保護,我認為是一種「事後保護」策略。即便是攻擊者已經成功埋下了XSS地雷,但是由於我們做好Cookie保護,所以XSS攻擊也拿不到想要的Cookie,從而導致攻擊失效。
這裡另外說一點,對於這一點,其實攻擊者可能還有一些別開生面的思路,雖然無法直接拿到Cookie,但是他可以利用XSS發起一些迷惑人的攻擊,比如給頁面引到另外一個釣魚頁面,或者直接彈出帳號密碼輸入框,一旦被攻擊者缺乏安全意識甚至是一個不小心,便主動把使用者名稱和密碼提交給了攻擊者。
對於XSS的防不勝防,我想到另外一個「補救措施」,那就是對系統進行監控。
我們把系統所有要正常引入的資源的域名都做成白名單,然後對系統的資源參照做監控,一旦系統的頁面引入了白名單之外的資源,即記錄參照資源等資訊,並對安全員或者系統管理員傳送告警。
利用瀏覽器PerformanceObserver物件,對所有的網路資源載入進行監控:
然後通過自定義函數check_url,對資源進行分析,如果不是白名單的網路資源,則觸發記錄和告警。如此便可讓系統管理員對系統的XSS攻擊有快速的知曉和反應。
最後說個題外話,一些瀏覽器(號稱以安全著稱,具體名稱這裡就不提了)很神奇,你使用它存取網站,它會預設的增加一些亂七八糟的連結的存取,甚至給你存取的頁面的一些資訊帶上。我猜可能一些是廣告,還有一些是什麼分析,不得而知。但是作為基礎設施的瀏覽器,夾帶這些「私活」,真讓人感覺噁心無恥且不寒而慄。