Host頭部攻擊


在HTTP的請求報文中,我們經常會看到Host字段,如下

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協議的一個封裝。

那么,Host字段的作用是什么呢?

通常,我們一台服務器上不止有一個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編碼便輸出到了頁面中,比如:

<link href=http://_SERVER["HTTP_HOST"]></link>    //觸發一個get請求
<form method=”POST”></form>                       //觸發POST請求

當Host字段被修改為攻擊者構造的惡意地址,這時,就會觸發惡意請求。

這樣處理問題一般會很容易遭遇到兩種常見的攻擊:緩存污染和密碼重置。緩存污染是指攻擊者通過控制一個緩存系統來將一個惡意站點的頁面返回給用戶。密碼重置這種攻擊主要是因為發送給用戶的內容是可以污染的,也就是說可以間接的劫持郵件發送內容。

參考文章:Host頭攻擊技術解析及防御


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM