用於保護Web服務的基本HTTP標頭介紹
如何在Web伺服器上配置HTTP標頭,也是提高其安全性的重要一環。在本文中,我們將詳細介紹每個標頭所起的作用,以及攻擊者可以利用哪些錯誤配置實施哪些攻擊。
以下是我們本文將討論的一些HTTP標頭的型別(總共兩大類):
防止攻擊的伺服器標頭
1. HTTP嚴格安全傳輸 (HTTP Strict Transport Security,通常簡稱為HSTS),它是一個安全功能,它告訴瀏覽器只能通過HTTPS訪問當前資源,而不是HTTP。
2. 網頁安全政策 (Content Security Policy,縮寫 CSP),CSP 的實質就是白名單制度,開發者明確告訴客戶端,哪些外部資源可以載入和執行,等同於提供白名單。它的實現和執行全部由瀏覽器完成,開發者只需提供配置。CSP大大增強了網頁的安全性。攻擊者即使發現了漏洞,也沒法注入指令碼,除非還控制了一臺列入了白名單的可信主機。兩種方法可以啟用CSP,一種是通過 HTTP頭資訊的Content-Security-Policy的欄位,另一種是通過網頁的<meta>標籤。
3. Access-Control-Allow-Origin ,當兩個域具有相同的協議(如http), 相同的埠(如80),相同的host(如www.google.com),那麼我們就可以認為它們是相同的域(協議,域名,埠都必須相同)。跨域就指著協議,域名,埠不一致,出於安全考慮,跨域的資源之間是無法互動的。Access-Control-Allow-Origin是HTML5中定義的一種解決資源跨域的政策。他是通過伺服器端返回帶有Access-Control-Allow-Origin標識的Response header,用來解決資源的跨域許可權問題。
4. X-FrameOptions ,X-FrameOptions HTTP響應頭是用來確認是否瀏覽器可以在frame或iframe標籤中渲染一個頁面,網站可以使用此功能,來確保自己網站的內容沒有被嵌到別人的網站中去,也從而避免了點選劫持 (clickjacking) 的攻擊。
5. X-XSS-Protection ,HTTP X-XSS-Protection 響應頭是Internet Explorer,Chrome和Safari的一個功能,當檢測到跨站指令碼攻擊 (XSS)時,瀏覽器將停止載入頁面。雖然這些保護在現代瀏覽器中基本上是不必要的,當網站實施一個強大的Content-Security-Policy來禁用內聯的JavaScript ('unsafe-inline')時, 他們仍然可以為尚不支援CSP的舊版瀏覽器的使用者提供保護。
6. X-Content-Type-Options ,X-Content-Type-Options響應首部相當於一個提示標誌,被伺服器用來提示客戶端一定要遵循在 Content-Type首部中對 MIME型別的設定,而不能對其進行修改。這就禁用了客戶端的MIME型別嗅探行為,換句話說,也就是意味著網站管理員確定自己的設定沒有問題。
洩漏資訊的伺服器標頭
·Server標頭
·X-Powered-By
·X-AspNet-Version
HTTP標頭的背景知識
客戶端和Web伺服器使用HTTP標頭作為HTTP協議的一部分來共享資訊,當我們在瀏覽器的位址列中輸入URL或單擊任何連結時,Web瀏覽器會發送包含客戶端標頭的HTTP請求,而HTTP響應就包含伺服器標頭。
以下是呼叫Google的web頁面時的HTTP請求-響應:
其中有幾十個HTTP標頭,雖然本文的目的不是解釋它們,但是,你可以在Mozilla的HTTP標頭頁面上找到每個標頭的參考和詳細資訊。
我們只在本文中,討論對安全性有影響的HTTP伺服器頭。
防止攻擊的伺服器 標頭
1.HTTP嚴格安全傳輸(HSTS)
HTTP嚴格安全傳輸性意味著瀏覽器僅通過HTTPS訪問Web伺服器。在伺服器上配置完成後,伺服器將響應中的標頭作為Strict-Transport-Security傳送。收到此標頭後,瀏覽器將僅通過HTTPS將所有請求傳送到該伺服器。 HSTS標頭有3個指令:
Max-age:這定義了僅通過HTTPS訪問Web伺服器的時間,此標頭的預設值為31536000秒。這是HSTS有效的最長時間。伺服器會在每次新響應時更新此時間,從而防止其過期。
IncludeSubDomains:這也適用於網站子域名的控制。
Preload:Preload list是硬編碼到Google Chrome瀏覽器中的網站列表,只能通過HTTPS進行通訊。網站的所有者可以提交其URL以將其包含在預載入列表中。此列表由Google維護,但其他瀏覽器也可以使用它。你可以在此處找到Preload list的完整資訊。
攻擊場景
如果未啟用HSTS,攻擊者可以執行中間人攻擊並從使用者的Web會話中竊取敏感資訊。設想一個場景,受害者連線到一個開放的Wi-Fi,而這個Wi-Fi實際上是由攻擊者控制的。通過HTTP訪問網站將允許攻擊者攔截請求並讀取敏感資訊。假如該站點使用的是HTTPS,但使用者使用HTTP訪問該站點,HTTP隨後就會被重定向到HTTPS。如果同一使用者早些時候訪問過該網站,那麼瀏覽器中記錄的HSTS詳細資訊將導致自動通過HTTPS進行連線。
2.網頁安全政策(Content Security Policy)
網頁安全政策表示的是瀏覽器僅載入政策中定義的允許內容,這等於是使用白名單方法,告訴瀏覽器從哪裡載入影象、指令碼、CSS、小程式等。如果正確實施,此政策可防止利用跨站點指令碼(XSS),ClickJacking和HTML注入攻擊。
如果標頭的名稱是Content-Security-Policy,其值可以使用以下指令定義:default-src,script-src,media-src,img-src,它們會指定瀏覽器應該從何處載入這些型別的資源(指令碼、媒體等)。
以下是一個示例設定:
Content-Security-Policy: default-src 'self'; media-src media123.com media321.com; script-src script.com; img-src *;
這被瀏覽器解釋為:
default-src'self':從當前域載入所有內容
media-src media123.com media321.com:媒體只能從media1.com和media2.com載入
script-src script.com:指令碼只能從script.com載入
img-src *:可以從Web中的任何位置載入影象
示例
為dropbox.com正確設定Content-Security-Policy標頭:
沒有為apple.com設定Content-Security-Policy標頭:
有關網頁安全政策的更多資訊,請訪問 ofollow,noindex">Mozilla網站 。
3.Access-Control-Allow-Origin
Access-Control-Allow-Origin是CORS(跨源資源共享)標頭,此標頭允許定義的第三方訪問給定資源,它是對同源策略的限制的一個變通方法,該策略不允許兩個不同的源讀取彼此的資料。
例如,如果站點ABC想要訪問站點XYZ的資源,那麼站點XYZ將使用站點ABC的地址響應Access-Control-Allow-Origin標頭。通過這種方式,站點XYZ告訴瀏覽器誰將被允許訪問其內容。
Access-Control-Allow-Origin: SiteABC.com
攻擊場景
如果Access-Control-Allow-Origin配置不當,攻擊者可以使用其他第三方網站從目標網站讀取資料。許多開發人員使用萬用字元訪問Access-Control-Allow-Origin標頭,這就允許任何網站從他們的網站讀取資料。
4.Set-Cookie響應頭
只有客戶端才能設定Cookie,服務端若想讓客戶端增加一個Cookie項,需要在應答時,在Http頭部中,通過使用Set-Cookie,將要設定的Cookie項傳送給客戶端。這樣客戶端,在下次訪問時,會帶上該Cookie項。
應用程式設定的cookie值由伺服器在Set-Cookie標頭中傳送。在接收到此標頭之後,瀏覽器將在Cookie標頭中的每個HTTP請求中傳送Cookie。
HTTP cookie通常包含許多敏感資訊(尤其是會話cookie),需要對其進行保護以防止未經授權的訪問。
可以設定以下屬性來保護cookie:
Secure:使用此屬性設定的cookie只會通過HTTPS傳送,而不是通過明文HTTP協議傳送(容易被竊聽)。
HTTPOnly:瀏覽器將不允許JavaScript程式碼訪問使用此屬性設定的cookie的內容,這有助於緩解通過XSS攻擊劫持會話的問題。
示例
為dropbox.com正確設定了Cookie屬性HTTPOnly和Secure:
沒有為boeing.com設定Cookie安全屬性的示例:
5. X-FrameOptions
通過禁止瀏覽器在iframe元素中載入頁面,此標頭可用於保護使用者不受ClickJacking攻擊。X-FrameOptions包含3個指令:
X-Frame-Options: DENY——這個指令將不允許在任何網站的框架中載入頁面:
X-Frame-Options: sameorigin——這個指令將允許頁面在一個框架中載入,前提是源框架是相同的,也就是說,在www.site.com上的一個頁面在一個框架中載入,前提是該框架的父頁面有相同的來源(www.site.com)。
X-Frame-Options: allow-from uri——框架只能顯示在指定域/源(domain/origin)的框架中,那什麼是源的呢?源其實是是個域名(domain),一般請求網頁的那個url的域名就會被制定為源。
攻擊場景
攻擊者可以通過釣魚的方式,讓使用者訪問惡意網站,此時惡意網站會將目標應用程式載入到不可見的iframe中。當用戶點選惡意應用程式(例如基於網路的遊戲)時,就會產生所謂的Clickjacking攻擊,此時,攻擊者將在未經使用者同意的情況下點選合法應用程式,這可能導致執行一些不需要的操作(例如刪除帳戶等)。
示例
正確實現X-Frame-Options標頭以拒絕dropbox.com的框架載入:
在ibm.com上未實現X-Frame-Options標頭:
6.X-XSS-Protection
此標頭旨在防止跨站點指令碼攻擊,它適用於現代瀏覽器使用的XSS過濾器,目前包含3種模式:
X-XSS-Protection: 0——0代表的是禁用XSS過濾器;
X-XSS-Protection: 1——1代表將啟用過濾器,如果檢測到XSS攻擊,瀏覽器將清理頁面內容以阻止指令碼執行。
X-XSS-Protection: 1; mode=block——如果檢測到XSS攻擊,則使用了塊模式(block mode)的值(1)將阻止頁面呈現。
示例
在linkedin.com上正確實現了X-XSS-Protection標頭:
instagram.com上缺少X-XSS-Protection標頭:
7.X-Content-Type-Options
此響應標頭用於防止MIME嗅探漏洞。什麼是MIME嗅探?IE從SP2開始進行了MIME嗅探的功能,MIME嗅探是Web瀏覽器的一項功能,用於檢查所服務檔案的內容。它的工作原理如下:
1.Web瀏覽器請求檔案,伺服器傳送一個帶有HTTP標頭Content-Type集的檔案。以前的瀏覽器都是通過Content-Type來判斷Resoponse流是何種型別的內容,進而呼叫不用的處理程式進行處理,如text/html表明接受的html程式碼,需要做html頁面渲染,text/jpeg表明接受的圖片檔案,需要對接受到的資料流呼叫處理jpeg格式流的處理程式。IE則在此基礎上增加了對MIME的嗅探功能,不僅僅根據Content-Type來判斷,而且會根據Response流的內容來進行判斷。
2.Web瀏覽器“嗅探”此檔案的內容以確定檔案格式。
3.完成分析後,瀏覽器會將其結果與伺服器傳送的結果進行比較。如果不匹配,瀏覽器將使用已標識的格式。
這些過程裡,就有可能導致安全的漏洞。
攻擊場景
1.應用程式允許使用者上傳影象檔案並驗證其副檔名;
2.使用者上傳帶有jpg或png副檔名的影象檔案,但此檔案也包含惡意HTML程式碼;
3.瀏覽器使用包含程式碼的HTML呈現檔案並在瀏覽器中執行;
通過將標頭X-Content-Type-Options設定為nosniff,瀏覽器將不再“嗅探”所接收檔案的內容,而是使用Content-Type標頭中的值,此標頭專用於IE和Chrome瀏覽器。
此標頭可以與另外兩個標頭一起使用,以增強安全性,它們是:
Content-Disposition:Content-Disposition是作為對下載檔案的一個標識欄位,它強制瀏覽器顯示下載pentest.html檔案的彈出視窗。
Content-Disposition: attachment; filename=pentest.html
X-Download-Options:當此標頭設定為noopen時,使用者被迫在開啟之前首先在本地儲存檔案,而不是直接在瀏覽器中開啟檔案
示例
正確呈現了linkedin.com 的X-Content-Type-Options標頭:
呈現了錯誤的instagram.com的X-Content-Type-Options標頭:
洩漏資訊的伺服器標頭
1.Server標頭:
此標頭包含有關後端伺服器(型別和版本)的資訊,例如,下面的螢幕截圖顯示執行Nike網頁的Web伺服器是Jetty,版本為9.4.8.v20171121。
如果攻擊者能獲取此資訊,就會查詢特定於Jetty 9.4.8版本的漏洞,此資訊可在以下公共資料庫中找到,例如:
https://www.securityfocus.com/bid ;
你只需要在其中搜索特定的產品和版本既可,影響Jetty Web伺服器的漏洞資訊的詳細介紹如下:
示例
通過重新配置web伺服器,可以遮蔽伺服器資訊。例如,在Linkedin的網站上有一個很好的配置示例(伺服器名被修改為“Play”):
2.X-Powered-By:
包含Web應用程式中使用的Web框架或程式語言的詳細資訊。例如,https://msc.mercedes-benz.com上的Web應用程式是使用PHP 7.1.22構建的,並由Plesk託管。
3.X-AspNet-Version:
顧名思義,它會顯示ASP .NET框架的版本細節。這些資訊可以幫助攻擊者根據框架及其版本調整攻擊策略。
以下是來自http://demo.testfire.net伺服器的標頭示例: