Http请求头信息里面会带有一个Host字段,这个字段是做什么的?
我们知道一个IP可以对应多个域名,而一般一个服务器上放多个网站也是很常见的,那么就会有一个问题,我们的多个域名都解析到了同一台服务器上,怎么每次根据域名显示不同的网站内容呢?
Host头就出现了,我们通过它可以区分访问的是哪个网站,也就是说web服务器使用Host头的值来将请求分派到指定的网站或web应用程序之上。
POST /wxyh/Login.jsp HTTP/1.1
Host: x.x.x.x:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: application/json, text/javascript, */*; q=0.01
因为Host头是来自客户端的,这意味着用户可以随意修改,那么如果网站过于信任Host头的值,没有以安全的方式进行处理的话,就容易遭受攻击。这种攻击最常见可以造成Web缓存投毒、业务逻辑缺陷(如密码重置)、SQL注入等漏洞。
我们来看一个的案例,系统以www.test.com来代替。这个系统的密码找回功能有两种方式,一种是通过短信验证码,一种是通过邮箱,我们看邮箱这种情况。填写任意用户邮箱后提交请求,在此过程中使用Burp抓包,将Host头改为我们的服务器地址。
本来发往用户邮箱的链接应该是:http://www.test.com/resetPassword/checkEmail