Cache Poisoning via URL discrepancies

Reading time: 6 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

这是对帖子中提出的技术的总结 https://portswigger.net/research/gotta-cache-em-all,目的是执行缓存中毒攻击 利用缓存代理和Web服务器之间的差异。

note

此攻击的目标是 让缓存服务器认为正在加载一个静态资源,因此它会缓存该资源,而缓存服务器将路径的一部分存储为缓存键,但Web服务器响应解析另一个路径。Web服务器将解析实际路径,这将加载一个动态页面(可能存储有关用户的敏感信息、恶意负载如XSS,或重定向以从攻击者网站加载JS文件等)。

Delimiters

URL分隔符因框架和服务器而异,影响请求的路由和响应的处理。一些常见的源分隔符包括:

  • 分号:在Spring中用于矩阵变量(例如 /hello;var=a/world;var1=b;var2=c/hello/world)。
  • :在Ruby on Rails中指定响应格式(例如 /MyAccount.css/MyAccount)。
  • 空字节:在OpenLiteSpeed中截断路径(例如 /MyAccount%00aaa/MyAccount)。
  • 换行字节:在Nginx中分隔URL组件(例如 /users/MyAccount%0aaaa/account/MyAccount)。

在此过程中可能会发现其他特定的分隔符:

  • 步骤1:识别不可缓存的请求,并使用它们监控带有潜在分隔符的URL的处理方式。
  • 步骤2:将随机后缀附加到路径,并比较服务器的响应以确定字符是否作为分隔符。
  • 步骤3:在随机后缀之前引入潜在分隔符,以查看响应是否发生变化,指示分隔符的使用。

Normalization & Encodings

  • 目的:缓存和源服务器中的URL解析器规范化URL,以提取路径以进行端点映射和缓存键。
  • 过程:识别路径分隔符,通过解码字符和删除点段提取并规范化路径。

Encodings

不同的HTTP服务器和代理(如Nginx、Node和CloudFront)以不同方式解码分隔符,导致CDN和源服务器之间的不一致,这可能被利用。例如,如果Web服务器执行此转换 /myAccount%3Fparam/myAccount?param,但缓存服务器将路径 /myAccount%3Fparam 作为键保留,则存在不一致。

检查这些不一致的一种方法是发送请求URL编码不同字符,在加载路径时不进行任何编码,并检查编码路径的响应是否来自缓存响应。

Dot segment

涉及点的路径规范化对于缓存中毒攻击也非常有趣。例如,/static/../home/index/aaa..\home/index,一些缓存服务器将这些路径缓存为它们自己作为键,而其他服务器可能解析路径并使用 /home/index 作为缓存键。
就像之前一样,发送这些请求并检查响应是否来自缓存有助于识别对 /home/index 的响应是否是请求这些路径时发送的响应。

Static Resources

一些缓存服务器如果识别为静态资源,将始终缓存响应。这可能是因为:

  • 扩展名:Cloudflare将始终缓存以下扩展名的文件:7z, csv, gif, midi, png, tif, zip, avi, doc, gz, mkv, ppt, tiff, zst, avif, docx, ico, mp3, pptx, ttf, apk, dmg, iso, mp4, ps, webm, bin, ejs, jar, ogg, rar, webp, bmp, eot, jpg, otf, svg, woff, bz2, eps, jpeg, pdf, svgz, woff2, class, exe, js, pict, swf, xls, css, flac, mid, pls, tar, xlsx
  • 可以通过使用分隔符和静态扩展强制缓存存储动态响应,例如请求 /home$image.png 将缓存 /home$image.png,而源服务器将响应 /home
  • 知名静态目录:以下目录包含静态文件,因此其响应应被缓存:/static, /assets, /wp-content, /media, /templates, /public, /shared
  • 可以通过使用分隔符、静态目录和点强制缓存存储动态响应,例如:/home/..%2fstatic/something 将缓存 /static/something,而响应将是 /home
  • 静态目录 + 点:请求 /static/..%2Fhome/static/..%5Chome 可能会按原样缓存,但响应可能是 /home
  • 静态文件:一些特定文件始终被缓存,如 /robots.txt/favicon.ico/index.html。这可以被滥用,例如 /home/..%2Frobots.txt,其中缓存可能存储 /robots.txt,而源服务器响应 /home

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks