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

53 lines
7.6 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) для виконання атак на отруєння кешу **зловживаючи розбіжностями між кеш-проксі та веб-серверами.**
> [!NOTE]
> Мета цієї атаки полягає в тому, щоб **змусити кеш-сервер думати, що завантажується статичний ресурс**, тому він кешує його, в той час як кеш-сервер зберігає частину шляху як ключ кешу, але веб-сервер відповідає, розв'язуючи інший шлях. Веб-сервер розв'яже реальний шлях, який завантажить динамічну сторінку (яка може містити чутливу інформацію про користувача, шкідливий код, наприклад, 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`).
- **Байт нового рядка**: Розділяє компоненти URL в Nginx (наприклад, `/users/MyAccount%0aaaa``/account/MyAccount`).
Інші специфічні роздільники можуть бути знайдені, слідуючи цьому процесу:
- **Крок 1**: Визначте незахищені запити та використовуйте їх для моніторингу того, як обробляються URL з потенційними роздільниками.
- **Крок 2**: Додайте випадкові суфікси до шляхів і порівняйте відповідь сервера, щоб визначити, чи функціонує символ як роздільник.
- **Крок 3**: Введіть потенційні роздільники перед випадковим суфіксом, щоб перевірити, чи змінюється відповідь, що вказує на використання роздільника.
## Normalization & Encodings
- **Мета**: Парсери URL як у кеш-серверах, так і в серверах походження нормалізують URL для витягування шляхів для відображення кінцевих точок і ключів кешу.
- **Процес**: Визначає роздільники шляху, витягує та нормалізує шлях, декодуючи символи та видаляючи сегменти з крапками.
### **Encodings**
Різні HTTP-сервери та проксі, такі як Nginx, Node та CloudFront, декодують роздільники по-різному, що призводить до несумісностей між CDN та серверами походження, які можуть бути використані. Наприклад, якщо веб-сервер виконує цю трансформацію `/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}}