HTTP Host header是從HTTP/1.1開始的強制請求頭。它指定了客戶端想要訪問的域名。例如,當使用者訪問某個網站時,其瀏覽器會組成包含Host header的請求:
GET /web-security HTTP/1.1
Host: domain-name.com
如果請求沒有Host header,或者如果Host header有誤,這可能導致將傳入的請求路由到預期的網站時出現問題。儘管每個這些獨立的網站都將有一個不同的域名,但它們都共享伺服器的公共IP地址。
HTTP Host header攻擊是利用處理Host header值的不安全方式的易受攻擊的網站。如果伺服器隱含地信任Host header,並且未能適當地驗證它,則攻擊者可能能夠使用此輸入注入有害的payload,從而操縱伺服器端行為。直接將payload注入Host header的攻擊通常被稱為"Host header注入"攻擊。
幾乎所有需要登錄的網站都實現了允許使用者在忘記密碼時重設密碼的功能。有幾種方法可以做到這一點,其安全性和實用性各不相同。其中最常見的方法如下:
使用者輸入他們的使用者名或電子郵件地址,並提交一個密碼重設請求。
網站檢查此使用者是否存在,然後生成一個臨時的、唯一的、高熵的令牌,並將其與使用者的帳號相關聯。
網站向使用者發送一封包含重設密碼鏈接的電子郵件。使用者的唯一重設令牌作為查詢參數包含在相應的URL中:
https://normal-website.com/reset?token=0a1b2c3d4e5f6g7h8i9j
當使用者訪問此URL時,網站檢查所提供的令牌是否有效,並使用它來確定正在重設哪個帳戶。如果一切正常,使用者將有選擇輸入新密碼的選項。最後,令牌被銷毀。
這個過程很簡單,與其他方法相比相對較為安全。但是,它的安全性依賴於只有目標使用者可以訪問他們的電子郵件收件箱,因此可以訪問他們的唯一令牌。密碼重設中毒是竊取此令牌以更改其他使用者密碼的方法。
要防止HTTP Host header攻擊,最簡單的方法是在伺服器端代碼中完全避免使用Host header。當您必須使用絕對URL時,應在配置文件中手動指定當前域,並引用此值而不是Host header。這種方法將消除重置密碼中毒的威脅。其他防止HTTP Host header攻擊的方法還包括保護絕對URL、驗證Host header、不支援Host覆寫header、白名單允許的域,以及在虛擬主機使用時小心內部僅限於虛擬主機。