实战 | 记一次HOST头中毒导致的密码重置漏洞挖掘

VSole2022-07-23 08:12:54

0x01 前言

暑假的时候发现的一个骚思路。有些网站开发者会提取request包里的host头来获取域名信息,但是host头可以被修改,是不可信的。于是攻击者可以通过构造host头来进行投毒攻击。

例如发送包含受害者网站域名链接的功能,像是密码找回、发送验证链接等,只要业务上利用了类似于域名提取的功能,都可以尝试利用该攻击方法。这里以密码找回为例,进行一次host头投毒攻击。

0x02 挖掘过程

某网站存在密码找回功能,本例使用host头中毒来实现任意用户密码重置。打开密码找回界面,填写受害用户的邮箱,在最后的提交按钮用burpsuite截断,把host头更改成自己的服务器IP:

之后放行数据包,会提示找回密码邮件发送成功的信息,此时受害者邮箱会收到一封邮件:

可以看到,域名已经改成了我们在host头填写的服务器地址。这时受害者如果访问该链接,则会在我们的服务器上留下一条记录:

在把原域名和日志抓取到的url拼接一下,就能得到受害人的密码重置链接了。

0x03 补充阅读

这个漏洞是1click的任意密码重置漏洞,利用了host头中毒的思路,我个人感觉还是比较新颖的。不过像大厂安防策略都会对request头数据进行检验,遇到不在白名单的域名直接会拒绝访问。

什么是HTTP Host头?

从HTTP/1.1开始,HTTP Host头就是强制性的请求标头。比如我们要访问这个URL时 http://www.xxxx.com/web 浏览器会编写个Host标头的请求,"GET"请求的是页面的相对路径,"Host"就是主机头,请求的是域名或服务器地址:

GET /web HTTP/1.1Host:www.xxxx.com

HTTP Host头有何用处?

HTTP Host头的目的是帮助识别客户端想要与哪个后端组件通讯。

伴随云和虚拟主机的普及,单个Web服务器可以托管多个网站或应用程序。尽管这些网站都有各自不同的域名,但很有可能共享服务器同一个IP地址,这种情况下就需要通过Host头来进行区分了。

如何利用Host头来进行攻击?

如果网站没有以安全的方式来处理Host值的话,就极易受到攻击。一般Web应用程序通常不知道它们部署在哪个域上,当它们需要知道当前域时,很有可能会求助于Host头。如果服务器完全信任Host头,没有验证或转义它的值,攻击者可以把有害的Payload放入其中,当应用程序调用的时候,有害的Payload可能就会传导进去造成“注入”。

而这种漏洞可以造成包括:

Web缓存中毒、特定功能的业务逻辑缺陷、基于路由的SSRF、SQL注入等

Bypass

通常来说,很少有站点会出现上面这种完全放开的现象,一般或多或少都有些过滤机制,但如果过滤做的不好,就会存在被绕过的可能性。

1.忽略端口的检验某些过滤检查只验证域名,会忽略Host头中的端口。如果我们可以在Host头中写入非数字端口,就可以通过端口注入恶意Payload。GET /example HTTP/1.1Host:Website.com:bad-stuff-here
2.允许任意子域如果应用系统允许其域名下任意的子域通过,在这种情况下,可以通过子域来绕过验证。GET /example HTTP/1.1Host:hacked-subdomain.Website.com
3.注入重复的Host头有的时候我们可以添加多个Host头,而且一般开发者并没有预料到这种情况而没有设置任何处理措施,这就可能导致某个Host头会覆盖掉另一个Host头的值GET /exampleHTTP/1.1Host:Website.comHost:bad-stuff-here如果服务器端将第二个Host头优先于第一个Host头,就会覆盖掉它的值,然后中转组件会因为第一个Host头指定了正确的目标而照常转发这个请求包,这样就能绕过中间组件将Payload传递给服务器。
4.提供绝对URL正常情况下,"GET"的请求航采用的是相对地址,但是也允许使用绝对地址,就是将原本Host的值拼接到相对地址前面构成绝对地址,这样就可以利用Host头进行注入。GET http://Website.com/ HTTP/1.1Host:bad-stuff-here
5.添加换行有时候还可以通过使用空格字符缩进HTTP头来进行混淆,因为有些服务器会将缩进的标头理解为换行,而将其视为前面头值的一部分,有些服务器会完全忽略缩进的HTTP头,因此不同系统处理HTTP头可能会存在不一致的现象。GET /example HTTP/1.1Host:bad-stuff-hereHost:Website.com如果前端忽略缩进的头部,这个请求会被作为普通请求来处理。假设后端忽略前导空格优先考虑第一个Host头,这种不一致性会导致Payload的注入。
6.利用可覆盖Host的请求头有一些请求头的值是可以覆盖Host的值的,比如X-Forwarded-Host,当我们发出这样的请求时就会触发覆盖GET /exampleHTTP/1.1Host:Website.comX-Forwarded-Host:bad-stuff-here可以达到相同目的的还有这些头X-HostX-Forwarded-ServerX-HTTP-Host-OverrideForwarded

如何预防Host头攻击?

要防止HTTP Host头攻击,最简单的方法就是避免在服务器端代码中完全使用Host头,不进行任何引入。如果确实要使用Host值的话,还有些其他的方法:

1.保护绝对URL2.验证Host头3.不支持Host覆盖头4.白名单允许的域5.小心使用仅限内部访问的虚拟主机
hosthttp请求头
本作品采用《CC 协议》,转载必须注明作者和本文链接
先Fuzz测试跑一遍收集到的子域名,这里使用的是Burp的Intruder功能。若看到一个服务端返回200的状态码,即表面成功找到一个在HOST白名单中的子域名。和 X-Rewrite-URL 标绕过 Web 服务器的限制。通过支持 X-Original-URL 和 X-Rewrite-URL 标,用户可以使用 X-Original-URL 或 X-Rewrite-URL HTTP 请求覆盖请求 URL 中的路径,尝试绕过对更高级别的缓存和 Web 服务器的限制Request
服务端一般使用 Referer 请求识别访问来源。
在cgiHandler函数中,将用户的HTTP请求参数作为环境变量,通过诸如LD_PRELOAD即可劫持进程的动态链接库,实现远程代码执行。代码首先拼接出用户请求的cgi完整路径并赋予cgiPath,然后检查此文件是否存在以及是否为可执行文件。随后代码将cgiPath、envp、stdIn与stdOut作为参数传入launchCgi函数中。
apache一些样例文件没有删除,可能存在cookie、session伪造,进行后台登录操作
GoReplay 是一款开源网络监控工具,可以记录您的实时流量,并将其用于shadowing、load testing、monitoring和detailed analysis。捕获实时HTTP流量并将其重放到测试环境中,以便使用真实数据持续测试您的系统。
0x00 介绍工具介绍RedGuard,是一款C2设施前置流量控制技术的衍生作品,有着更加轻量的设计、高效的流量交互、以及使用go语言开发具有的可靠兼容性。它所解决的核心问题也是在面对日益复杂的红蓝攻防演练行动中,给予攻击队更加优秀的C2基础设施隐匿方案,赋予C2设施的交互流量以流量控制功能,拦截那些“恶意”的分析流量,更好的完成整个攻击任务。RedGuard是一个C2设施前置流量控制工具,可以避免Blue Team,AVS,EDR,Cyberspace Search Engine的检查。
0x00 介绍工具介绍RedGuard,是一款C2设施前置流量控制技术的衍生作品,有着更加轻量的设计、高效的流量交互、以及使用go语言开发具有的可靠兼容性。它所解决的核心问题也是在面对日益复杂的红蓝攻防演练行动中,给予攻击队更加优秀的C2基础设施隐匿方案,赋予C2设施的交互流量以流量控制功能,拦截那些“恶意”的分析流量,更好的完成整个攻击任务。RedGuard是一个C2设施前置流量控制工具,可以避免Blue Team,AVS,EDR,Cyberspace Search Engine的检查。
RedGuard,是一款C2设施前置流量控制技术的衍生作品,有着更加轻量的设计、高效的流量交互、以及使用go语言开发具有的可靠兼容性。它所解决的核心问题也是在面对日益复杂的红蓝攻防演练行动中,给予攻击队更加优秀的C2基础设施隐匿方案,赋予C2设施的交互流量以流量控制功能,拦截那些“恶意”的分析流量,更好的完成整个攻击任务。
HTTP协议请求走私
2021-10-07 05:49:58
HTTP请求走私是针对于服务端处理一个或者多个接收http请求序列的方式,进行绕过安全机制,实施未授权访问一种攻击手段,获取敏感信息,并直接危害其他用户。
大家好,我是小白哥,今天给大家看一段神奇的代码。利用这几行神奇的代码,居然能把网站打崩溃,这是怎么一回事呢
VSole
网络安全专家