hacktricks/src/pentesting-web/cache-deception/cache-poisoning-via-url-discrepancies.md

53 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Cache Poisoning via URL discrepancies
{{#include ../../banners/hacktricks-training.md}}
这是对帖子中提出的技术的总结 [https://portswigger.net/research/gotta-cache-em-all](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`
{{#include ../../banners/hacktricks-training.md}}