概括
典型的 Web 应用程序使用超文本传输协议 (HTTP) 进行通信。HTTP 中有多种属性,称为标头(对于请求和响应),它们都有其重要性,并且 HTTP 标头中的所有属性都应出于通信目的进行安全配置。通常,HTTP 标头中的大多数属性在 Web 服务器中配置错误,这使得整个 HTTP 通信容易受到各种网络攻击。
HTTP 主机标头是经常配置错误的 HTTP 标头属性之一,它可能会导致潜在的威胁,称为主机标头注入。在这篇文献中,作者展示了如何利用 HTTP 主机标头,其中 Web 服务器配置错误,导致 Web 服务器响应恶意 HTTP 请求,而不识别 HTTP(S) 请求(主机标头)的来源被制成。在本文献中,作者还展示了如何检查 Web 服务器上的传入流量的来源或 HTTP 主机标头,并在请求不是来自白名单来源的情况下拒绝相同的流量。
关键词: 主机头注入攻击、HTTP 请求头和 HTTP 响应头、X-Forwarded-Host 头、防止主机头注入
介绍
在本节中,作者从头开始解释了为了理解主机头注入攻击而应正确理解的背景概念,例如 HTTP 基础知识 [1]、HTTP 版本、HTTP 状态代码、HTTP 方法、HTTP 标头。所有 Web 应用程序都使用 HTTP 进行通信。HTTP 代表超文本传输协议,它基于客户端-服务器架构。HTTP 协议通常用于通过 Internet 访问资源。图 1 显示了典型的客户端-服务器架构,其中客户端向服务器请求一些资源,服务器处理请求并以响应的形式为客户端提供服务。
图 1. 客户端-服务器架构
HTTP 版本
HTTP 协议基本上有三个版本:HTTP 1.0、HTTP 1.1 和 HTTP 2。
HTTP 版本 1.0:标记为 HTTP/1。它是旧版本,可能被视为过时。在此框架中,对于每个资源,都会通过万维网向服务器发出新请求,然后连接保持关闭。
HTTP 版本 1.1:标记为 HTTP/1.1。目前运行的大多数 Web 应用程序都使用 HTTP 1.1 版本进行通信。它使用单个连接通过万维网多次向服务器请求资源。
HTTP 版本 2:标记为 HTTP/2[2]。此版本的 HTTP 由 Google 开发,是万维网上 HTTP 协议的主要修订版。HTTP 版本 1.1 中有几个主要问题,例如队头阻塞,这意味着当客户端发出多个请求时,它会以同步方式或先到先到服务器的方式获取服务器,队列中稍后发出的请求必须等待直到先前的请求得到服务器的响应。
由于 HTTP 是一种用于识别请求的无状态协议,因此需要将某些标头发送到服务器,这会导致请求标头出现冗余,并且一次又一次地传输,所有这些主要问题都在 HTTP 2 中得到解决。在 HTTP 2 中,单个 TCP 连接本身通过多路复用为多个 HTTP 请求提供服务。HTTP 2 使用 HPACK 压缩技术来压缩 HTTP 标头,使用该技术在请求之间共享 HTTP 标头。现在大多数浏览器都支持 HTTP 2,HTTP 2 将在未来几年缓慢而稳定地成为万维网通信的主流协议。
HTTP 状态代码
当浏览器向服务器发送请求时,服务器会响应 HTTP 状态码[3],该状态码为 3 位数字,具有一定的含义。
1xx:以 1 开头的代码在连接仍在进行时提供一些信息。
100 - 继续,101 - 切换,103 - 检查点
2xx:以2开头的代码表示连接成功。
200 - 确定,201 - 已创建,202 - 已接受,203 - 非权威信息,204 - 无内容。
3xx- 以 3 开头的代码表示重定向,例如 301 - 永久移动,302 - 找到
4xx- 以 4 开头的代码表示存在一些客户端错误,例如 400- Bad Request、401- Unauthorized [客户端无权执行 c/o 操作]、403- Forbidden [客户端无权访问资源], 404 - 未找到 [客户端在服务器中查找的资源不存在]。
5xx - 以 5 开头的代码表示存在服务器端错误。500- 内部服务器错误、502- 网关错误、503- 服务不可用、504- 网关超时、505- HTTP 版本不受支持。
HTTP 方法:HTTP 方法[4] 是客户端想要发送的一种请求类型。以下是常用的 HTTP 方法。
GET——从服务器获取信息。
HEAD - 获取有关资源标头的信息。
POST- 将数据发送到服务器进行处理。
PUT- 将数据存储在服务器上,与 GET 相反,根据安全指南,它被标记为不安全的方法。
选项 - 它用于识别或获取有关服务器支持哪些 HTTP 方法的信息。
DELETE - 此方法用于从服务器中删除资源或数据,根据安全指南,此方法也被标记为不安全方法。
什么是 HTTP 标头?
HTTP 标头[5] 允许客户端和服务器通过 HTTP 请求或响应传递附加信息。HTTP 标头由不区分大小写的名称定义,后跟冒号 (:) 后跟其值示例,主机:www.test.com
根据上下文,标头可以分为四种类型,定义如下:
1. General Headers:保存有关HTTP请求和响应的附加信息,但与内容本身无关。
2. 请求头:保存有关HTTP请求的附加信息,与消息内容无关。
3. 响应头:保存有关HTTP响应的附加信息,它也与消息的内容无关。
4. 实体标头:它们在 HTTP 请求或响应中用于描述消息的内容。
图 2 显示了 Format Request 和 Response 消息格式的表示。唯一的区别在于第一个字段,即在请求消息格式中,第一个字段是请求行,而在响应消息格式中,第一个字段是响应行。
图 2. HTTP 请求和响应消息格式。
有各种不同的 HTTP 标头,在本文中作者将仅讨论 HTTP 主机标头和 HTTP X-Forwarded-Host 标头,因为这两种 HTTP 标头都广泛用于利用主机标头注入漏洞。
什么是主机头?
HTTP Host 请求标头[6] 是强制标头(根据 HTTP/1.1 和 HTTP/1.2 协议版本),指定请求发送到的服务器的主机和端口号。
如果不包含端口,则隐含所请求服务的默认端口,HTTPS URL 为 443,HTTP URL 为 80。
示例: 主机:www.mysite.net
什么是 X 转发主机?
语法:X-Forwarded-Host:www.site.com
X-Forwarded-Host header[7]用于标识客户端发起的原始请求。由于反向代理中的主机名和端口不同,因此此标头用于识别原始请求。该标头还用于调试目的。
什么是主机头攻击?
根据 HTTP 1.1 和 HTTP 1.2 协议版本,HTTP 主机标头必须嵌入到 HTTP 请求中,以识别发起请求的来源或客户端尝试访问的资源。由于在现代计算中,我们有一个负载平衡器,虚拟主机使用相同的 IP 来托管多个网站,因此确定客户端想要访问哪些资源至关重要。
有时,在处理或提供请求之前,HTTP 主机标头未在 Web 服务器上正确验证,这为攻击者提供了利用此做法的范围,即发送包含域名的虚假标头,例如,该域名可用于破坏网络缓存或密码重置电子邮件。在安全上下文中,这种类型的攻击称为主机标头注入攻击。主机标头注入漏洞是一个中等严重性漏洞,基本评分为 5.4 [CVSS 版本 3.X],并在 CVE-2020-11814 [9] 下进行了识别。
识别和利用易受主机标头注入攻击的 Web 应用程序
任意主机头注入:这里作者将传递任意HTTP主机头值,该值将与实际的HTTP主机头不同。如果服务器响应 200 HTTP 状态代码,则意味着 Web 服务器上存在配置错误,因为它没有验证请求的来源。作者在分别运行在端口4000和80上的Nginx和apache2 Web服务器应用程序上托管了一个简单的HTML页面,系统的IP地址是10.55.18.21。图 3 和图 4 显示了 Web 浏览器上的默认页面加载以及来自 Web 服务器的 GET 响应,其中网页托管在 Nginx Web 服务器上。