请求走私(HTTP Request Smuggling)

HTTP协议

HTTP版本介绍

HTTP 0.9

第一代http协议,已过时,没有协议头,仅支持GET方式,且不支持请求头,所以仅支持纯文本的传输。

HTTP 0.9具有典型的无状态性,每个事务独立进行处理,事务结束时就释放这个连接。由此可见,HTTP协议的无状态特点在其第一个版本0.9中已经成型。一次HTTP 0.9的传输首先要建立一个由客户端到Web服务器的TCP连接,由客户端发起一个请求,然后由Web服务器返回页面内容,然后连接会关闭。如果请求的页面不存在,也不会返回任何错误码。

HTTP 1.0

HTTP协议的第二个版本,第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用。相对于HTTP 0.9 增加了如下主要特性:

  1. 请求与响应支持头域
  2. 响应对象以一个响应状态行开始
  3. 响应对象不只限于超文本
  4. 开始支持客户端通过POST方法向Web服务器提交数据,支持GET、HEAD、POST方法
  5. (短连接)每一个请求建立一个TCP连接,请求完成后立马断开连接。这将会导致2个问题:连接无法复用,head of line blocking。连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类请求影响较大。head of line blocking会导致带宽无法被充分利用,以及后续健康请求被阻塞。

HTTP 1.1

HTTP协议的第三个版本是HTTP 1.1,是目前使用最广泛的协议版本 。HTTP 1.1是目前主流的HTTP协议版本,HTTP 1.1引入了许多关键性能优化:keepalive连接,chunked编码传输,字节范围请求,请求流水线等

HTTP 2.0

HTTP 2.0是下一代HTTP协议,目前应用还非常少。主要特点有:

多路复用(二进制分帧)HTTP 2.0最大的特点:不会改动HTTP 的语义,HTTP 方法、状态码、URI 及首部字段,等等这些核心概念上一如往常,却能致力于突破上一代标准的性能限制,改进传输性能,实现低延迟和高吞吐量。而之所以叫2.0,是在于新增的二进制分帧层。在二进制分帧层上, HTTP 2.0 会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 ,其中HTTP1.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面。

 

HTTP 1.1 特性(Keep-Alive&Pipeline&chunked

正如上面所介绍的,HTTP1.1协议之前,所有的访问都是短连接,客户端每进行一次HTTP请求,就需要同服务器建立一个TCP链接。而现代的Web网站页面是由多种资源组成的,我们要获取一个网页的内容,不仅要请求HTML文档,还有JS、CSS、图片等各种各样的资源,这样如果按照之前的协议设计,就会导致HTTP服务器的负载开销增大。于是在HTTP1.1中,增加了Keep-AlivePipeline这两个特性。

Keep-Alive,在HTTP请求中,会带上一个Connection: Keep-Alive 的请求头,这代表着,当我完成一次对服务器的HTTP请求,会告诉服务器,不要断开TCP连接,在后续对服务器发起新的HTTP请求时,继续复用该TCP连接,这样只需要进行一次TCP握手的过程,可以减少服务器的开销,节约资源,还能加快访问速度。(HTTP1.1协议默认开启该特性)

Pipeline,Keep-Alive的基础上,请求方客户端不需要在发起一次请求后等待服务器响应,而是可以一直发送请求,服务器那边接收到请求后,需要遵循先入先出机制,将请求和响应严格对应起来,再将响应发送给客户端(浏览器默认是不启用Pipeline的,但是一般的服务器都提供了对Pipleline的支持)。

chunked,分块传输编码,HTTP1.0协议中,是通过Content-Length 请求头字段来计算 Request body字段,在HTTP1.1中,新增了Transfer-Encoding 请求头,可以通过 Transfer-Encoding: chunked 来代替 Content-Length:number,发送数据,使用方式也很简单,如图,2;FkxpBSG\r\naa

2(16进制)代表还需要读两个字符,读取下一行的aa  2分号后面的是注释语句,无实际作用,数据最后为0,读取0个字符,代表结束,添加两个\r\n代表一次完整的请求结束(Burp插件-chunked)。

 

 

HTTP Request Smuggling

上面说了这么多,终于要来到了咱们的漏洞环节,再补充两个小知识点

1. 在发送畸形HTTP请求时,服务器不能识别,会返回400状态码,bad request

2. 而在RFC2616的第4.4节中,规定:如果收到同时存在Content-Length和Transfer-Encoding这两个请求头的请求包时,在处理的时候必须忽略Content-Length,这其实也就意味着请求包中同时包含这两个请求头并不算违规,服务器也不需要返回400错误。当然了,总是会有不遵守的服务器出现:),这样就存在了差异性,导致出现问题。

而本文所实现的场景主要都是基于此特性,利用不同服务器对Request请求处理方式不同来进行请求走私。

这里使用portswigger在线实验室来模拟复现,利用场景(常见于CDN加速,反向代理等):

CL-TE

地址,实验要求,走私GPOST 请求方法

开启实验,直接对主页抓包,原始包如下

修改后发送数据包如下:

第一次请求,返回正常

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HTTP Request Smuggling 是一种攻击技术,利用了不同的 HTTP 设备(如负载均衡器、防火墙等)在处理 HTTP 请求时的解析差异,从而导致安全漏洞。 攻击者通过构造特殊的 HTTP 请求,利用不同设备在解析请求时的差异性,让部分设备认为请求结束,而另一部分设备认为请求并未结束。这种差异可能导致请求被拆分成多个部分,在后续处理中可能产生安全漏洞,例如绕过访问控制、绕过身份验证、执行未授权操作等。 攻击者通常会尝试向目标服务器发送构造精细的请求,以利用设备解析差异性。常见的 HTTP Request Smuggling 攻击包括: 1. 链接队列攻击:在 HTTP 请求头中使用换行符来分割请求,在设备解析时将请求分割成两部分。 2. Content-Length 碎片攻击:通过构造含有 Content-Length请求,在设备解析时将请求拆分成多个片段。 3. Transfer-Encoding 碎片攻击:通过构造含有 Transfer-Encoding 的请求,在设备解析时将请求拆分成多个片段。 4. HTTP Verb 碎片攻击:通过构造含有 HTTP Verb 的请求,在设备解析时将请求拆分成多个片段。 为了防止 HTTP Request Smuggling 攻击,以下是一些防护措施: 1. 更新设备和服务器软件以修复解析差异导致的漏洞。 2. 在负载均衡器、防火墙等设备上配置适当的规则和过滤器,防止恶意请求通过。 3. 使用安全编码实践,对输入数据进行适当的验证和过滤,确保输入数据不会导致解析差异性。 4. 监控和分析网络流量,检测异常请求模式和攻击行为。 总之,了解 HTTP Request Smuggling 攻击并采取适当的防护措施是保护应用程序和网络安全的重要步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值