作者:vivo 互联网安全团队- Gui Mingcheng

本文介绍了两种攻击者无需间接接触服务端即可攻打和影响用户行为的安全漏洞 —— Web缓存净化与申请走私。Web缓存净化旨在通过攻击者向缓存服务器投递歹意缓存内容,使得用户返回响应后果而触发平安危险。HTTP申请走私旨在基于前置服务器(CDN、反向代理等)与后置服务器对用户申请体的长度判断规范不统一的个性,结构可能被同一TCP连贯中其它用户夹带局部歹意内容的攻打申请,从而篡改了受害者的申请与响应行为。两种破绽均须要通过针对中间件的合理配置与业务接口的正当设计进行排查和进攻。

一、Web 缓存净化攻打原理与场景

1.1 什么是缓存?

缓存技术旨在通过缩小提早来减速页面加载,还能够缩小应用程序服务器上的负载。一些公司应用像Varnish这样的软件来托管他们本人的缓存,而其余公司抉择依赖像Cloudflare这样的内容散发网络(CDN),缓存散布在世界各地。此外,一些风行的Web应用程序和框架(如Drupal)具备内置缓存。Web缓存净化关注的是CDN等前置服务端部署的缓存服务,还有其余类型的缓存,例如客户端浏览器缓存和DNS缓存,但它们不是本次钻研的关注点。

1.2 缓存的工作机制?

由CDN等代理层服务器依据“缓存键”缓存用户申请对应的响应,并在某个申请再次到来时间接返回相应的响应包。例如如下场景中,红色字体标识了缓存服务器配置的缓存键内容,A用户拜访服务端返回的后果后,B用户再次拜访仅会获得缓存服务器中的内容,因为缓存服务器认为两者是同一个申请,无需再向业务服务端从新申请一次。

1.3 缓存净化具体是如何实现的?

当攻击者的申请中,缓存键和普通用户没有差异,而申请中其它局部存在可体现在响应包中的歹意内容或代码时,该响应被缓存后,其它申请了同一个失常缓存键对应接口的用户会间接失去攻击者提前交给缓存服务器缓存的歹意响应。

以下是一个简略的例子,业务某个接口存在逻辑:获取用户申请Host头的内容,拼接至响应包的js链接中作为拜访域名。此时攻击者注入歹意域名hack.com,受害者拜访缓存资源的时候失去的是和攻击者一样的响应后果。此时攻击者通过JavaScript代码简直劫持了受害者在前端的所有信息和行为,具体的结果则由其中的恶意代码所决定,这与XSS的攻打结果是相似的。

Web缓存可能结构什么样的攻打,取决于在不毁坏缓存键的同时,结构可能在响应中体现歹意行为的申请,例如业务逻辑对Host头中的值进行校验和申请,但没有校验端口号是否为443或80。此时能够结构申请使得响应跳转至1337端口,其它受害者对该接口的拜访便不再可用:

 拓展学习 —— 攻击者如何确定缓存键的覆盖范围?

首先须要确认是否存在缓存键:

  • HTTP头间接返回缓存的相干信息
  • 察看动静内容的变动
  • 返回工夫的差别
  • 特定的第三方缓存配置头

如何定位缓存键的覆盖范围:

  • 对申请A改变一处成为申请B,各自响应有所差别。若申请B后失去A的缓存后果,则阐明A、B的缓存键雷同,也阐明了改变之处并非缓存键。
  • 扭转申请A某处内容发送,响应cache头依然在缓存计时,阐明该处内容局部不为缓存键。反之,从新命中,则该处内容蕴含缓存键。
  • 利用特定的头来查问缓存键,例如:Pragma: akamai-x-get-cache-key, akamai-x-get-true-cache-key。

二、Web缓存净化进攻伎俩

2.1 禁用缓存配置

对缓存投毒的最弱小进攻方法就是禁用缓存。

对于一些人来说,这显然是不切实际的倡议,但我揣测很多网站开始应用Cloudflare等服务的目标是进行DDoS爱护或简化SSL的过程,后果就是容易受到缓存投毒的影响,因为默认状况下缓存是启动的。如果对确定哪些内容是“动态”的足够确认,那么只对纯动态的响应进行缓存也是无效的。

2.2 防止从申请中间接获取输出放在响应中

一旦在应用程序中辨认出非缓存键的输出,现实的解决方案就是彻底禁用它们。如果不能实现的话能够在缓存层中剥离该输出,或将它们增加到缓存键。倡议应用Param Miner等审计应用程序的每个页面以清除非缓存键的输出。

三、HTTP申请走私攻打原理与场景

3.1 HTTP申请走私的基本原理

在RFC2616的第4.4节中,规定:如果收到同时存在Content-Length和Transfer-Encoding这两个申请头的申请包时,在解决的时候必须疏忽Content-Length。但理论解决往往没有恪守该协定。HTTP申请的结尾与完结标记能够通过Content-Length来决定,也能够通过申明的Transfer-Encoding: chunked对HTTP分组来决定。以后置服务器和后置服务器对HTTP申请结尾和完结标记的判断解决规范不统一时,就可能导致攻击者前一个申请的后半局部在后置被认为是下一个申请的结尾,从而呈现HTTP走私破绽。

依据前后置服务器的不同申请体长度判断组合模式,有以下攻打场景:

实质起因:

  • 前后置服务器对申请体长度的判断规范存在Content-Length和Transfer-Encoding两种模式
  • 前置服务器和后置服务器之间存在TCP连贯重用,混淆多个用户的申请

3.2  Content-Length和Transfer-Encoding申请头如何制订申请体长度?

申请体中每个字符为一个字节的长度,换行符蕴含 \r 和 \n 两个字节长度,Content-Length标识申请体从结尾到最初一个字符的总长度:

  • Content-Length
POST /search HTTP/1.1Host: normal-website.comContent-Type: application/x-www-form-urlencodedContent-Length: 11  q=smuggling

申请体中每个字符为一个字节的长度,换行符蕴含 \r 和 \n 两个字节长度。每段申请内容别离由一行16进制长度值和一行内容自身所组成,例如“q=smuggling”长度为11(16进制:b),“q=smuggle”长度为9(16进制:9)。内容完结后,以 0 和两个换行符完结申请体:

  • Transfer-Encoding: chunked
POST /search HTTP/1.1Host: normal-website.comContent-Type: application/x-www-form-urlencoded Transfer-Encoding: chunked bq=smuggling9q=smuggle0[\r\n][\r\n]

3.3  HTTP申请走私如何攻打?

基于下面形容的5种前后置服务器不同的申请体长度判断模式,这里抽选其中的 CL-TE 和 TE-CL 模式进行举例:

  • CL - TE

此时,业务前置服务器取用户申请头中Content-Length的值为长度判断规范,后置服务器依据Transfer-Encoding: chunked解析申请体来判断申请体长度。

如下所示,攻击者结构的申请,前置服务器认为有6个字符,蕴含了 0 和两个换行 以及 G。而后置服务器则依据Transfer-Encoding: chunked解析申请体,认为 0 和两个换行符曾经是申请的完结标记,字符G被滞留在了TCP管道中。

此时同一个TCP连贯中中,一个受害者的申请接踵而至,后置服务器便会将字符G拼接至其申请结尾,从而使得受害者理论对业务申请了GGET办法。

  • TE - CL

与CL - TE相似,前置服务器先依据Transfer-Encoding: chunked放行攻击者的整个申请体,通过后置服务器对Content-Length的判断,宰割前半部分申请体给业务服务端,后半局部由受害者承接。

能够看到,这里攻击者齐全能够劫持受害者的申请,从接口地址到申请头以及申请参数,因而具备较大的危害性。

3.4 HTTP申请走私攻打的成果是什么?

这里举一个例子 —— 捕捉其余用户的申请。攻击者发现业务存在HTTP申请走私破绽,同时又找到了评论接口 /post/comment 这种能够回显申请内容的性能点。那么攻击者就能够走私一个 /post/comment 的评论申请,从而让受害者“被迫”以这个申请去拜访服务端。受害者的申请则被拼接到评论申请中的comment参数后,作为申请内容而呈现。

攻击者去查看评论区,发现受害者曾经将本人先前的申请(连同Cookie等信息)一并发送到了评论区。

踩坑记录

这里受害者的申请中一旦呈现 “&” 字符,就会被当做 POST BODY的参数分隔符从而停止comment评论内容参数的解析。因而评论区仅能看到受害者申请中第一个 “&” 字符之前的内容。

四、HTTP申请走私进攻伎俩

4.1 通用进攻措施

  • 禁用代理服务器与后端服务器之间的TCP连贯重用。
  • 应用HTTP/2可能防止申请边界断定规范不统一的问题。
  • 前后置服务器应用同样的web服务器程序,保障对申请边界的判断规范是统一的。

4.2 理论问题

以上的措施有的不能从根本上解决问题,而且有着很多有余,就比方禁用代理服务器和后端服务器之间的TCP连贯重用,会增大后端服务器的压力。应用HTTP/2在当初的网络条件下根本无法推广应用,哪怕反对HTTP/2协定的服务器也会兼容HTTP/1.1。从实质上来说,HTTP申请走私呈现的起因并不是协定设计的问题,而是不同服务器实现的问题。因而要严格保障前后置服务器对申请边界的判断规范是统一的来防护该类型危险的呈现。

五、实战演示

  • Web缓存破绽靶场
  • HTTP申请走私破绽靶场

六、总结

Web缓存净化和HTTP申请走私是两种不太被关注到、但影响力和危害较大的两种安全漏洞类型。其共同点是均脱离业务利用自身,依靠于严格标准的运维、网络人员的相干配置,因而在呈现问题时对业务逻辑自身的排查往往会偏离理论状况。

Web缓存净化可能使攻击者批量影响共用了同一缓存资源的所有用户,HTTP申请走私可能使得攻击者随机在长连贯中影响其余同时拜访业务用户的申请内容,理论造成的影响取决于存在破绽的接口和业务自身提供了多少可能利用的权限和性能。

因而,如果说有哪种破绽可能在不间接攻打业务服务器和受害者电脑就可能施行大批量的攻打利用,从而影响到用户申请和收到的响应内容,则Web缓存净化和HTTP申请走私会是咱们重点关注的外围危险问题。