web缓存欺骗

参考bobao.360.cn/learning/detail/4175.html

关于web缓存

一些静态文件,如jpg、js、css文件会被中间的代理服务器缓存下来,减少响应延迟。

服务器响应

web缓存欺骗以来于浏览器以及web服务器的响应。当请求home.php/x.css与请求home.php的响应内容相同时,缓存攻击才有效。

web缓存欺骗方法

1、攻击者诱使用户访问“https://www.bank.com/account.do/logo.png”。

2、受害者的浏览器会请求“https://www.bank.com/account.do/logo.png”。

3、请求到达代理服务器,代理服务器没有缓存过这个文件,因此会向web服务器发起请求。

4、Web服务器返回受害者的账户页面,响应代码为200 OK,表明该URL与已有页面一致。

5、代理机制收到文件内容,识别出该URL的结尾为静态文件扩展名(.png)。由于在代理服务器上已经设置了对所有静态文件进行缓存,并会忽略掉缓存头部,因此伪造的.png文件就会被缓存下来。与此同时,缓存目录中会创建名为“account.do”的一个新的目录,logo.png文件会缓存在这个目录中。

6、用户收到对应的账户页面。

7、攻击者访问“https://www.bank.com/account.do/logo.png”页面。请求到达代理服务器,代理服务器会将已缓存的受害者账户页面发给攻击者的浏览器。、

攻击条件

1、访问home.php/j.css与访问home.php的响应内容一致

2、Web应用启用了Web缓存功能,并且会根据文件的扩展名来缓存,同时会忽略掉任何缓存头部。

3、受害者在访问恶意URL地址时必须已经过认证。

现有的web框架

以下是几种有效的存在web缓存欺骗的web框架

1、PHP

创建不使用任何框架的PHP WEB应用,该应用汇忽略掉URL尾部的任何附加载荷,返回真实页面的内容。

2、Django

Django使用调度器(dispatcher)来处理Web请求,调度器使用urls文件来实现。在这些文件中,我们可以设置正则表达式来识别URI中具体请求的资源,然后返回对应的内容。

因此,根据django这种常见配置,当客户端请求http://www.sampleapp.com/inbox/”时,服务器会返回Inbox页面的内容。如果将某个不存在的文件附加到该URL尾部(如“http://www.sampleapp.com/inbox/test.css”),这种正则表达式同样会匹配成功。如果正则表达式尾部使用了“$”符,那么就不会匹配这种恶意URL地址。

缓存机制

攻击的第2个条件是web应用启用了Web缓存功能,并且会根据文件的扩展名来缓存,同时会忽略掉任何缓存头部。

1、Cloudflare

不幸的是,当访问恶意URL地址时,web服务器会返回已有的动态页面的缓存头部,这意味着服务器很有可能会返回带有“no-cache”指令的文件。

幸运的是,Cloudflare存在一个名为“边缘缓存过期TTL(Edge

cache expire TTL)”的功能,这个功能可以用来覆盖任何已有的头部信息。将该功能设置为启用(on)状态时,服务器返回的带有“no-cache”指令的文件仍会被缓存下来。出于各种原因,在Cloudflare的建议下,该功能通常会处于启用状态。

2、IIS ARR

应用程序请求路由(Application Request Routing,ARR)模块可以为IIS带来负载均衡功能。

ARR模块提供的一个功能就是缓存功能。Web服务器可以通过负载均衡器设置缓存规则,以便将文件保存到缓存目录中。在创建新的缓存规则时,使用通配符和目标扩展名来定义待缓存的文件类型。当文件经过ARR处理时,ARR会根据文件对应的URL来匹配缓存规则。实际上,ARR会根据URL尾部的扩展名来识别文件类型。

此外,IIS ARR中还包含一个选项,可以忽略掉文件的缓存头部,导致该规则在任何情况下都适用。

如果客户端访问恶意URL(http://www.sampleapp.com/welcome.php/test.css),那么缓存目录中就会生成一个新的目录,目录名为welcome.php,在该目录中,会生成名为test.css的一个新的文件,该文件的内容为用户访问的welcome.php页面的内容

3、Nginx

作为负载均衡服务器,NGINX服务器也可以提供缓存功能,来缓存从web服务器返回的页面。

可以通过NGINX配置文件来配置缓存规则。如果使用下图所示的配置文件,那么NGINX就会缓存特定类型的静态文件,并且会忽略这些文件的缓存头部。

当来自于web服务器的某个页面到达NGINX时,NGINX会搜索URL尾部的扩展名,根据扩展名识别文件的类型。

当经过认证的用户访问恶意URL时(http://www.sampleapp.com/app/welcome.php/test.css),用户的页面就会被缓存到缓存目录中。

缓解措施

1、配置缓存策略,只有文件的HTTP缓存头部允许缓存时,才会缓存文件

2、将所有的静态文件保存到某个指定目录,并且只缓存这个目录。

3、配置web服务器,使其在处理诸如“http://www.example.com/home.php/nonexistent.css”的页面时,不会返回home.php的内容,而会返回404或者302响应。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 上一篇《WEB请求处理一:浏览器请求发起处理》,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建...
    七寸知架构阅读 81,284评论 21 356
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,678评论 25 708
  • 其实就是因为睡不着,关了灯还是睁着眼睛。城市的夜不够黑,窗外的路灯总是能透进一些光来。 许多年没能静下心来写一点睡...
    邬小悲阅读 481评论 0 2
  • 函数是用来完成特定任务的独立的代码块。可以给函数起一个名字,用于标识一个函数,当函数需要执行的时候,这个名字就会用...
    EndEvent阅读 752评论 1 3