甜橙安全头条第25期|通过HTTP协议特性绕过安全设备

百家 作者:甜橙安全应急响应中心 2020-12-04 19:24:38


甜橙安全

     随着国家颁布了《网络安全法》,越来越多的企业对于自身的安全意识也在不断的提高,更多的企业也会选择去通过购买安全设备来提升自身的安全能力。但安全设备也并不是万能的,以下几方面是通过HTTP协议的特性来对安全设备进行绕过,希望能给攻击方和防守方带来一些帮助。

一、利用管线化(pipelining)技术绕过

      http 请求是基于 TCP 协议之上的,那么,当客户端在发起请求前,需要先与服务端建立TCP连接,而每一次的TCP连接是需要三次握手来确定的。如果客户端的请求头中的connection为close,则表示客户端发送完数据后需要关掉TCP连接,如果为keep-alive,则客户端需要打开长连接,如果客户端的请求中没有connection这个头,那么根据协议,如果是 http1.0,则默认为 close,如果是 http1.1,则默认为 keep-alive。如果结果为 keep-alive,那么,中间件容器在输出完响应包后,会设置当前连接的 keep-alive 属性,然后等待客户端下一次请求。

      但HTTP1.1中,单个TCP连接中只能在同一时刻中处理一个请求。所以在HTTP/1.1 规范中规定了 Pipelining 来试图解决这个问题。在RFC 2616 规定中说明了Pipelining的作用:一个支持持久连接的客户端可以在一个连接中发送多个请求(不需要等待任意请求的响应)。收到请求的服务器必须按照请求收到的顺序发送响应。因为Pipelining的特性,如果后端服务器处理不当,可能会导致请求走私漏洞,同时也可以利用这个特性来绕过安全设备。

      但是Pipelining缺点也很多,因为在实际应用中实现复杂,同时在一些代理服务器中不能正确的处理HTTP Pipelining,所以目前Firefox 和 Chrome 都完全放弃了对管道技术的支持,同时在 7.65.0 版本中,cURL 删除了全部支持 HTTP/1.1 Pipelining 技术的代码。站在防守方的角度来看,Pipelining技术在正常业务中是不会运用到,所以出现这样的请求时,可以大概率的判定为恶意攻击。

     虽然Pipelining技术有着容易被识别的风险,但是通过结合chunked分块传输编码等方式,还是有可能发挥一些奇效的。下面就通过burpsuite来实现Pipelining技术。

      首先关闭burp的Repeater的Content-Length自动更新,因为需要发送多个请求,所以Content-Length的自动更新需要关闭。

      然后通过burp截获请求包数据,并在请求包数据后在添加一个请求包。

      将第一个请求包中的Connection: close改成Connection: keep-alive,同时将head头中的Accept-Encoding: gzip, deflate去掉。发包后可以看到两个请求是在同一个数据包中的,响应也是两个。通过wireshark也能清楚的看到。

      可以看到,两个HTTP请求都到达了服务器后端,同时服务器后端也响应了两个响应包。可以通过这种方式,或者以组合的方式,来进行尝试绕过。

二、利用分块传输编码传输绕过

      分块传输编码是HTTP协议中的一种数据传输机制,允许HTTP由网页服务器发送给客户端的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。分块传输编码是将POST请求报文中的请求体数据分解成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小。

      在请求包头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。这时,报文中的实体需要改为用一系列分块来传输。每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的 CRLF(\r\n),也不包括分块数据结尾的 CRLF。分块编码传输可以在长度标识处加上分号“;”作为注释。最后一个分块长度值必须为 0,对应的分块数据没有内容,同时在0后添加两行空行(\r\n\r\n),表示数据包到此结束。

      在数据包的头部加入Transfer-Encoding: chunked。同时将请求体数据按照分块传输编码的格式要求分割成几部分。

      通过wireshark查看数据报文,也能看到是body体分成了两个部分。

      第一行的2表示下方的数据长度值为2(该长度值为十六进制,可以先以十进制先数长度,再转化成十六进制。空格长度值为1,空行长度值为2)。

      可以在长度值后面添加分号“;”作为注释,并在后面添加任意字符,以此来尝试绕过防护设备。

三、内容类型未覆盖

      在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。例如:Content-Type: text/html;charset:utf-8;

常见的媒体格式类型如下:

text/html :HTML格式

text/plain :纯文本格式      

text/xml :XML格式

image/gif :gif图片格式    

image/jpeg :jpg图片格式

image/png:png图片格式

以application开头的媒体格式类型:

application/xhtml+xml :XHTML格式

application/xml  :XML数据格式

application/atom+xml  :Atom XML聚合格式   

application/json :JSON数据格式

application/pdf   :pdf格式  

application/msword  :Word文档格式

application/octet-stream :二进制流数据(如常见的文件下载)

application/x-www-form-urlencoded :<form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

      另外一种常见的媒体格式是上传文件之时使用的:

     multipart/form-data:需要在表单中进行文件上传时,就需要使用该格式

      所以,当安全防护设备没有规则匹配到该协议传输的数据时可被绕过。下文将采用multipart/form-data格式来演示。

multipart/form-data格式首先需要生成了一个 boundary 用于分割不同的字段,在请求实体里每个参数以------boundary开始,然后是附加信息和参数名,然后是空行,最后是参数内容。多个参数将会有多个boundary块。如果参数是文件会有特别的文件域。最后以------boundary–为结束标识。
首先将头部Content-Type改为multipart/form-data; boundary=--------1559931924,boundary后面的值为分隔符,建议设置复杂一些,避免与请求参数混淆。然后设置分割符内的Content-Disposition的name为要传参数的名称。数据部分则放在分割结束符上一行。

在burpsuite可以使用Change body encoding来实现。

      对于攻击方来说,可以在实际应用中可以通过对上述的多种方式进行相互结合,以达到绕过安全设备的目的。而对于防守方来说,如果安全设备放行了这些特意构造的请求,是否能通过监控日志或者手动添加规则等方式来检测或阻断攻击者的攻击。

      随着安全设备的规则不断更新,这些攻击方法也在不断的被安全设备所识别。但随着新的HTTP协议——HTTP 2的来临与普及,同样也会带来新的HTTP特性和新的绕过方法,这可能就需要攻防人员来不断的学习,来提升攻击的矛与防守的盾。



———— / END / ————




-  -

burpsuite为啥能解https的包


- 甜橙安全小课堂 -

《手机丢了,第一时间一定要先做这件事!


- 热点追踪-

 App收集的最小必要信息有哪些?



 



关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接