在HTTP的請求報文中,咱們常常會看到Host字段,以下php
GET /test/ HTTP/1.1 Host: www.baidu.com Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Referer: https://www.baidu.com/index.php Accept-Encoding: gzip, deflate, br Accept-Language: zh,zh-CN;q=0.8,ar;q=0.6,zh-TW;q=0.4 Cookie: BAIDUID=AE4D1DA6B2D6689BB8C557B3436893E3:FG=1;BIDUPSID=AE4D1DA6B2D6689BB8C557B3436893E3; PSTM=1501466227;
之前一直認爲Host字段的做用在於指明HTTP報文發送的方向,訪問的地址。可是實際上報文轉發已經由網絡層和傳輸層決定了IP和端口,http協議只是基於tcp協議的一個封裝。html
那麼,Host字段的做用是什麼呢?web
一般,咱們一臺服務器上不止有一個web程序,不少狀況下都有幾個web程序,也就是說這幾個web程序共用一個ip地址。當咱們配置基於端口的虛擬主機,這是沒有什麼問題的,不一樣的web程序能夠經過不一樣的端口來判斷。可是,當咱們配置基於域名的虛擬主機時,幾個web程序共用一個ip地址(這裏咱們假設爲192.168.1.1)和一個端口(這裏咱們假設爲80端口)。那麼,當客戶端請求都發到了服務器的80端口,服務器怎麼判斷這條請求是發送給哪一個web程序的呢?這時候,host頭出現了,host頭指定了應該由哪一個網站或是web應用程序來處理一個傳入的HTTP請求。web服務器使用該頭部的值來將請求分派到指定的網站或web應用程序之上。緩存
Host頭部攻擊
這個Host頭是在客戶端的請求頭中的,是由客戶端提供的,也就是說客戶端能夠修改這個值。那麼,只要是能被客戶端修改的值,都是不可信任的。服務器
當Host頭部被修改成無效Host頭會發生什麼狀況?大多數web服務器配置爲將沒法識別的Host頭傳送給列表中的第一臺虛擬主機或者返回錯誤信息。所以,這使得把攜帶有任意Host頭的請求發送到第一臺虛擬主機上是可能的。網絡
不少應用直接把Host值不作html編碼便輸出到了頁面中,好比:app
<link href=http://_SERVER["HTTP_HOST"]></link> //觸發一個get請求 <form method=」POST」></form> //觸發POST請求
當Host字段被修改成攻擊者構造的惡意地址,這時,就會觸發惡意請求。
這樣處理問題通常會很容易遭遇到兩種常見的攻擊:緩存污染和密碼重置。緩存污染是指攻擊者經過控制一個緩存系統來將一個惡意站點的頁面返回給用戶。密碼重置這種攻擊主要是由於發送給用戶的內容是能夠污染的,也就是說能夠間接的劫持郵件發送內容。tcp
參考文章:Host頭攻擊技術解析及防護網站