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
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
这是对帖子中提出的技术的总结 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
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。