HTTP 主机头攻击

HTTP 主机头攻击

在本节中,我们将讨论错误配置和有缺陷的业务逻辑如何通过 HTTP Host 标头将网站暴露于各种攻击。我们将概述识别易受 HTTP Host 标头攻击的网站的高级方法,并演示如何利用它。最后,我们将就如何保护自己的网站提供一些一般性指导。

实验室

如果您已经熟悉 HTTP Host 标头漏洞背后的基本概念,并且只想练习在一些现实的、故意易受攻击的目标上利用它们,您可以从下面的链接访问本主题中的所有实验。

查看所有 HTTP 主机标头实验室

什么是 HTTP 主机标头?

从 HTTP/1.1 开始,HTTP Host 标头是强制性的请求标头。它指定客户端要访问的域名。例如,当用户访问 时https://portswigger.net/web-security,他们的浏览器将编写一个包含 Host 标头的请求,如下所示:

GET /web-security HTTP/1.1
Host: portswigger.net

在某些情况下,例如当请求已由中间系统转发时,Host 值可能会在到达预期的后端组件之前被更改。我们将在下面更详细地讨论这种情况。

HTTP Host 标头的用途是什么?

HTTP Host 标头的目的是帮助识别客户端想要与哪个后端组件通信。如果请求不包含 Host 标头,或者 Host 标头以某种方式格式错误,则可能会导致将传入请求路由到预期应用程序时出现问题。

从历史上看,这种模糊性并不存在,因为每个 IP 地址只能托管单个域的内容。如今,很大程度上由于基于云的解决方案和外包许多相关架构的不断增长的趋势,多个网站和应用程序可以通过同一个 IP 地址访问是很常见的。这种方法也越来越受欢迎,部分原因是 IPv4 地址耗尽。

当多个应用程序可以通过同一个 IP 地址访问时,这通常是以下情况之一的结果。

虚拟主机

一种可能的情况是单个 Web 服务器托管多个网站或应用程序。这可以是拥有一个所有者的多个网站,但也可以将拥有不同所有者的网站托管在一个共享平台上。这不像以前那么常见,但仍然会出现在一些基于云的 SaaS 解决方案中。

在任何一种情况下,尽管这些不同的网站中的每一个都有不同的域名,但它们都与服务器共享一个公共 IP 地址。以这种方式托管在单个服务器上的网站称为“虚拟主机”。

对于访问网站的普通用户来说,虚拟主机通常与托管在其自己的专用服务器上的网站无法区分。

通过中介路由流量

另一种常见的情况是网站托管在不同的后端服务器上,但客户端和服务器之间的所有流量都通过中间系统路由。这可能是一个简单的负载均衡器或某种反向代理服务器。在客户端通过内容交付网络 (CDN) 访问网站的情况下,这种设置尤其普遍。

在这种情况下,即使网站托管在不同的后端服务器上,它们的所有域名都会解析为中间组件的单个 IP 地址。这带来了一些与虚拟主机相同的挑战,因为反向代理或负载均衡器需要知道它应该将每个请求路由到的适当后端。

HTTP Host 标头如何解决这个问题?

在这两种情况下,都依赖 Host 标头来指定预期的收件人。一个常见的类比是给住在公寓楼里的人寄信的过程。整栋大楼都有相同的街道地址,但在这个街道地址后面有许多不同的公寓,每个公寓都需要以某种方式接收正确的邮件。解决此问题的一种方法是简单地在地址中包含公寓号码或收件人姓名。对于 HTTP 消息,Host 标头用于类似的目的。

当浏览器发送请求时,目标 URL 将解析为特定服务器的 IP 地址。当该服务器接收到请求时,它会参考 Host 标头来确定预期的后端并相应地转发请求。

什么是 HTTP 主机标头攻击?

HTTP Host 标头攻击利用易受攻击的网站以不安全的方式处理 Host 标头的值。如果服务器隐式信任 Host 标头,并且无法正确验证或转义它,则攻击者可能能够使用此输入来注入操纵服务器端行为的有害有效负载。涉及将有效负载直接注入主机标头的攻击通常称为“主机标头注入”攻击。

现成的 Web 应用程序通常不知道它们部署在哪个域上,除非在设置期间在配置文件中手动指定它。当他们需要知道当前域时,例如,要生成包含在电子邮件中的绝对 URL,他们可能会求助于从 Host 标头中检索域:

<a href="https://_SERVER['HOST']/support">Contact support</a>

标头值也可用于网站基础设施的不同系统之间的各种交互。

由于 Host 标头实际上是用户可控制的,因此这种做法可能会导致许多问题。如果输入未正确转义或验证,则 Host 标头是利用一系列其他漏洞的潜在载体,最明显的是:

  • Web缓存中毒
  • 特定功能中的 业务逻辑缺陷
  • 基于路由的SSRF
  • 经典的服务器端漏洞,例如 SQL 注入

HTTP Host 标头漏洞是如何产生的?

HTTP 主机标头漏洞通常是由于标头不是用户可控制的有缺陷的假设而出现的。这会在 Host 标头中创建隐式信任,并导致验证不充分或对其值进行转义,即使攻击者可以使用 Burp Proxy 等工具轻松修改它。

即使 Host 标头本身被更安全地处理,根据处理传入请求的服务器的配置,主机也可能通过注入其他标头而被覆盖。有时网站所有者不知道默认情况下支持这些标头,因此,它们可能不会受到相同级别的审查。

事实上,许多这些漏洞的出现并不是因为编码不安全,而是因为相关基础设施中一个或多个组件的配置不安全。这些配置问题可能会发生,因为网站将第三方技术集成到其架构中,而不必了解配置选项及其安全含义。

利用 HTTP 主机头漏洞

至此,您应该已经很好地理解了 HTTP Host 标头是什么。对于渗透测试者和漏洞赏金猎人,我们创建了一些额外的指南,说明您如何为自己识别和利用这些类型的漏洞。我们还提供了一些故意易受攻击的LABS,以便您可以练习其中一些技术。

如何防止 HTTP 主机头攻击

为了防止 HTTP Host 标头攻击,最简单的方法是避免在服务器端代码中完全使用 Host 标头。仔细检查每个 URL 是否真的需要是绝对的。您经常会发现您可以只使用相对 URL。这个简单的更改可以帮助您特别防止Web 缓存中毒漏洞。

其他防止 HTTP 主机头攻击的方法包括:

保护绝对 URL

当您必须使用绝对 URL 时,您应该要求在配置文件中手动指定当前域,并引用此值而不是 Host 标头。例如,这种方法将消除密码重置中毒的威胁。

验证主机标头

如果必须使用 Host 标头,请确保正确验证它。这应该涉及根据允许域的白名单检查它,并拒绝或重定向任何对无法识别的主机的请求。您应该查阅框架的文档以获取有关如何执行此操作的指导。例如,Django 框架ALLOWED_HOSTS在设置文件中提供了选项。这种方法将减少您遭受主机标头注入攻击的风险。

不支持主机覆盖标头

检查您是否不支持可能用于构建这些攻击的其他标头也很重要,特别是X-Forwarded-Host. 请记住,默认情况下可能支持这些。

白名单允许的域

为了防止对内部基础设施的基于路由的攻击,您应该配置负载均衡器或任何反向代理,以仅将请求转发到允许域的白名单。

小心使用仅限内部的虚拟主机

使用虚拟主机时,您应避免在同一服务器上托管仅供内部使用的网站和应用程序作为面向公众的内容。否则,攻击者可能能够通过主机头操作访问内部域。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值