HSTS是HTTP Strict Transport Security響應頭的簡稱,它的主要作用是防止協議降級攻擊,如SSL剝離中間人攻擊。它的工作原理是允許伺服器下發指令給客戶端瀏覽器,要求其只能通過安全的HTTPS連接與服務端進行交互。 HSTS是一種IETF標準協議, 具體可參見RFC6797。
在日常的瀏覽習慣中,除了通過搜尋引擎之外,大部分用戶會直接在地址欄中輸入網址進行訪問,但是其中的大多數用戶為了方便,都直接輸入網址而忽略輸入協議。例如訪問百度,輸入www.baidu.com,而不是https://www.baidu.com。當網站採用https進行通訊並同時允許http時,通常在此處服務端會做一次302重定向跳轉,客戶端才進而請求HTTPS連接。那麼這樣的場景是否存在安全風險呢?答案是肯定的,比較經典的一個case是2013年在波蘭發生過一次DNS劫持事件。
見下圖(圖片引用自CERT):
當用戶訪問網站時,由於第一次未輸入協議(https://)導致明文HTTP通信,攻擊者可以在完成DNS劫持之後執行SSL剝離開始嗅探用戶。具體步驟為:攻擊者劫持DNS之後,進行SSL剝離劫持HTTP請求流量,將出現的HTTPS替換成HTTP,採用HTTP與受害者進行連結,同時與合法的伺服器建立HTTPS連結,受害者與合法伺服器之間的全部通信實質上是通過攻擊者進行轉發的。
對於以上Case的解決方案,網站提供方其實是可以通過提供HSTS響應頭進行防禦,因此這也解釋了HSTS出現的歷史原因。
當用戶初次發起請求時, 伺服器通過下發HSTS響應頭,支持HSTS功能的用戶瀏覽器將識別該頭部並將該站點域名加入其HSTS列表中,當用戶後續訪問如www.example.com而不是https://www.example.com時,瀏覽器將會阻止發出非https的請求,而是在瀏覽器內部先完成一次307跳轉(而不是302跳轉),將http轉換為https後再發出去,這樣可以有效避免SSL剝離中間人攻擊。
下面我們看下國內外HSTS應用的案例:
支付寶:瀏覽器內部做了一次307跳轉:
Facebook:瀏覽器內部同樣做了307跳轉
再看看Chrome瀏覽器內置HSTS列表
chrome://net-interals/#hsts
如圖可見Facebook早已有內置。到此為止,你可能會有疑問,比如初次加載就被劫持怎麼辦? 瀏覽器支持情況如何等等。
針對第1個問題,如果初次訪問就被劫持怎麼辦?
目前網站可以通過HSTS的preload屬性實現瀏覽器提前預內置,很多瀏覽器廠商已經提供了HSTS列表提前內置申請,如谷歌,可以通過提交申請進行域名提前內置,目前Facebook等很多公司均已經提前內置。
針對第2個問題,瀏覽器的支持情況如何?
下面是目前支持HSTS功能的瀏覽器版本,看起來覆蓋還是挺全的。
http://www.rfc-editor.org/rfc/rfc6797.txt
https://blog.cloudflare.com/enforce-web-policy-with-hypertext-strict-transport-security-hsts/
http://www.freebuf.com/news/25532.html
https://www.chromium.org/hsts
https://hstspreload.appspot.com/
http://www.freebuf.com/articles/web/66827.html
https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
點擊下方「閱讀原文」查看VSRC2016第一季度安全專家名人榜!