http1.0是没有host字段的,http1.1在http1.0的根本之上增加了TCP长连接之外,还增加了更多的要求头和相应头来改进和扩充http1.0的功能,个中包括在要求头增加host字段。
试想在一台主机中创建了三台阿虚拟机,三台虚拟机各自运行了独立的网站运用1.com、2.com、3.com,我们都知道一个IP地址是可以对应多个域名的,以是我们可以在DNS做事器上创建三条A记录
1.com 指向1.1.1.1
2.com 指向1.1.1.1
3.com 指向1.1.1.1
三个域名都利用同一个公网IP(1.1.1.1)对外供应做事.
当用户浏览器访问1.com的时候,通过DNS解析,终极源站能看到的不是域名,而是1.1.1.1,那么问题来了,源站怎么知道用户访问的详细是这个主机里边的哪个运用呢?
http1.1引入host观点,可以通过host来区分用户访问的是虚拟机上的哪个站点。
有人会问一个问题:这种方法跟我利用IP+端口的办法指定运用有什么差异?比如通过配置1.1.1.1:80访问1.com,1.1.1.1:81访问2.com,1.1.1.1:82访问3.com,同样可以实现上述功能。
不同之处在于——通过host指定运用,你可以用相同的IP+端口访问不同的运用,即1.com、2.com、3.com都利用1.1.1.1:80这个IP和端口,这就给虚拟机支配多个运用供应了极大扩展空间,比如我还可以连续支配4.com、5.com等,而不必担心端口问题。
二、host字段小结
1.host字段可以是域名,也可以是ip地址。host字段域名/ip后可以跟端口号,如host: www.1.com:80
2.host可以由程序自定义,某些程序为了防止运营商或防火墙拦截会定义虚假host,由于http头中的host字段可以由程序自定义,以是host字段的值就会有很多分外情形,如包含多个’/'字符的HOST头信息,结尾含有”.”等。
3.http1.1中host字段可以是空值,但是不能缺失落host字段,如果缺失落,做事器返回400 bad request,http1.0中可以缺失落host字段
4.http相应头(response header)中不包含host字段,以是wireshark中http host过滤到的都是要求包
5. host字段和referer有何差异?
host字段定义的是源站的做事,refer定义的是访问来源
三、host攻击办法
为了方便获取网站域名,开拓职员一样平常依赖于要求包中的Host首部字段。例如,在php里用_SERVER[“HTTP_HOST”]。但是这个Host字段值是不可相信的(可通过HTTP代理工具修改),如果运用程序没有对Host字段值进行处理,就有可能造成恶意代码的传入。
结合这张图,php开拓框架下,当主机收到了1.1.1.1这个IP地址,程序员直策应用了_SERVER[“HTTP_HOST”]这个参数,直接代入了host字段的值。详细可以造成什么样的后果呢?可以参考以下这个案例
利用host攻击实现重置密码中毒
在讲如何进行攻击前,为了把握关键点,先来理解用邮箱进行密码重置的大致流程:
1.用户通过提交注册时利用的邮箱奉告做事器进行密码重置;
2.做事器进行匹配确认该用户真实存在后,会天生一个独一无二的令牌,该令牌将会与当前须要重置密码的用户进行绑定;
3.接着做事器将会发送一封确认重置密码要求的邮件到该用户的邮箱,邮件内有一个含有之前天生的令牌的URL;
4.用户点击该URL进行确认;
5.做事器将检讨提交的令牌参数,精确无误后将会天生密码重置表单让用户进行密码重置;
理解以上流程后就能创造,令牌充当的是信物的浸染,并且密码重置逻辑能够实现的根本为:含有令牌的URL只有重置密码的用户才能得到
在Host存在漏洞的情形下,我们先用自身拥有的账号提交密码重置要求,抓包后修正用户主体为目标用户以及将Host指向受我们掌握的域名做事器。这样一来,我们就能直接得到目标用户重置密码须要的令牌。
1、先到重置密码页面输入自己的用户名或账号,点击提交,得到重置密码的精确url格式备用。
2、本人邮箱收到密码重置邮件,得到精确的重置密码url格式
3、根据抓包获取的信息进行添补,把host字段修正为任意值
4、转头检讨邮箱,创造仍旧可以收到密码重置邮件,解释程序没有对host字段做严格验证
5、接下来把须要重置密码的邮箱修正为目标用户carlos,修正host为我们自己掌握的做事器域名,这时系统会触发针对目标用户carlos的密码重置,源站做事器会天生一个carlos的密码重置令牌,并与host指定的域名进行交互
6、返回我们自己掌握的做事器查看访问日志,得到目标用户carlos的令牌token
7、这里有之前重置自己的账号收到的邮件,把红框里边的token更换成目标用户的token,布局出一个全新的url
8、点击url弹出新页面,进行密码重置,得到目标用户carlos的访问权限。
以上仅仅展示host攻击的一种详细表现形式,其他的攻击办法还有很多,这里所展示的攻击不代表你找一个网站就能轻易复现,毕竟这种攻击办法已经烂大街了,网站运营方不可能连这点基本的防护能力都没有,不过站在理解host攻击的办法角度,这个案例还是有代价的。
四、host攻击防护建议
1.源站配置
Host攻击的防护实质在于要对用户提交的host字段在源站侧做验证。
比如在nginx框架下修正以下配置:
Server{
Listen 8888 default;
Server_name www.abc.com;
Location / {
Return 403
}
}
添加了一个默认server www.abc.com,当host头匹配不到精确的server时就跳转到该默认的server,该server直接返回403缺点。
重启nginx。
2. 网宿防护做事
CDN因此host字段携带的域名作为要求域名的,CDN收到用户访问要求后会去验证host携带的域名是否有做配置,如果host字段的内容与CDN域名配置界面的内容不匹配,则该用户无法访问。