HTTP安全標頭及其工作原理(上)
前言
標頭是HTTP規範的一部分,在HTTP請求和響應中定義訊息的元資料。當用戶通過客戶端瀏覽器訪問網站時,伺服器使用HTTP響應頭進行響應。雖然HTTP訊息通常由使用者讀取,但元資料僅由Web瀏覽器處理,並且自1.0版以來已包含在HTTP協議中。
在請求訊息中,元資料可以包含以下資訊:
1.請求的語言;
2. Cookies;
3.網站證書;
4.快取資料
而在響應訊息中,元資料可以包含以下資訊:
1.內容的大小和型別;
2.快取儲存首選項;
3.伺服器資料;
4.時間和日期;
5.由客戶端設定的憑據;
安全標頭是HTTP響應標頭,它定義了web瀏覽器上的一組安全預防措施是應該被啟用還是應該被停用。HTTP安全標頭是網站安全的基本組成部分。在超文字傳輸協議( Hypertext Transfer Protocol ,HTTP)的請求和響應訊息中,協議頭部分的那些元件。HTTP安全標頭實施後,可防止XSS,程式碼注入,clickjacking等。
本文的內容由以下章節組成:
1.X-Frame-Options HTTP響應頭
1.1如何防止點選劫持攻擊;
1.2 X-Frame-Options HTTP響應頭選項指令;
1.3關於X-Frame-Options HTTP響應頭的要點;
1.4哪些瀏覽器支援X-Frame-Options HTTP響應頭;
2.X-XSS-Protection HTTP響應標頭
2.1惡意攻擊者在利用反射型XSS漏洞時可以做些什麼?
2.2不同的X-XSS-Protection HTTP響應頭指令;
2.3繞過XSS阻斷機制
3.X-Content-Type-Options HTTP標頭
3.1文字檔案上傳示例;
4.X-Download-Options HTTP標頭
4.1Cookie盜竊示例;
5.內容安全策略(CSP)HTTP標頭
5.1內容安全策略指令;
5.1.1 default-src指令示例;
5.2使用內容安全策略時要記住的一件事;
6.HTTP嚴格傳輸安全性(HSTS)HTTP標頭
6.1有沒有辦法進一步改善你網站上的HTTPS保護?
6.1.1嚴格的傳輸安全標頭示例;
6.2第一次請求和預載入;
6.2.1HSTS預載入列表的附加要求
7.HTTP公鑰固定
7.1證書頒發機構和冒牌頒發機構;
7.1.1如何防止偽造證書;
7.2 HPKP標頭的設定;
7.3HPKP指令
7.4哪些瀏覽器支援PKP安全標頭?
8.Expect-CT HTTP標頭
8.1證書透明(Certificate Transparency,CT)日誌
8.1.1CT日誌的工作原理;
8.1.2CT日誌所存在的風險?
8.2我們如何實現Expect-CT標頭?
9.Referrer-Policy HTTP標頭
9.1Referrer-Policy標頭的工作原理;
9.2Referrer-Policy指令;
9.3哪些瀏覽器支援Referrer-Policy安全標頭?
10積極主動的探索和預防是至關重要的!
X-Frame-Options HTTP標頭
X-Frame-Options標頭是Microsoft建議的一種安全標頭,以避免自2009年開始的介面偽裝(UI redressing) 點選劫持攻擊,目前所有主流瀏覽器都支援它。
UI Redressing攻擊基於在iframe中載入web頁面並將其與其他UI元素疊加。目前已有各種型別的UI Redressing,例如劫持擊鍵或提取內容,每一種攻擊都有其優點。
點選劫持攻擊方法的工作原理是將惡意網站載入到一個低不透明度的iframe中,並在其上疊加一個看上去無害的按鈕、複選框或連結,從而誘使使用者與下面的易受攻擊的網站進行互動。這會強制使用者單擊明顯安全的UI元素,從而在嵌入的易受攻擊的網站上觸發一系列操作。
在此示例中,亞馬遜網站以一個低不透明度iframe載入,因此使用者無法看到載入過程。他們看到的是Click Here按鈕而不是下面的Buy按鈕。但是,當用戶單擊Click Here按鈕時,實際上單擊的是亞馬遜網站上的Buy按鈕,這會觸發一些列購買操作。
由於這些交互發生在受害者有意瀏覽網站的情況下,因此在亞馬遜網站上觸發的互動也將包括受害者的憑證(如cookie)。請注意,此場景完全是為了講解本文而虛構的,並且設定在無法使用X-Frame-Options標頭等安全機制的環境中。
如何防止點選劫持攻擊
點選劫持是一種針對使用者的攻擊,是網路安全鏈中最薄弱的環節。目前已經出現了多種防護方法,例如Frame Busting,以保護使用者免受此攻擊。其中最可靠的方法是X-Frame-Options標頭,它在2009年被新增到Microsoft的Internet Explorer瀏覽器中。
為了保護使用者免受點選劫持之類的攻擊,最好的策略是防止惡意網站利用iframe或frame構建我們的頁面。為此,我們可以使用X-Frame-Options安全標頭來執行此操作。
X-Frame Options指令
有三種X-Frame-Options指令可用:
X-Frame-Options: DENY | SAMEORIGIN | ALLOW-FROM URL
指令說明:
·DENY:頁面不得嵌入到iframe或任何類似HTML元素中的其他頁面中。
· SAMEORIGIN::網站只能嵌入到根據方案、主機名和埠配對的網站中,例如,https://www.example.com只能通過https://www.example.com載入,而https://www.attacker.com甚至http://example.com都不允許嵌入。
· ALLOW-FROM URL:載入的網站只能由此處指定的URL框架,使用X-Frame-Options有兩點需要記住:
1.基於Chromium的瀏覽器僅部分支援X-Frame-Options(ALLOW-FROM指令不可用);
2.使用ALLOW-FROM URL指令,我們只能將一個域列入白名單,並允許該網站載入一個iframe;
關於X-Frame-Options HTTP標頭的重要事項
1.X-Frame-Options標頭必須出現在所有頁面的HTTP響應中;
2.可以使用Content-Security-Policy frame-ancestors指令代替X-Frame-Options:
Content-Security-Policy: frame-ancestors 'none'; // No URL can load the page in an iframe. Content-Security-Policy: frame-ancestors 'self'; // Serves the same function as the SAMEORIGIN parameter.
雖然你可以將X-Frame-Options中的一個網址列入白名單,但使用CSP frame-ancestors,你可以新增多個將你的網站嵌入iframe的網址。
哪些瀏覽器支援X-Frame-Options HTTP標頭?
與許多安全功能一樣,X-Frame-Options標頭在瀏覽器中起初並不總是能被用到,對這種標頭的需求要等很長一段時間才能被用到。因此,並非所有瀏覽器都在其第一個版本中支援它。不過,幾乎所有現代瀏覽器都支援X-Frame-Options,不管是全部支援,還是部分支援。如上所述,並非所有瀏覽器都支援ALLOW-FROM指令。
X-XSS-Protection HTTP標頭
X-XSS-Protection允許開發人員更改Reflected XSS(跨網站指令碼)安全過濾器的行為,這些過濾器旨在檢測危險的HTML輸入,並阻止網站載入或刪除潛在的惡意指令碼。
惡意攻擊者在利用反射型XSS漏洞時可以做些什麼?
反射型XSS是一種漏洞,它是由於在頁面上下文中將使用者輸入作為指令碼程式碼進行評估而產生的。XSS(Cross Site Scripting),又稱跨站指令碼,XSS的重點不在於跨網站,而是在於指令碼的執行。XSS的目標是讓其他網站的js檔案執行在目標網站的上,這主要發生在頁面渲染階段。在該階段發生了某些非預期的指令碼行為,該指令碼可能來自使用者的輸入,也可能來自域外的其他js檔案,不一而足。XSS的發生起來源來自於使用者輸入,因此XSS根據使用者輸入資料以何種形式、何時觸發XSS、是否有後端伺服器的參與劃分為三種類型,分別是反射型XSS、持久型XSS和DOM XSS。
反射型XSS漏洞發生時,會產生很多惡意行為,例如竊取使用者的cookie、跟蹤鍵盤敲擊或滑鼠移動,或偽裝成使用者發出請求,這些行為都可以在XSS的幫助下執行。以上就是反射型XSS漏洞的工作原理,你可以參考以下PHP程式碼。
<p>Welcome <?php echo $_GET["name"];?></p>
通過將以下HTML和JavaScript程式碼傳遞給name引數,應用程式可以不經過濾,就將其嵌入頁面中,這將在易受攻擊的網站上顯示JavaScript警告視窗。
http://www.example.com?name=<script>alert(1);</script>
不同的X-XSS-Protection標頭指令
可以使用各種指令在Web瀏覽器中更改XSS過濾器的行為。在這一節中,我們將解釋不同的指令以及它們的目的。
X-XSS-Protection: 1
這是預設設定,它可以在Web瀏覽器上啟用XSS過濾,並阻止在頁面上執行潛在的XSS有效載荷。
X-XSS-Protection: 1; mode=block;
這樣就可以在瀏覽器中進行XSS過濾,它通過阻止頁面的呈現來避免潛在的XSS有效載荷執行。部署XSS有效載荷後,訪問者在瀏覽器上獲得一個空白頁面。
在基於Chromium的瀏覽器中,它可以將XSS注入嘗試報告給report指令中指定的URL。
X-XSS-Protection: 1; mode=block; report=https://domain.tld/folder/file.ext
XSS過濾器負責檢測反射的指令碼程式碼,如果在HTML頁面上的請求和響應中都發現了潛在的惡意HTML程式碼,則會觸發它。雖然某些指令會指示瀏覽器刪除有問題的惡意指令碼,但其他指令會完全阻止頁面的呈現。
例如:
請求網址:
http://www.example.com/?param=<script>alert(1);</script>
迴應物件:
… <div> <script>alert(1);</script> </div>
然而,XSS過濾器過去曾被濫用,以阻止HTML頁面的部分呈現。攻擊者可以利用XSS過濾器的預設行為,如果它出現在頁面的URL中,XSS過濾器則會阻止任何可能存在危險的程式碼。
繞過XSS阻斷機制
攻擊者還使用XSS過濾器來禁用重要的HTML和JavaScript程式碼,例如,Frame Busting機制。近年來,一些新的攻擊技術已經被開發出來,可以在這些過濾器的幫助下停用指令碼或竊取使用者資料。
現在,讓我們看一個Frame Busting機制的示例。framebusting 程式碼都是基於 javascript 的,以此來檢測框架和“破環”自身。如果 javascript在子框架內容中被禁用,framebusting 程式碼將不會執行。如果開發人員發現該網站是在一個框架內載入的,他們可以使用以下程式碼將頂部視窗重定向到他們的網站。
<script> if(top != self) { top.location = self.location; } </script>
攻擊者可以使用預設情況下處於活動狀態的X-XSS-Protection機制繞過此防禦:
<iframe src="http://www.victim.com/?v=<script>if">
為了完成跨網站指令碼攻擊https://www.netsparker.com/blog/web-security/cross-site-scripting-xss/,有時X-XSS-Protection: 1;(Internet Explorer中的預設設定)也可以用於繞過XSS阻止機制。不過目前這些漏洞已被修復,不過該漏洞還是再提醒我們,新增到瀏覽器中每個功能都會威脅終端使用者的安全,甚至是那些旨在增強其安全性的功能。
研究人員認為,現代瀏覽器中的內容安全策略(Content Security Policy,簡稱CSP)是一種以可信白名單作機制,來限制網站中是否可以包含某來源內容。預設配置下不允許執行內聯程式碼 (<script>塊內容,內聯事件,內聯樣式),以及禁止執行 eval() , newFunction() , setTimeout([string], …) 和setInterval([string], …) 。這意味著Content-Security-Policy標頭足以確保不再需要X-XSS-Protection等機制。然而,有些人則認為該功能不夠安全, 並沒有增加太多安全功能 。
X-Content-Type-Options HTTP標頭
這個HTTP標頭通常用於控制Web瀏覽器中的MIME型別嗅探功能,MIME型別嗅探是瀏覽器在未指定內容型別時使用的內容評估功能。基本上,如果內容型別的標頭為空或乾脆遺失 了,瀏覽器會“嗅探”內容並嘗試以最合適的方式顯示內容來源。
但是,如果與上傳功能結合使用,由於此嗅探過程可能會帶來一些風險,因此開發人員應非常小心如何使用此標頭,下面是一個突出顯示安全風險的示例。
文字檔案上傳示例
假設使用者可以將文字檔案上傳到網站,如果上傳的檔案包含HTML、指令碼標籤或Javascript程式碼,並且我們在返回時未指定內容型別,則會發生以下情況:
瀏覽器將嗅探網站內容;
確定嗅探內容是文字檔案還是html型別的檔案;
直接在網站執行程式碼;
即使是上傳到我們網站的影象檔案,在返回給使用者時也應該包含Content-Type標標頭檔案。否則,指令碼和其他惡意程式碼可能會被注入到影象檔案的元資料(EXIF資料)中並被執行。
要防止瀏覽器嗅探頁面內容並決定使用哪種MIME型別,請使用帶有nosniff指令的X-Content-Type-Options標頭:
X-Content-Type-Options: nosniff
X-Download-Options HTTP標頭
可以使用X-Download-Options標頭下載所請求的資料,這樣就不用在瀏覽器中進行查看了。 X-Download Options標頭可在Internet Explorer 8及更高版本的瀏覽器中使用。
因此,該標頭就像一個深度防禦機制,特別適合於允許使用者上傳內容的應用程式,以下是此標頭幫助你避免攻擊的示例。
避免Cookie被盜竊的示例
假設一個使用者將名為stealcookie.html的檔案上傳到我們的測試網站,此時你不需要執行檔案就可以使用以下標頭強制下載檔案。
Content-Disposition: attachment; filename=stealcookie.html
雖然我們進行了強制下載,但下載時網站仍會提示使用者是否應該下載檔案或開啟檔案。如果使用者選擇開啟該檔案,則惡意程式碼將開始執行。
如果使用者單擊“開啟”該檔案,該檔案將被瀏覽器解析並顯示在我們的網站上,從而使檔案中的惡意程式碼能夠訪問同一域中的所有其他頁面。
防止這種情況發生的唯一方法是通過向X-Download-Options HTTP頭新增noopen指令來刪除使用者必須開啟檔案的選項:
X-Download-Options: noopen
使用此指令時,就防止惡意程式碼在我們的網站上執行,且此時使用者仍然可以儲存檔案並將其開啟。不過要注意的是,它將在使用者的檔案系統上執行。
內容安全策略(CSP)HTTP標頭
內容安全策略於2012年11月被正式推出,針對XSS、Clickjacking、協議降級、幀注入等多個漏洞,為使用者增加了一層安全防護。針對多個漏洞提供了額外的安全保護,例如XSS,點選劫持(ClickJacking),降級協議攻擊(Protocol Downgrading)和框架注入(Frame Injection),其中,點選劫持(ClickJacking)是一種視覺上的欺騙手段。大概有兩種方式,一是攻擊者使用一個透明的iframe,覆蓋在一個網頁上,然後誘使使用者在該頁面上進行操作,此時使用者將在不知情的情況下點選透明的iframe頁面;二是攻擊者使用一張圖片覆蓋在網頁,遮擋網頁原有位置的含義。在不久的將來,CSP或將成為客戶端安全保障方面的最重要的工具,因為它會成為預設情況下那些未啟用的安全標頭(如X-Frame-Options和X-XSS-Protection)的替代方案。
以下是CSP標頭示例:
Content-Security-Policy: <policy-directive>; <policy-directive>
在CSP中,我們使用白名單來定義規則。通過這種方法,我們可以過濾掉任何不符合安全規則的資來源,我們所要做的就是在Content-Security-Policy響應標頭中宣告資來源。
Content-Security-Policy: script-src 'self' https://apis.google.com
這個 CSP指令 僅允許通過我們的域和載入指令碼,任何其他內聯指令碼都不會執行。
內容安全策略指令
除了CSP標頭之外,我們還可以使用以下指令進一步限制和定義資來源的使用。以下是內容安全策略指令及其代表的具體含義:
· base-uri: 這個指令中的基本HTML元素包含絕對URL,引數 baseUri 是用來將相對 URL 轉成絕對URL,並指定從哪個網站獲取文件。該指令可以幫助我們限制基本HTML元素中允許使用的URL,從而防止 Base Tag 劫持攻擊。
· child-src::這個指令允許我們定義哪些網站被允許載入到頁面上的框架中。我們可以使用它作為額外的預防措施來保護我們的頁面免受框架注入攻擊。
· connect-src:指令定義了請求、XMLHttpRequest、WebSocket 和 EventSource 的連線來源,另外該指令限制了可以通過指令碼介面(如XHR或WebSockets)載入的資來源。這可以防止攻擊者竊取網站上的資料。
· font-src:該指令定義了通過 @font-face載入字型的有效來源,它主要用於防止攻擊者使用@ font-face src指令將提取的資料傳送回伺服器。
· form-action:該指令指定了可用作表單提交目標的URL,它可以作為額外的預防措施來保護頁面免受表單標記劫持 (Form Tag Hijacking) 和跨網站指令碼攻擊。
· frame-ancestors:此偽指令指定有權在框架,iframe,object,embed和applet標記中載入當前頁面的網站。它是X-Frame-Options的替代品,因為它還可以幫助防止Clickjacking和UI Redressing攻擊。
· IMG-SR C :該指令指定了影象和網站圖示的有效載入來源。
· media-src:該指令定義或限制了可以載入視訊和音訊的來源。
· object-src:該指令定義或限制了來自<object>,<embed>和<applet>的來源,這有助於防止跨網站指令碼攻擊。
· plugin-types:該指令定義或限制了可以載入的外掛型別。
· report-uri:該指令指定了在違反CSP指令時接收報告的URL。
· style-src:該指令定義或限制了CSS檔案的來源,這樣就可以避免通過CSS所進行的資料洩露。
· Upgrade-Insecure-Requests:該指令 是一個請求首部,用來向伺服器端傳送訊號,表示客戶端優先選擇加密及帶有身份驗證的響應,並且它可以成功處理 upgrade-insecure-requests CSP指令。另外,該指令將HTTP請求轉換為HTTPS。
default-src指令示例
default-src 指令定義了那些沒有被更精確指令指定的(預設)安全策略。該指令包含了以下指令:
child-src connect-src font-src img-src media-src object-src script-src style-src
注意:預設情況下,這些指令是不受限制的,這意味著如果它們未在CSP標頭中宣告,則任何請求都將通過。因此,如果style-src沒有給出任何值,則它會被自動解釋為style-src: *,此時來自所有來源的樣式都將允許通過。
不過,我們可以使用default-src指令來改變這一點。此時指定的值將覆蓋以-src結尾的大多數指令,將它們設定預設值。如果我們將default-src定義為http://www.example.com且沒有為font-src設定值,則字型只能從https://www.example.com載入。
但是,default-src不能覆蓋這些指令:
base-uri form-action frame-ancestors plugin-types report-uri sandbox
我們可以在一個HTTP頭中新增多個指令,方法是用分號將它們分隔。
script-src https://host1.com https://host2.com; style-src https://www.example.com
指令的多個值必須用空格隔開:
script-src https://host1.com https://host2.com;
使用內容安全策略時要切記
為HTTP響應中的每個頁面集定義CSP,這將幫助你為每個頁面及其特定需求定義最佳策略。你可以 點此 瞭解有關內容安全策略(CSP)的更多資訊。
本文我們對HTTP標頭的安全意義做了介紹,下一篇我就介紹一下有哪些標頭可以起到實際的安全防護作用?