Content Security Policy (CSP) 繞過攻擊如何防禦?解析不安全 CDN 與 JSONP 導致的 CSP bypass 原理,分享 Google CSP Evaluator 檢測工具,並提供 Nonce 與 Hash 設定等防禦建議,強化網站 XSS 防護力。


Content Security Policy(CSP)主要是為網頁的內容安全把關,他是設置在response header的位置,主要是用來限制網頁會讀取的外部檔案來防止XSS、clickjacking和其他跨站攻擊。


因為網站本身也可能需要讀取跨站的檔案,所以可以自行設置CSP header,通常會設置 ‘default-src’、’style-src’、’img-src ’、’font-src’、’connect-src’、’frame-src ’、’child-src ’、’foobar-src ’、’report-uri’ 等,再根據網站的需求(像是網站特效、字體、讀取送出資料),來選擇允許那些url設定'unsafe-inline'、'unsafe-eval'、'self'。


'unsafe-inline'代表允許使用inline script或inline styles,'unsafe-eval'代表允許在script裡使用eval功能,'self'代表只參考相同scheme以及相同port的origin網站。


CSP bypass就是利用CSP header鑽漏洞試圖繞過限制,需要先搭配一個注入點,再繞過不安全的CSP header。


舉個例子的話,一種是繞過不安全的domain,假如為了將CDN上的檔案放在網站上,可能會設定成’script-src https://cdnjs.cloudflare.com’,那麼就可以利用cdnjs + AngularJS CSP bypass,讀取同樣在這個domain的prototype.js和AngularJS來執行XSS等攻擊。因為雖然我們進行了限制,但是在CDN上有太多其他的script存在。


因此CSP header該如何設置便是一個問題,即使有設定了,假如範圍過大就沒有防護力,假如範圍過小會影響網站本身運作,因此如何自行確認CSP header設置有沒有問題就十分重要。


如何發現

如果想要自行進行檢測可以簡單的利用這個網站來檢測,這是google提供的網站

https://csp-evaluator.withgoogle.com/

以這個網站本身提供的unsafe policy為例,可以看到那些有危險。


unsafe policy為例


而值得注意的是有警示的部分也有列出原因,像是這個例子是 https://www.google.com會被JSONP 繞過


而值得注意的是有警示的部分也有列出原因,像是這個例子是 https://www.google.com會被JSONP 繞過


而另一種方式透過弱掃通常也都會注意CSP的部分,掃出來的項目名稱通常寫成以下:


而另一種方式透過弱掃通常也都會注意CSP的部分,掃出來的項目名稱通常寫成以下


緩解方式

CSP bypass是指被繞過讀取其他的script,而我們可以改善方式: 第一種解法是使用nonce,第二種解法是使用hash。

使用nonce,需要每次有新的request就產生一組新的亂數nonce值搭配inline script的nonce值,來取代使用url路徑,但是每次request都需要產生nonce來處理,假如使用同一個或是有規律的nonce,一樣會被攻擊者拿來使用。

使用hash,將script經過hash來使用來避免內容被竄改或被取代,但是這種方式每次要修改網頁script都需要確實產生新的hash並更新CSP header。

有任何資安問題,歡迎隨時與NEITHNET團隊聯繫!

參考資料:

https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP

https://blog.huli.tw/2022/09/01/angularjs-csp-bypass-cdnjs/

https://csp-evaluator.withgoogle.com/