当前位置: 首页 > 后端技术 > Java

HTTP主机头攻击,这是什么鬼?

时间:2023-04-01 15:57:41 Java

1。HTTPHostheaderattack从HTTP/1.1开始,HTTPHostheader是必须的请求头。它指定客户端要访问的域名。例如,当用户访问https://example.net/web-security时,他们的浏览器会发出一个包含Host标头的请求,如下所示:GET/web-securityHTTP/1.1Host:example.netatacertainInsome在某些情况下,例如当代理转发请求时,主机值可能会在到达预期的后端组件之前发生变化。还发生了主机标头攻击。2.HTTPHost头的作用HTTPHost头的作用是帮助识别客户端想要与之通信的后端组件。如果请求不包含Host标头或格式不正确,则在将请求传递给应用程序时可能会导致问题。从历史上看,这种漏洞并不是什么大问题,因为每个IP地址只会用于单个域的内容。现在经常会出现同一个IP访问多个网站和应用的情况,很大程度上是因为同一个IP上存在多个Web应用(不同的端口,不同的域名解析等)。这种方法的流行也部分归因于IPv4地址耗尽。当可以通过同一个IP地址访问多个应用程序时,最常见的原因是以下之一:虚拟主机单个Web服务器托管多个网站或应用程序。这可能是拥有一个所有者的多个站点,但也可能是托管在同一共享平台上的不同所有者的站点。它们都与服务器共享一个公共IP地址。通过代理路由流量网站托管在不同的后端服务器上,但客户端和服务器之间的所有流量都通过代理系统路由。这可能是一个简单的负载平衡设备或某种反向代理服务器。这种设置在客户通过内容分发网络(CDN)访问网站的情况下尤为普遍。在上述两种情况下,即使网站托管在单独的后端服务器上,它们的所有域名都解析为中间组件的单个IP地址。这会带来与虚拟主机相同的问题,因为反向代理或负载均衡器需要知道每个请求转到哪个后端。HTTPHost标头的作用是指定应将请求发送到应用程序的后端服务器。例如,需要将一封信发送给住在公寓楼里的人。整个公寓有很多房间,每个房间都可以收信件。通过指定房间号和收件人(即HTTPHost头)将信封交付给指定的人。3.什么是HTTP主机头攻击?某些网站以不安全的方式处理主机标头的值。如果服务器直接信任Host标头而不验证其有效性,攻击者可能会使用此可控变量注入Host来操纵服务器端行为。现成的Web应用程序通常不知道它们部署在哪个域上,除非在安装期间在配置文件中手动指定。例如,当他们需要知道当前域以生成包含在电子邮件中的绝对URL时,他们可能会依赖主机标头中的值:联系支持人员Host标头值也可用于不同网站系统之间的各种交互。由于Host标头实际上是用户可控的,因此这种做法会导致很多问题。如果不验证Host头或者直接使用Host头,Host头可以与其他一系列漏洞结合使用,例如:缓存投毒、特殊业务功能逻辑漏洞、基于路由的SSRF经典服务器漏洞,如SQL注入(当Host在SQL语句中使用时)等。4.如何检测HTTPHostheader攻击首先判断服务器是否检测到Hostheader?检测后Hostheader的值还在用吗?通过修改Host的值,如果服务器返回错误信息:说明服务器已经检测到Host的内容。至于是否使用了Hostheader的值,有以下几种方式可以查明:修改Host值简单来说就是修改HTTPheader中的Host值。如果观察到响应包中的修改值,则说明存在漏洞。但有时篡改Host标头的值会使Web应用程序无法访问,从而导致“无效的主机标头”错误消息,尤其是在通过CDN访问目标时。AddingrepeatedHostheaders添加重复的Hostheaders,通常两种Hostheaders中的一种有效,可以理解为一种是保证请求正确发送到目标服务器;另一种是将负载传递给后端服务器。GET/exampleHTTP/1.1Host:vulnerable-website.comHost:attackd-stuffURLswithabsolutepaths尽管许多请求通常使用请求域上的相对路径,但也配置了具有绝对URLs的请求。GEThttps://vulnerable-website.com/HTTP/1.1Host:attack-stuff有时也可以尝试不同的协议,例如HTTP或HTTPS。添加缩进或换行当某些站点阻止具有多个Host标头的请求时,您可以通过在HTTP标头中添加缩进字符来绕过它们:GET/exampleHTTP/1.1Host:attack-stuffHost:vulnerable-website.cominjection覆盖Host头和与Host头功能类似的字段,如X-Forwarded-Host、X-Forwarded-For等,有时默认开启。GET/exampleHTTP/1.1Host:vulnerable-website.comX-Forwarded-Host:attack-stuff等等,还有其他字段:X-HostX-Forwarded-ServerX-HTTP-Host-OverrideForwarded忽略端口,只验证修改域名时,添加重复的Hostheaders时被拦截,可以尝试理解Web应用是如何解析Hostheader的。例如,一些解析算法会忽略Host头中的端口值,而只验证域名。这时可以修改Host为如下形式:GET/exampleHTTP/1.1Host:vulnerable-website.com:attack-stuff保持域名不变,将端口值修改为端口号以外的值(non-number),并改变Hostheader攻击的payload放在端口值处,同样可以进行Hostheader攻击。5.HTTPHostheader攻击漏洞示例5.1密码重置中毒根据HTTPHostheader攻击的攻击特点,广泛应用于密码重置中毒:攻击者可以操纵网站在重置密码时生成的密码重置链接,让它发送到攻击者指定的域,并使用它来窃取重置任意用户密码的令牌。重设密码(忘记密码)功能的一般流程如下:用户输入用户名或邮箱地址,然后提交重设密码请求。该网站检查该用户是否存在,然后生成一个临时的、唯一的、复杂的令牌,该令牌与后端的用户帐户相关联。该网站向用户发送一封电子邮件,其中包含重置密码的链接。resettoken的参数包含在对应的URL中:https://normal-website.com/reset?token=0a1b2c3d4e5f6g7h8i9j用户访问该URL时,网站会检查提供的token是否有效,并以此判断要重置哪个帐户。如果一切正常,您可以继续执行用户重置密码步骤。最后,令牌被销毁。上述步骤的安全性依赖于这样一个事实,即只有目标用户才能访问他们的电子邮件,从而访问他们的唯一令牌。密码重置中毒是一种窃取此令牌以更改其他用户密码的漏洞。如果重置网站密码的过程完全依赖于用户的可控输入(如HTTPHostheader),这可能会导致密码重置中毒:攻击者获取受害者的用户名或邮箱作为重置密码的请求,而攻击攻击者会拦截请求并修改HTTPHost标头指定的域。例如evil-user.net的受害者会收到一封重置密码的邮件,但是由于攻击者修改了Host头,web程序生成了一个重置??链接,它也完全依赖于Host头,导致如下URL正在生成:https://evil-user.net/reset?token=0a1b2c3d4e5f6g7h8i9j如果受害者点击这个链接,会向攻击者的服务器发送一个重置密码的tokenevil-攻击者获得蠕虫密码的token后在user.net上,他会做相应的构造,访问真实的密码重置URL来重置密码。5.1.1密码重置中毒——基础在详细了解了上述密码重置中毒的过程和原理后,这里演示一个由HTTPHostheader攻击引起的密码重置基本中毒。先输入用户名或用户邮箱重置指定用户密码:提交后,会发送一封重置密码邮件到wiener用户邮箱(数据包见右侧):关注到重置密码的链接,可能会受到主机标头值的影响?我们来验证一下是否存在HTTPHost头攻击,将Host头的值修改为baidu.com:发现请求可以被后端服务器接收到,所以存在HTTPHost头攻击。这里输入受害者用户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字段Hostheader,比如X-Forwarded-Host,X-Forwarded-For等,可以Fuzzed:其实是可以被X-Forwarded-Host字段影响,造成Hostheader攻击。当同时添加多个字段使请求被拦截时,可以尝试类似的排除方法,二分法排查哪个字段有效。重置受害者卡洛斯和毒药的密码:然后构造一个链接:https://acf11f4e1f164378800b165b00bb007d.web-security-academy.net/forgot-password?temp-forgot-password-token=o8gD3Le1K0YQcb2AaASgiI8F2eVI5m3h5.1.3重置密码中毒——悬挂标记技术首先简单介绍一下悬挂标记技术:悬挂标记技术悬挂标记技术是一种无需编写脚本即可窃取页面内容的技术。它使用图像等资源(结合CSP操作的策略)将数据发送到攻击者的远程控制位置。当反射XSS不起作用或被内容安全策略(CSP)阻止时,它很有用。这个想法是在不完整的状态下插入一些部分HTML,例如图像标签的src属性,页面上的其余标记关闭该属性,但同时在两者之间发送数据(包含被盗页面的内容)到远程服务器。比如我们在反射型XSS注入点注入这样一个img标签:标签来取密码out:原来正常的HTML是这样的:通过TheDanglingMarkup技术注入一个?字符插入到a标签的链接中,从而在双引号闭合之前将所有后续值作为URL参数请求给攻击者服务器:这也是DanglingMarkup技术的精髓所在。该技术的核心要点是:可控变量后面是否有需要窃取的关键数据(包括Token、密码等)在攻击者的服务器上,可以看到Hostheader攻击转发的请求,其中成功盗取受害者重设密码:5.2HostheaderAttack+CachePoisoning当Hostheader攻击的网站不具备重设密码功能时,此时该漏洞似乎没有作用,因为无法驱使用户去访问抓包修改Host头,协助攻击者完成一系列s攻击。但是,如果目标站点使用Web缓存,缓存投毒可用于向其他用户提供带有病毒的缓存响应。此时Hostheader攻击漏洞转化为类似XSS存储类的漏洞。要构建Web缓存中毒攻击:需要找到映射到其他用户请求的缓存键;下一步是缓存这个恶意响应;然后,此恶意缓存会提供给所有试图访问受影响页面的用户。第一步找到Hostheader攻击点:通过在网站首页添加重复的Host值,达到覆盖的效果,验证是否存在Hostheader攻击:第二步找到out是否使用了网页缓存?什么是缓存键?从上图也可以看出,该站点使用了Wen缓存功能,配合Host头攻击缓存了/resources/js/tracking.js资源文件。第三步,在攻击者的服务器上创建一个同名的/resources/js/tracking.js资源文件,内容为:alert(document.cookie);然后通过Host头注入攻击者的服务器域名,在响应中可以看到正确对应我们的/resources/js/tracking.js资源文件:发送多个请求,让请求的响应变成缓存:当其他用户请求站点首页时,服务器会向用户提供恶意缓存,造成缓存中毒。5.3HostHeader攻击绕过访问控制出于安全原因,网站某些功能的访问通常仅限于内部用户。但是,绝对有可能通过主机头攻击来绕过这些限制。对于一个站点,从发现Host头攻击到利用,下面展示了一个完整的过程:第一步,访问首页,随意修改Host的值:注意这里的Host的值会没有出现在响应包中,但是还是有可能存在Hostheaderattack,因为仍然响应成功,说明服务器没有验证Hostheader。第二步是查找敏感页面。从/robots.txt我们知道/admin是一个有访问控制的页面:可以得到错误信息,/admin页面只允许本地用户访问。第三步,将Host改为服务器内部地址,绕过IP访问控制:5.4Hostheaderattack+SSRFHostheaderattack可能导致基于路由的SSRF攻击,称为:HostSSRFAttack。经典的SSRF攻击通常基于XXE或可利用的业务逻辑,将用户可控的URL作为HTTP请求发送;而基于路由的SSRF依赖于云端部署的架构,包括负载均衡和反向代理,这些中间件将请求分配发送到相应的后端服务器进行处理。如果服务器不验证Host头转发的请求,则攻击者可能将请求发送(重定向)到系统中的任何一个系统。这可能需要知道内部系统的IP地址(私有地址)。一般可以通过信息采集或Fuzz(如枚举192.168.1.1/16)等方式确定有效的私网IP地址。5.4.1BasicHostheaderattack+SSRF例如/admin页面无法正常访问(404):猜测/admin存在于内网,需要内网机器才能访问,但是带有Hostheaderattack+SSRF,是可以绕过和访问的。第一步是判断是否使用了Host。可以用DNSLog取出来。这里我使用Burp自带的“BurpCollaborator客户端”来实现外卖:就是服务端根据Host头中的域名来请求资源。第二步,根据Host头的SSRF检测内网主机。如果一些敏感页面(如管理页面)在内网深处,无法从外网访问,但可以通过Host头攻击+SSRF绕过访问控制,从而访问内网资产,这里是C段Fuzz的内网IP为192.168.0.0/24,直接使用Intruder枚举:内网IP为192.168.0.240第三步访问内网资源结构/管理页面,在Host内网IP换位:5.4.2Hostheaderattack+SSRF——使用绝对路径的URL有时服务器会验证Hostheader的值。如果Host被修改,服务器将拒绝所有修改的请求:普通请求通常在请求域上使用相对路径。但是,服务器也可以配置绝对URL请求。以下形式可以绕过Host的验证:GEThttp://acab1f4b1f3c7628805c2515009a00c9.web-security-academy.net/HTTP/1.1然后使用“BurpCollaborator客户端”取出:取出成功,说明Hostheader用于服务端向指定域名请求资源,直接SSRF爆破内网:访问内网页面:6HTTPHostheader攻击防护最简单解决方法是避免在服务端完全使用Hostheader代码并只使用相对URL。其他方法包括:6.1正确配置绝对域名URL当必须使用绝对域名URL时,需要在配置文件中手动指定当前域的URL,并引用配置的值,而不是从HTTP主机标头。这种方法可以防止密码重置的缓存中毒。6.2Hostheader域的白名单验证如果必须使用Hostheader,需要正确验证其合法性。这包括允许域、使用白名单对其进行验证以及拒绝或将请求重定向到无法识别的主机。这包括但不限于单个Web应用程序、负载平衡器和反向代理设备。6.3不支持hostheadercoverage确保功能类似于Hostheader的字段不适用,例如X-Forwarded-Host,X-Forwarded-For等,这些有时默认启用。值得一提的是,用于内网(不联网)的Host主机不应与公网应用托管在同一台服务器上,否则攻击者可能操纵Host头访问内域。