作者:Monyer
链接:https://www.zhihu.com/question/67477221/answer/254009089
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这本来是个简单得不能再简单的漏洞。不过遵循题主的诉苦,我去网上找了一圈,的确发现没有一个能把这个问题说清楚,把解决方案讲明白的。遂决定回答一下。
首先要明白这个漏洞的产生原因,你得了解HTTP协议。HTTP请求头的大概构造,类似这样:
GET / HTTP/1.1
Host: http://example.com
而服务端代码有时候需要取这个host信息来使用。譬如拼装url输出到浏览器端(有可能产生XSS问题),拿到数据库去查询相关数据(有可能产生SQL-IN问题),或者拼装个email地址什么的(参见wordpress密码重置漏洞产生原因)。
我们知道“所有的用户输入都是有害的”。这个客户端提交的http头显然host后面的字符串可以随便修改。那么服务端如果应用了不可靠的host头,又有一些不安全的利用,那么就会产生一个漏洞。
正常情况下,一个网站总要有一个ip和域名,二者在dns服务商绑定后。访问域名,绑定的ip会通过dns查询出来,浏览器会自动和对应ip的服务器发起交互。
但是如果直接通过ip去访问网站会发生什么情况呢?如果是按照默认配置建立的站点,通过ip访问将达到和通过域名访问一样的效果。这个道理估计你们都懂。
但如果另有一个域名与你服务器的ip在dns处做绑定呢?很明显也会正常访问到你的网站(可以通过在本机hosts设置手动域名解析,来模拟这个效果)。这个就是host头攻击漏洞产生原因。
那么知道原因,修复也就容易了。
我们都见过一台服务器一个ip创建了多个站点绑定了不同域名的情况,这叫虚拟主机技术。不管是apache还是nginx,通过配置都能轻松实现。
很明显在这种配置下,我们再伪造一个域名访问目标服务器将无法成功,因为服务器没配置和绑定其他域名,不知道你要访问哪个虚拟主机,这样host头攻击漏洞也就算是修复和防御了。
对于apache来说,配置一个虚拟主机大概要这样:
<VirtualHost *:80>
DocumentRoot 网站物理根路径
ServerName http://www.domain.com
</VirtualHost>
还有一些复杂的参数参见互联网(其他服务器如nginx、lighttpd也参加互联网)。如果搜索apache虚拟主机配置搜不到,你就去搜apache多站点配置。
不要被扫描器那些扫描结果吓倒,它们只要发现可以用自定义host头访问就会给你报漏洞。实际上还要结合具体网站应用的实现,才能说明是否存在漏洞。
同时也不要被那些高深莫测的解决方案蒙到,蒙到你他们才有钱赚。
所以我这一篇幅下来,你是否已经全明白了呢?
标签:Http,访问,ip,Hostname,域名,漏洞,host,服务器 From: https://www.cnblogs.com/cnhk19/p/17664719.html