01 漏洞描述
為了方便獲取網站域名,開發人員一般依賴於請求包中的Host首部字段。例如,在php里用_SERVER["HTTP_HOST"]。但是這個Host字段值是不可信賴的(可通過HTTP代理工具篡改),如果應用程序沒有對Host字段值進行處理,就有可能造成惡意代碼的傳入。
02 漏洞知識拓展
Host首部字段是HTTP/1.1新增的,旨在告訴服務器,客戶端請求的主機名和端口號,主要用來實現虛擬主機技術。
運用虛擬主機技術,單個主機可以運行多個站點。以下圖為例,hacker和usagidesign兩個站點都運行在同一服務器A上,不管我們請求哪個域名,最終都會被解析成服務器A的IP地址,這個時候服務器就不知道該將請求交給哪個站點處理,因此需要Host字段指定請求的主機名。
我們訪問hacker域名,經DNS解析,變成了服務器A的IP,請求傳達到服務器A,A接收到請求后,發現請求報文中的Host字段值為hacker,進而將請求交給hacker站點處理。(這里又涉及到計算機網絡知識了,是不是覺得要學的真多?沒關系,我后面都會一一介紹的)
這個時候,問題就出現了。為了方便獲取網站域名,開發人員一般依賴於請求包中的Host首部字段。例如,在php里用_SERVER["HTTP_HOST"]。但是這個Host字段值是不可信賴的(可通過HTTP代理工具篡改),如果應用程序沒有對Host字段值進行處理,就有可能造成惡意代碼的傳入。
03 漏洞檢測
Host頭攻擊漏洞的檢測比較簡單,只需要抓包,修改Host字段值,提交,查看響應中是否包含修改后的Host字段值即可。
下面我分三個場景,介紹一下Host頭攻擊漏洞存在的表現。
跳轉
場景一:正常請求,響應302,Location首部字段指明跳轉的地址,其中Location字段值為Host字段指定的地址。
將請求包的Host字段值修改為www.baidu.com提交,響應包中的Location地址也被更改為www.baidu.com。
拼接
場景二:正常請求,正常響應,將Host字段值拼接到標簽屬性值中。

將請求包的Host字段值修改為www.baidu.com提交,發現服務器將www.baidu.com拼接到了script標簽的src屬性值中。
代碼注入
場景三:這其實也屬於拼接,只不過在場景二的基礎上寫入了惡意代碼。

利用Host字段寫入script標簽,彈出警告框。
04 漏洞修復
對Host字段進行檢測。
Nginx,修改ngnix.conf文件,在server中指定一個server_name名單,並添加檢測。
Apache,修改httpd.conf文件,指定ServerName,並開啟UseCanonicalName選項。
Tomcat,修改server.xml文件,配置Host的name屬性。
作者:安全小白團
鏈接:https://www.jianshu.com/p/690acbf9f321
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。