参考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响应。