CSP標頭由多組CSP策略組成,用分號分隔,如下所示:
其中每個組策略包含壹個策略指令和壹個內容源列表。
default-src指令定義了更精確的指令沒有指定的安全策略。這些說明包括:
Script-src定義了頁面中Javascript的有效來源。
Style-src定義了頁面中CSS樣式的有效來源。
Img-src定義了頁面中圖片和圖標的有效來源。
定義了壹個有效的字體加載源。
Connect-src定義了請求的連接源,XMLHttpRequest、WebSocket和EventSource。
Child-src指定web workers和嵌套瀏覽上下文(例如
內容來源有三種:來源列表、關鍵詞和數據。
源列表是指定壹個或多個Internet主機(通過主機名或IP地址)以及可選的或端口號的字符串。站點地址可以包含可選的通配符前綴(星號,' * '),端口號也可以使用通配符(也是' * ')來表示所有合法端口都是有效的源。主機由空格分隔。
有效的主機表達式包括:
(匹配所有使用任何子域的嘗試。)
Mail.foo.com:443(匹配所有訪問mail.foo.com 443端口的嘗試。)
(匹配所有使用嘗試。)
如果未指定端口號,瀏覽器將使用指定協議的默認端口號。如果未指定協議,瀏覽器將在訪問文檔時使用該協議。
CSP的設置可能太多了,這裏只列舉幾種典型情況。
在default-src 'none '的情況下,可以使用meta標簽來實現跳轉。
如果允許unsafe-inline,可以使用window.location或window.open這樣的方法來跳轉。
CSP沒有充分考慮鏈接標簽的預加載功能。
在Chrome下,可以使用以下標簽發送cookie(最新版本的Chrome會禁止)。
在Firefox下,可以把cookies作為子域,通過dns預解析取出cookies,查看dns服務器的日誌來獲取cookies。
壹些網站只限制使用某些腳本,並且經常使用
那麽當腳本插入點如下時
可以插入
這將拼寫壹個新的腳本標簽,其中src可以自由設置。
Blackhat2017上有壹個ppt,總結了壹些可以用來繞過CSP的JS庫。
例如,如果在頁面中使用Jquery-mobile庫,並且CSP策略包含“script-src 'unsafe-eval '”或“script-src 'strict-dynamic '”,則以下向量可以繞過CSP:
除了這個PPT,還有壹些庫也可以用,比如RCTF2018中遇到的amp庫。下面的標簽可以獲得cookie命名的FLAG。
1.如果在頁面A中有CSP限制,而在頁面B中沒有,並且A和B是同源的,那麽可以在頁面A中包含頁面B以繞過CSP:
2.在Chrome下,iframe標簽支持csp屬性,有時可以用來繞過壹些防禦。比如“http://xxx”頁面上有壹個js庫,過濾XSS向量,我們可以用csp屬性禁用這個js庫。
元標簽有壹些不尋常的功能,有時會創造奇跡:
Meta可以控制緩存(當沒有設置頭時),並且有時可以用於繞過CSP nonce。
Meta可以設置cookies(在Firefox下),可以和self-xss結合使用。