前言
今天来看一个比较有意思的漏洞-HTTP报头攻击,也就是host头攻击。在我们的印象中host头是我们所要访问的域名,默认是不可控的,因为一旦改变我们就不能正确访问目标地址。其实不然,在某些情况下,改变了host头依然可以访问目标。那么host头在某些情况下也是我们可以控制的输入,这也就为host头攻击提供了可能。
由于本人水平有限,文章中可能会出现一些错误,欢迎各位大佬指正,感激不尽。如果有什么好的想法也欢迎交流~~
什么是 HTTP Host 头?
重新再来认识一下什么是host头。
从 HTTP/1.1 开始,HTTP Host 头是一个必需的请求头,其指定了客户端想要访问的域名。例如我们访问百度,发送的请求如下,会包含一个host头。
HTTP头的作用
当我们在浏览器中输入一个网址时,首先会根据网址进行DNS解析,找到对应的IP地址,然后将请求发送到对应的IP地址。
我理解的域名与host头其实并不是一个概念,域名是我们在浏览器中输入要访问的地址,而host头是数据包中的一个值。
那么什么地方会用到http头呢?
1)虚拟主机根据HTTP头访问具体的业务。目前由于IPV4的地址已经耗尽,所以越来越多的应用对应同一个公网IP,这种情况下,就需要根据HTTP头来判断具体需要访问那个业务。
2)通过代理访问后端组件。域名的IP解析到代理的公网IP,然后代理在根据HTTP头来分配到具体的后端组件。我们经常使用的CDN也可以认为是这种情况。
HTTP头是否可以修改
答案当然是可以修改的,如下面在burp里面可以直接修改host头,修改host头以后还可以正常访问应用。
如下图,修改以后还可以正常访问
HTTP头攻击
HTTP Host 头攻击会利用以不安全的方式处理 Host 头的漏洞网站。如果服务器隐式信任 Host 标头,且未能正确验证或转义它,则攻击者可能会使用此输入来注入有害的有效负载,以操纵服务器端的行为。将有害负载直接注入到 Host 头的攻击通常称为 "Host header injection"(主机头注入攻击)。
上面我们已经了解到就算改变了HTTP报头也是可以正常访问到应用的,那么如果后端使用HTTP报头,并且没有做过滤,那么就有可能造成危害。
HTTP报头可能得攻击场景
HTTP报头攻击可能存在以下的利用场景
1)重置密码或者注册用户登场景发送重置链接取HTTP报头的值
2)根据host头限制一些资源的访问
3)系统启用了web缓存功能,可以利用web缓存投毒
4)根据host头进行路由(基于路由的SSRF)
在portswigger上有关于http host攻击的专题,如下:
链接:https://portswigger.net/web-security/all-labs#http-request-smuggling
类似密码重置场景攻击
几乎所有需要登录的网站都实现了下面的场景。下面以密码重置来简要概述这个场景
- 用户输入用户名或电子邮件地址,然后提交密码重置请求。
- 网站检查该用户是否存在,然后生成一个临时的、唯一的、高熵的 token 令牌,并在后端将该令牌与用户的帐户相关联。
- 网站向用户发送一封包含重置密码链接的电子邮件。用户的 token 令牌作为 query 参数包含在相应的 URL 中,如 https://normal-website.com/reset?token=0a1b2c3d4e5f6g7h8i9j。
- 当用户访问此 URL 时,网站会检查所提供的 token 令牌是否有效,并使用它来确定要重置的帐户。如果一切正常,用户就可以设置新密码了。最后,token 令牌被销毁。
与其他一些方法相比,这个过程足够简单并且相对安全。然而,它的安全性依赖于这样一个前提:只有目标用户才能访问他们的电子邮件收件箱,从而使用他们的 token