聊兩句XSS(跨站腳本攻擊)

XSS(跨站腳本攻擊),聊兩句,五毛的。

XSS的危害:

  • 竊取Cookie,盜用用戶身份信息

這玩意兒是大多數XSS的目標,也好解決,可以先治個標,直接設置HttpOnly=true ,即不允許客戶端腳本訪問,設置完成後,通過js去讀取cookie,你會發現document.cookie 無法讀取到被標識為HttpOnly的Cookie內容了。

  • 配合其他漏洞,如CSRF(跨站請求偽造)

這個其實就沒那麼好解決了,因為XSS利用用戶身份構造的請求其實對於服務端來說是合法的。比如說咱在B站上傳了一條視頻,發現沒幾個人點贊,於是動了歪心思,打開控制台找到了投幣點贊的接口,然後拿到了對應的請求參數。自己構造了一條投幣請求,然後誘導其他人點擊含有這個腳本的頁面為咱的視頻投幣,這樣就完成了一套攻擊流程。

不用嘗試了,沒用的。別問我怎麼知道的 =。=。

要是沒做校驗的話,那這就是一個高危漏洞,還傳啥視頻啊,趕緊發郵件給阿B領賞金去啊。

  • 廣告

只要能發起XSS,我就能往頁面里插廣告,啥權限都不要,但是能引發這個問題的原因主要有兩個。

  1. XSS。
  2. 用戶自己安裝外部腳本。

使用外部腳本一定要保證腳本來源的可信性,腳本的安全性。如果腳本是惡意的,那麼他所能做的可就不只是彈彈廣告這麼簡單了,替換個按鈕,誘導點擊釣魚頁面,替換某一條搜索結果,這都是可能的。

XSS掃描及防範

XSS風險有些是可以通過code review發現的,比如:

let result = document.getElementById('test');
result.innerHTML = await getInfo();

這段代碼很容易看到風險位置——innerHTML ,如果後端返回的數據中包含惡意的代碼片段,那麼就能夠被攻擊。所以在使用Vue和React框架時,需要評估是否真的需要使用v-htmldangerouslySetInnerHTML 功能,在前端的render(渲染)階段就避免innerHTMLouterHTML [1]

如果不使用框架,那就避免直接使用innerHTML 就好了。

至於review時無法發現的風險,那就交給掃描器吧。

防範XSS,除了少使用、不使用innerHTML 外,還可以設置嚴格的CSP[2],限制用戶的輸入長度。

XSS是一個安全問題,它不只是前端的職責,這也是所有RD和QA的職責。

前端過濾用戶輸入後發給後端,後端如果不做處理存入數據庫,那麼這就是一個攻擊點:直接抓前端的包,重新組裝一下參數,發給後端,完成存儲型XSS第一步,用戶再訪問這部分內容,就完成了一次XSS。

QA的總能搞出來一些奇奇怪怪的payload(亦稱測試用例),這些可能都是RD未能考慮到的方面。

附一段白名單過濾用戶輸入的代碼,點擊GitHub查看。


  1. 如何防止xss攻擊 ↩︎

  2. 內容安全策略 ↩︎