承接上文,记录的url不一致极大可能就是Host头攻击,所以本章内容围绕Host头攻击展开,讲述Host头攻击的原理、实践、和防御,让大家能对Host头攻击有足够的认识。
1. Host头原理
1.1 HTTP头——Host
众所周知HTTP报文由报文首部、空行(CR+LF)和报文主体组成,在报文首部中有一个字段,在具体是请求报文的首部字段:Host。
首部字段Host会告知服务器,请求的资源所处的互联网主机名和端口号。Host首部字段在HTTP/1.1规范内是唯一一个必须被包含在请求内的首部字段。
首部字段Host和以单台服务器分配多个域名的虚拟主机的工作机制有密切的关联,这是首部字段Host必须存在的意义。请求被发送至服务器时,请求中的主机名会用IP地址直接替换解决,但如果这时,相同的IP地址下部署运行着多个域名,那么服务器就会无法理解究竟是那个域名对应的请求。因此,就需要使用首部字段Host来明确指出请求的主机名。
我在本地打开了我的CuteKe网站,用chrome浏览器访问主页,看一下请求里面的Host,如下图1所示:
1.2 Host头攻击样例
上面的例子都是Host正常的例子,如果我们在请求的时候修改Host的值后果会怎么样呢?服务器能不能识别呢?让我们来看一下下面几种Host头攻击的实例
攻击样例主要来自参考资料2,我这边就直接引用并简单地讲述一下,想进一步了解的话,可以访问原网站
1.2.1 密码重置污染攻击
核心:生成url会用到Host,或者说利用请求头里面的Host字段来生成url,例如在生成密码重置链接的时候,如下图2所示:
对应的用户请求头为:
POST /password/reset HTTP/1.1
Host: evil.com
.....
1.2.2 缓存污染
上面一个例子是服务器出错,那针对缓存服务器呢?就要用到缓存污染了,其实这种攻击还是比较困难的,因为现在的缓存设备能够识别Host,他们不会弄混淆。所以我在这里就不具体讲述了,详情请看参考资料2。
2. HOST头攻击实践
让我们尝试一下攻击一下本地的CuteKe网站,本地的CuteKe网站的地址为:http://localhost,访问这地址以后会重定向到http://localhost/index,然后再重定向到http://localhost/blogs,我们使用postman来完成Host攻击,分别针对:http://localhost和http://localhost/blogs来进行Host攻击,两者主要区别主要是重定向问题:
-
-
在postman里面添加Host头:www.baidu.com:80,然后访问,如图所示:
-
可以能正确返回CuteKe网站里面的首页的内容
-
-
-
同样也在postman里面添加Host头:www.baidu.com:80,然后访问,如图所示:
-
这次返回的就有点奇怪了,为啥是页面不存在_百度搜索呢,因为在重定向的时候会自动使用Host的值+重定向地址,这里面重定向的最终地址为:http://www.baidu.com:80/index,所以会返回页面不存在的提示。
-
-
最后让我们来看看后台记录的地址,如图所示:
也就是上篇文章出现的情况了
3. HOST攻击防御
主要两种方式来避免:
- 服务器配置的时候指定Host,例如Tomcat里面配置。
- 编程时过滤掉那些修改过Host头的请求,例如Filter里面白名单和黑名单机制。
一般来说只要不在页面生成的时候使用Host字段,就不会出现问题,例如我这种主页两次重定向的方式,也不会出现大的错误。 这两种情况的具体方式可以阅读参考资料3
4. 参考资料
[1] 图解HTTP
[2] 利用HTTP host头攻击的技术 – 龙臣
[3] URL存在http host头攻击漏洞-修复方案