日期:2018-03-06 14:32:51
作者:Bay0net
0x01、 前言
在一般情況下,幾個網站可能會放在同一個服務器上,或者幾個 web 系統共享一個服務器,host 頭來指定應該由哪個網站或者 web 系統來處理用戶的請求。
0x02、密碼重置漏洞
#!php
$user -> hash = random::hash() ;
$message -> confirm_url = url::abs_site("password/do_reset?key=$user->hash") ;
漏洞存在於 url::abs_site
這一部分使用的Host header是來自用戶重置密碼的請求,攻擊者可以這么來攻擊
- 攻擊者向服務器發送一個帶有 attacker-controlled 的 host 頭類型的密碼重置
- 服務器在生成密碼重置的 key 時,會把攻擊者操控的 host 也放到密碼重置鏈接中。
- 用戶如果點擊了密碼重置鏈接,那么攻擊者就能得到密碼重置的 key,從而重置用戶密碼。
0x03、緩存污染
Varnish 是通過最先到達的請求的host header來辨別host的,
Apache 是看所有請求的host,
Nginx 只是看最后一個請求的host。
攻擊方法
GET / HTTP/1.1
Host: example.com
Host: alert(xss)
可以用上面這種方法,來欺騙 Varnish
,達到污染的目的。
攻擊者提交上面的請求之后,緩存服務器會把數據放到緩存中,有人再訪問 example.com 時,服務器會把 alert(xss)
也返回給用戶。
0x04、修復方案
在服務器端判斷 host 的值,設置白名單,不在白名單內的直接403