利用效果
攻击者通过构造特殊post包使下一位用户的http包头被篡改。(在这里我实现当第二位用户访问该服务器时在评论区输出该用户的报头内容)利用原理
什么是HTTP请求走私
HTTP请求走私是一种干扰网站处理从一个或多个用户接收的HTTP请求序列的方式的技术。请求走私漏洞本质上通常很关键,它使攻击者可以绕过安全控制,未经授权访问敏感数据并直接危害其他应用程序用户。
HTTP协议特点概述
1.HTTP协议是一个应用层协议,由请求-响应够成,是一个标准的客户端服务器模型。
2.HTTP协议简单快速,客户向服务器请求服务时,只用传送请求方法和请求路径。常见的请求方法有POST,GET,HEAD等等
3.无连接,每次http连接只处理一个请求,服务器响应完客户端的请求并收到应答后就断开连接。
4.无状态,所谓无状态是指协议对事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则需要重传。
用户请求发送到前端服务器(CDN/反向代理),并且该服务器将请求转发到一个或多个后端服务器,当前端服务器将HTTP请求转发到后端服务器时,它通常会通过同一后端网络连接发送多个请求,因为这样效率更高。
走私原理
如果说前端和后端系统对同一请求报头的处理方式不同,我们发送一个模棱两可的请求,该请求就会被前后端以不同的方式解释:
前端服务器处理CL,并确定请求体长度为6个字节(\r\n0\r\nG)。该请求被转发到后端服务器,后端服务器处理TE标头,认为消息为分块编码。处理第一块时该块声明长度为0,被视为终止请求,那么后面那个G就被留在缓冲区未被处理,后端服务器将会认为他是下一个HTTP请求的开始部分。当第二个请求过来时,就会收到类似“Unknown method GPOST”的响应。
利用过程
我们在这里实现一个让下一个请求同一服务器的用户在指定页面留下自己HTTP请求头的功能。实验环境传送门
填好评论后发一个正常的包,评论的内容由comment参数控制,如果评论成功则返回302跳转。
接下来构造一个恶意的请求,让第二个访问该服务器的用户自动评论并留下他的请求头
为了观众老爷看着清楚,我们把第二位访问者评论时的名字改为Second,comment参数放在最后用于接收请求头,下面的Content-Length可以自行修改以控制截取下一位访问者的报头长度。这里我们先截取500个,点击go,返回400,后端认为我们的消息长度为0,实际上,下面的一段恶意的请求头已经存在了后端服务器的缓存中,换个浏览器访问一下:
直接提示评论成功,然后回到评论区看一下是否留下了访问者的信息
因为超出我们截取的部分还是留在了服务器的缓存区,当再次访问该服务器,它会返回400。
再次请求时就会正常显示。
至此一次HTTP请求走私完成!
还有前端处理TE标头、后端处理CL标头(TE.CL),前后端都处理TE标头时混淆(TE.TE)等情况与此原理相似,相信大家可以举一反三,这里就不一一赘述了。(溜了。。。。)
参考文档
-
分块编码是HTTP1.1协议中定义的Web用户向服务器提交数据的一种方法,当服务器收到chunked编码方式的数据时,会分配一个缓冲区存放数据,如果提交的数据大小未知,客户端会议一个协商好的分块大小向服务器提交数据。 ↩