一文講解HTTP報(bào)頭之host頭攻擊
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
前言今天來看一個(gè)比較有意思的漏洞-HTTP報(bào)頭攻擊,也就是host頭攻擊。在我們的印象中host頭是我們所要訪問的域名,默認(rèn)是不可控的,因?yàn)橐坏└淖兾覀兙筒荒苷_訪問目標(biāo)地址。其實(shí)不然,在某些情況下,改變了host頭依然可以訪問目標(biāo)。那么host頭在某些情況下也是我們可以控制的輸入,這也就為host頭攻擊提供了可能。 由于本人水平有限,文章中可能會(huì)出現(xiàn)一些錯(cuò)誤,歡迎各位大佬指正,感激不盡。如果有什么好的想法也歡迎交流~~ 什么是 HTTP Host 頭?重新再來認(rèn)識(shí)一下什么是host頭。 從 HTTP/1.1 開始,HTTP Host 頭是一個(gè)必需的請求頭,其指定了客戶端想要訪問的域名。例如我們訪問百度,發(fā)送的請求如下,會(huì)包含一個(gè)host頭。 HTTP頭的作用當(dāng)我們在瀏覽器中輸入一個(gè)網(wǎng)址時(shí),首先會(huì)根據(jù)網(wǎng)址進(jìn)行DNS解析,找到對應(yīng)的IP地址,然后將請求發(fā)送到對應(yīng)的IP地址。 我理解的域名與host頭其實(shí)并不是一個(gè)概念,域名是我們在瀏覽器中輸入要訪問的地址,而host頭是數(shù)據(jù)包中的一個(gè)值。 那么什么地方會(huì)用到http頭呢? 1)虛擬主機(jī)根據(jù)HTTP頭訪問具體的業(yè)務(wù)。目前由于IPV4的地址已經(jīng)耗盡,所以越來越多的應(yīng)用對應(yīng)同一個(gè)公網(wǎng)IP,這種情況下,就需要根據(jù)HTTP頭來判斷具體需要訪問那個(gè)業(yè)務(wù)。 2)通過代理訪問后端組件。域名的IP解析到代理的公網(wǎng)IP,然后代理在根據(jù)HTTP頭來分配到具體的后端組件。我們經(jīng)常使用的CDN也可以認(rèn)為是這種情況。 HTTP頭是否可以修改答案當(dāng)然是可以修改的,如下面在burp里面可以直接修改host頭,修改host頭以后還可以正常訪問應(yīng)用。 如下圖,修改以后還可以正常訪問 HTTP頭攻擊HTTP Host 頭攻擊會(huì)利用以不安全的方式處理 Host 頭的漏洞網(wǎng)站。如果服務(wù)器隱式信任 Host 標(biāo)頭,且未能正確驗(yàn)證或轉(zhuǎn)義它,則攻擊者可能會(huì)使用此輸入來注入有害的有效負(fù)載,以操縱服務(wù)器端的行為。將有害負(fù)載直接注入到 Host 頭的攻擊通常稱為 "Host header injection"(主機(jī)頭注入攻擊)。 上面我們已經(jīng)了解到就算改變了HTTP報(bào)頭也是可以正常訪問到應(yīng)用的,那么如果后端使用HTTP報(bào)頭,并且沒有做過濾,那么就有可能造成危害。 HTTP報(bào)頭可能得攻擊場景HTTP報(bào)頭攻擊可能存在以下的利用場景 1)重置密碼或者注冊用戶登場景發(fā)送重置鏈接取HTTP報(bào)頭的值 2)根據(jù)host頭限制一些資源的訪問 3)系統(tǒng)啟用了web緩存功能,可以利用web緩存投毒 4)根據(jù)host頭進(jìn)行路由(基于路由的SSRF) 在portswigger上有關(guān)于http host攻擊的專題,如下: 鏈接:https://portswigger.net/web-security/all-labs#http-request-smuggling 類似密碼重置場景攻擊幾乎所有需要登錄的網(wǎng)站都實(shí)現(xiàn)了下面的場景。下面以密碼重置來簡要概述這個(gè)場景
與其他一些方法相比,這個(gè)過程足夠簡單并且相對安全。然而,它的安全性依賴于這樣一個(gè)前提:只有目標(biāo)用戶才能訪問他們的電子郵件收件箱,從而使用他們的 token 令牌。而密碼重置中毒就是一種竊取此 token 令牌以更改其他用戶密碼的方法。 這里有一個(gè)問題,如果我們拿到這個(gè)鏈接就可以修改用戶的密碼,而token是動(dòng)態(tài)生成的,我們一般是無法獲取的。如果這個(gè)鏈接是根據(jù)host生成的,則給我們拿到這個(gè)鏈接提供了一種可能。如下: 如何構(gòu)造一個(gè)密碼重置中毒攻擊 如果發(fā)送給用戶的 URL 是基于可控制的輸入(例如 Host 頭)動(dòng)態(tài)生成的,則可以構(gòu)造如下所示的密碼重置中毒攻擊:
在真正的攻擊中,攻擊者可能會(huì)偽造一個(gè)假的警告通知來提高受害者點(diǎn)擊鏈接的概率。 即使不能控制密碼重置的鏈接,有時(shí)也可以使用 Host 頭將 HTML 注入到敏感的電子郵件中。請注意,電子郵件客戶端通常不執(zhí)行 JavaScript ,但其他 HTML 注入技術(shù)如懸掛標(biāo)記攻擊可能仍然適用。 PortSwigger靶場測試 在這里添加用戶名,然后攔截?cái)?shù)據(jù)包,將數(shù)據(jù)包改成你的exploit server。 然后當(dāng)用戶訪問了這個(gè)鏈接以后,你就可以去查看你的exploit server的log日志,可以發(fā)現(xiàn)重啟密碼的鏈接 在瀏覽器中用原來的域名訪問這個(gè)重置密碼鏈接 跳出重置密碼的頁面 根據(jù)host限制資源的訪問有時(shí)處于安全的考慮,會(huì)把某些功能限制成只能特定的IP或者h(yuǎn)ost頭訪問,那么通過修改host頭就可能繞過這個(gè)限制。 portswigger靶場:https://portswigger.net/web-security/host-header/exploiting/lab-host-header-authentication-bypass 訪問robots.txt發(fā)現(xiàn)存在admin頁面,直接訪問顯示拒絕 將host頭改成localhost可能正常訪問 在實(shí)際的利用中,往往需要fuzz host頭的內(nèi)容。 web緩存投毒當(dāng)存在Host頭攻擊的web站點(diǎn)不存在密碼重置的功能等場景時(shí),由于不可能驅(qū)使用戶去抓包修改Host頭,該漏洞就顯得沒有什么作用。 但是,如果目標(biāo)站點(diǎn)使用Web緩存,則可以通過緩存投毒給其他用戶提供帶有病毒的緩存響應(yīng)。此時(shí)的Host頭攻擊漏洞轉(zhuǎn)變?yōu)轭愃芚SS存儲(chǔ)型類的漏洞。要構(gòu)造Web緩存投毒攻擊:
下面結(jié)合portswigger上的實(shí)驗(yàn)來看一下 鏈接:https://portswigger.net/web-security/host-header/exploiting/lab-host-header-web-cache-poisoning-via-ambiguous-requests 打開這個(gè)實(shí)驗(yàn),可以看到,添加一個(gè)host頭,會(huì)返回在響應(yīng)中,而且啟用了web緩存功能,那么我們可以將host頭替換成我們服務(wù)上同名的文件:/resources/js/tracking.js 如下 多請求幾次,使此請求被緩存下來 此時(shí),其它用戶再去訪問該鏈接,就會(huì)訪問到這個(gè)已經(jīng)緩存的頁面,也就是可以造成類似于xss的漏洞。 基于host頭進(jìn)行路由有的應(yīng)用會(huì)根據(jù)host頭進(jìn)行路由,那么在這種情況下,我們可以通過改變host頭來訪問內(nèi)網(wǎng)的應(yīng)用,也就是常說的SSRF。 這可能需要知道內(nèi)部系統(tǒng)的IP地址(私有地址),一般可以通過信息收集或者Fuzz來判斷有效的私有IP地址(如枚舉192.168.1.1/16) 接下來還是看一下portswigger上面的實(shí)驗(yàn) 鏈接:https://portswigger.net/web-security/host-header/exploiting/lab-host-header-routing-based-ssrf 該實(shí)驗(yàn)已知內(nèi)網(wǎng)中存在admin頁面并且通過host頭進(jìn)行路由 直接訪問顯示404 爆破內(nèi)網(wǎng)IP嘗試訪問 成功訪問到內(nèi)網(wǎng)應(yīng)用
在portswigger還有一個(gè)實(shí)驗(yàn),校驗(yàn)了host頭的值,只要修改host的值就會(huì)拒絕服務(wù),此時(shí)可以將host頭放到path中,如下面這種
HTTP host頭繞過有時(shí)我們發(fā)現(xiàn)修改host頭時(shí)會(huì)受到限制,可以通過下面的方式進(jìn)行繞過 1)檢查限制是否有缺陷,例如沒有限制端口號(hào),只會(huì)驗(yàn)證是否以允許的子域結(jié)尾等等 2)注入多個(gè)host頭 如果服務(wù)器端會(huì)將第二個(gè)Host頭優(yōu)先于第一個(gè)Host頭,就會(huì)覆蓋掉它的值,然后中轉(zhuǎn)組件會(huì)因?yàn)榈谝粋€(gè)Host頭指定了正確的目標(biāo)而照常轉(zhuǎn)發(fā)這個(gè)請求包,這樣就能保證它可以順利到達(dá)服務(wù)器。
3)提供絕對URL
4)注入覆蓋Host頭的字段 與Host頭功能相近的字段,如X-Forwarded-Host、X-Forwarded-For等,這些有時(shí)候是默認(rèn)開啟的。
諸如此類,還有其他的字段:
5)添加縮進(jìn)或者換行 當(dāng)一些站點(diǎn)block帶有多個(gè)Host頭的請求時(shí),可以通過添加縮進(jìn)字符的HTTP頭來繞過
最簡單的方法是避免在服務(wù)器端代碼中使用前端獲取的host頭。 其他方法包括: 正確配置絕對域名URL 當(dāng)必須使用絕對域名URL時(shí),應(yīng)在配置文件中手動(dòng)指定當(dāng)前域的URL,并引用配置的值,而不是從HTTP的Host頭中獲取。這種方法可防止密碼重置的緩存投毒。 白名單校驗(yàn)Host頭的域 如果必須使用Host頭,需要正確校驗(yàn)它的合法性。這包括允許的域,并使用白名單校驗(yàn)它,以及拒絕或重定向?qū)o法識(shí)別的主機(jī)請求。這包括但不僅限于單個(gè)web應(yīng)用程序、負(fù)載均衡以及反向代理設(shè)備上。 不支持主機(jī)頭覆蓋 確保不適用與Host頭功能相近的字段,如X-Forwarded-Host、X-Forwarded-For等,這些有時(shí)候是默認(rèn)開啟的。 總結(jié)上面簡要介紹了一下HTTP報(bào)頭攻擊以及實(shí)際可能存在的場景,在實(shí)際的測試中遇到的比較少,常規(guī)漏洞已經(jīng)不多見的情況下,可以多測一下這方面的漏洞。 參考鏈接https://blog.csdn.net/angry_program/article/details/109034421 https://www.freebuf.com/articles/web/375432.html 閱讀原文:原文鏈接 該文章在 2025/5/14 9:08:12 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |