一、背景:
web程序需要知道網站的域名比較麻煩,需要使用HTTP的 host頭字段:
1 <?php _SERVER["HTTP_HOST"] ?>
1 @app.route("/index/",methods=["GET"]) 2 def index: 3 domain = request.headers.get("Host")
等等......
而且有些會把這個值不做HTML編碼直接輸出到頁面:Joomla、Django、Gallery、others
二、常見的三種攻擊行為:
1、密碼重置:
郵件重置密碼時,劫持了郵件的內容,將host替換掉,然后用戶點擊發起鏈接的事后,身份認證信息(這里一般指的是網站傳給重置密碼者的隨機token)會自動傳到惡意的host上面,從而導致攻擊者可以劫持賬戶(已知身份認證信息)。
2、緩存污染:
Apache看所有host,nginx看最后一個host,Varnish看第一個。
所以可以通過在一個請求報文中加多個不同的host來污染緩存。
(現有架構下比較難攻擊)因為之前的緩存節點可能污染區別host頭,但現在的緩存一般都可以識別host頭。
1 ''' 2 GET /index.html HTTP/1.1 3 Host: www.baidu.com 4 5 GET /index.html HTTP/1.1 6 Host: www.google.com 7 '''
這兩種是絕對不會搞錯的
3、跳轉釣魚
web開發程序重定向時候:
例如未登錄訪問頁面會跳轉回登錄頁面,而開發人員是無法得知自己開發的站點上線后的域名的,所以一般都是host獲取。如果你重定向到登錄頁面所使用的HOST被攻擊者污染了,改成了他的,很相似的域名,也轉到仿造的一模一樣的頁面,用戶再次輸入密碼,就會被盜取。
三、防御:
1、配置web程序使用server_name而不是host頭
2、維護一個host白名單,難度較大。
3、UseCanonicalName選項開啟。