HTTP Host标头攻击
Last updated
Last updated
在本节中,我们将讨论错误的配置和有缺陷的业务逻辑,是如何使网站通过HTTP主机标头受到各种攻击。我们将概述识别易受HTTP Host标头攻击的网站的高级方法,并展示如何利用这种攻击进行以下类型的攻击:
密码重置投毒
Web缓存投毒
利用经典的服务器端漏洞
绕过认证
虚拟主机暴破
基于路由的SSRF
连接状态攻击
LAB
如果你已经熟悉HTTP Host标头漏洞背后的基本概念,并且只想在一些真实的、故意易受攻击的目标上练习利用这些漏洞,你可以从下面的链接访问本主题的所有实验。
HTTP Host标头是HTTP/1.1中的一个强制性请求标头。它指定了客户端要访问的域名。例如,当用户访问https://portswigger.net/web-security
时,他们的浏览器将构成一个包含Host标头的请求,如下所示:
在某些情况下,例如当请求通过中间系统转发时,Host值在到达预期的后端组件之前可能会被更改。我们将在下面详细讨论这种情况。
HTTP Host标头存在的意义是,帮助识别客户端希望与之通信的后端组件。如果请求不包含Host标头,或者Host标头以某种方式格式错误,这可能导致在将传入的请求路由到预期的应用程序时出现问题。
历史上,这种歧义并不存在,因为每个IP地址只托管一个域名的内容。然而在如今,由于基于云的解决方案和外包相关架构的不断增长趋势,多个网站和应用程序在同一个IP地址上访问变得很常见。部分原因也是由于IPv4地址的枯竭。
当多个应用程序通过同一IP地址被访问时,通常是由于以下几种情况之一。
一种可能的情况是,单个Web服务器托管多个网站或应用程序。这可以是一个所有者的多个网站,也可以是不同所有者的网站在单个共享平台上托管。这种情况不如以前常见,但在一些基于云的SaaS解决方案中仍然存在。
在任何一种情况下,尽管这些不同的网站都有不同的域名,但它们都与服务器共享一个公同的IP地址。在单个服务器上以这种方式托管的网站被称为“虚拟主机”。
对于正常访问网站的用户来说,虚拟主机通常与在专用服务器上托管的网站无法区分。
另一种常见的情况是,当网站托管在不同的后端服务器上,但客户端和服务器之间的所有流量都通过中间件系统路由。这可以是一个简单的负载均衡器或某种反向代理服务器。在客户端通过内容分发网络(CDN)访问网站的情况下,这种设置尤为普遍。
在这种情况下,尽管网站托管在不同的后端服务器上,但它们所有的域名都解析到中间件的单个IP地址。这与虚拟托管提出了一些相同的挑战,因为反向代理或负载均衡器需要知道它应该将每个请求路由到哪个适当的后端。
在这两种情况下,Host标头被依赖来指定预期的接收者。一个常见的比喻是向公寓楼的某人寄信。整栋大楼都有相同的街道地址,但是在这个街道地址后面,有许多不同的公寓需要以某种方式收到正确的邮件。解决这个问题的一个办法就是在地址中包含公寓号或收件人的名字。放在HTTP消息的情况中,Host标头起到了类似的作用。
当浏览器发送请求时,目标URL将解析为一个特定服务器的IP地址。当此服务器接收到请求时,它会参考Host标头来确定预期的后端,并相应地转发请求。
HTTP Host标头攻击利用处理Host标头值不安全的易受攻击网站。如果服务器隐式信任Host标头,并且未正确验证或转义其值,攻击者可能能够使用此输入注入有害payload,以操纵服务器端行为。涉及将payload直接注入Host标头的攻击通常称为“Host标头注入”攻击。
现成的Web应用程序通常不知道它们部署在哪个域名上,除非在设置过程中在配置文件中手动指定。当它们需要知道当前域名时,例如生成一个包含在电子邮件中的绝对URL,可能会使用Host标头获取域名:
标头值还可能用于网站基础架构的不同系统之间的各种互动。
由于Host标头实际上是用户可控的,这种做法可能导致许多问题。如果输入没有正确转义或验证,Host标头可能是利用一系列其他漏洞的潜在载体,尤其是:
Web缓存投毒
特定功能中的业务逻辑缺陷
基于路由的SSRF
经典的服务器端漏洞,如SQL注入
HTTP Host标头漏洞通常是由于错误地认为标头不受用户控制而产生的。这导致了对Host标头的隐式信任,以及对其值的验证或转义不足,尽管攻击者可以使用像Burp Proxy这样的工具轻松修改这个值。
即使Host标头本身处理得比较安全,但根据处理传入请求的服务器配置,Host可能会通过注入其他标头来覆盖。有时,网站所有者可能不知道这些标头是默认支持的,因此,它们可能没有受到同等程度的审查。
事实上,这类漏洞的出现,很多不是因为不安全的编码,而是因为相关基础设施中的一个或多个组件的不安全配置。这些配置问题可能是因为网站在其架构中整合了第三方技术,而没有充分了解配置选项及其安全影响。
到现在为止,你应该对HTTP Host标头有了很好的了解。对于渗透测试人员和漏洞赏金猎人,我们就如何识别和利用此类漏洞为你提供了一些补充指南。我们还提供了一些故意易受攻击的实验,以便你练习这些技巧。
阅读更多
为防止HTTP Host标头攻击,最简单的方法是,在服务器端代码中完全避免使用Host标头。仔细检查每个URL是否确实需要是绝对的。你经常会发现,相对URL就足够了。这一简单的更改可以帮助你防止Web缓存投毒漏洞。
防止HTTP Host标头攻击的其他方法包括:
保护绝对URL
当你必须使用绝对URL时,应该要求在配置文件中手动指定当前域,并引用此值而不是Host标头。这种方法将消除密码重置投毒的威胁。
验证Host标头
如果你必须使用Host标头,请确保正确地验证它。这应包括将其与允许的域名白名单进行比较,并拒绝或重定向任何不受认可的主机请求。你应该查阅框架的文档,了解如何执行此操作。例如,Django框架在设置文件中提供了ALLOWED_HOSTS
选项。这种方法将减少你暴露于Host标头注入攻击的风险。
不支持Host覆盖标头
同样重要的是,检查你是否支持可能用于构造这些攻击的其他标头,尤其是X-Forwarded-Host
。请记住,这些可能是默认支持的。
将允许的域名列入白名单
为防止对内部基础设施进行基于路由的攻击,你应配置负载均衡器或任何反向代理仅将请求转发到允许的域名白名单。
对仅内部的虚拟主机要小心
在使用虚拟主机时,你应该避免将仅内部使用的网站和应用程序与面向公共的内容托管在同一台服务器上。否则,攻击者可能通过Host标头操纵访问内部域。