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為例,可以看到那些有危險。
而值得注意的是有警示的部分也有列出原因,像是這個例子是
https://www.google.com會被JSONP 繞過
而另一種方式透過弱掃通常也都會注意CSP的部分,掃出來的項目名稱通常寫成以下:
緩解方式
CSP bypass是指被繞過讀取其他的script,而我們可以改善方式: 第一種解法是使用nonce,第二種解法是使用hash。
使用nonce,需要每次有新的request就產生一組新的亂數nonce值搭配inline script的nonce值,來取代使用url路徑,但是每次request都需要產生nonce來處理,假如使用同一個或是有規律的nonce,一樣會被攻擊者拿來使用。
使用hash,將script經過hash來使用來避免內容被竄改或被取代,但是這種方式每次要修改網頁script都需要確實產生新的hash並更新CSP header。
想了解更多產品資訊,請連至官網https://www.neithnet.com/zh/,或直接與NEITHNET資安專家聯繫:info@neithnet.com
參考資料
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/