# 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}}