mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
53 lines
4.3 KiB
Markdown
53 lines
4.3 KiB
Markdown
# 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}}
|