缓存投毒原理


https://xz.aliyun.com/t/7696#toc-0

缓存位于服务器和用户之间,通常在固定的时间内保存(缓存)对特定请求的响应。如果另一个用户在这段时间内发送了同样的请求,则缓存会直接提供响应的副本(缓存)给用户,而无需与服务器直接进行交互。通过减少服务器对重复请求进行处理的次数,来减轻服务器的负担。使用CDN(内容分发网络)就可以达到这样的目的。
缓存投毒原理_第1张图片

当缓存接收到HTTP请求的时候,它会匹配vary头部指定的HTTP HEADER,用“Vary”响应头来指定额外应该加入到缓存键中的其他请求头,来进行判断。 比如

Host: example.com
User-Agent: Mozilla/5.0 … Firefox/57.0
Cookie: language=pl;
Connection: close

当一个页面的内容被缓存后,其他用户访问这个页面时会接收到同样的内容。如果在缓存的过程中,存入了有害的内容,比如存入了一个带有XSS payload的页面。其他用户访问时,就会受到XSS漏洞的攻击。这就是缓存投毒。

缓存投毒的发现与利用

  1. 判断哪些非缓存键会影响页面内容

    任何的缓存投毒都依赖于非缓存键,所以我们在一开始就要判断哪些HTTP头部属于缓存键,哪些不属于。再通过修改或添加HTTP头部来判断哪些头部会引起页面内容的变化。常用的两种方式:

    1. 手动修改或添加HTTP头部,指定随机字符来判断头部是否影响页面内容
    2. 使用Brupsuite插件Param Miner来自动判断
  2. 构造内容引起服务器端的有害响应

    针对不同的非缓存键,我们需要知道哪些非缓存键会导致页面返回有害的内容。举一个例子:页面中js链接的域名是通过获取HTTP头部中的“X-Forwarded-Host”字段来设置的。而服务器不会将这个字段作为缓存键,那么这个字段就可以利用。

  3. 获取响应,使有害内容被缓存

    通过构造有害的内容,访问页面,获取响应。就会将有害的内容存入缓存中。需要注意的是,页面是否会被缓存受到文件扩展名、内容类型、url路由、状态代码和响应标头的影响。在测试的会比较麻烦。

你可能感兴趣的:(缓存投毒原理)