# Cache Poisoning via URL discrepancies
{% hint style="success" %}
Μάθετε & εξασκηθείτε στο AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Μάθετε & εξασκηθείτε στο GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)!
* **Εγγραφείτε στην** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}
Αυτή είναι μια περίληψη των τεχνικών που προτείνονται στην ανάρτηση [https://portswigger.net/research/gotta-cache-em-all](https://portswigger.net/research/gotta-cache-em-all) προκειμένου να εκτελούνται επιθέσεις cache poisoning **καταχρώντας τις διαφορές μεταξύ cache proxies και web servers.**
{% hint style="info" %}
Ο στόχος αυτής της επίθεσης είναι να **κάνει τον cache server να πιστεύει ότι φορτώνεται ένας στατικός πόρος** έτσι ώστε να τον αποθηκεύει στην cache ενώ ο cache server αποθηκεύει ως κλειδί cache μέρος της διαδρομής αλλά ο web server απαντά επιλύοντας μια άλλη διαδρομή. Ο web server θα επιλύσει τη πραγματική διαδρομή που θα φορτώνει μια δυναμική σελίδα (η οποία μπορεί να αποθηκεύει ευαίσθητες πληροφορίες σχετικά με τον χρήστη, ένα κακόβουλο payload όπως XSS ή να ανακατευθύνει για να φορτώσει ένα αρχείο JS από τον ιστότοπο του επιτιθέμενου για παράδειγμα).
{% endhint %}
## Delimiters
**URL delimiters** διαφέρουν ανάλογα με το framework και τον server, επηρεάζοντας τον τρόπο που δρομολογούνται τα αιτήματα και χειρίζονται οι απαντήσεις. Ορισμένοι κοινοί διαχωριστές προέλευσης είναι:
* **Ερωτηματικό**: Χρησιμοποιείται στο Spring για μεταβλητές matrix (π.χ. `/hello;var=a/world;var1=b;var2=c` → `/hello/world`).
* **Τελεία**: Προσδιορίζει τη μορφή απάντησης στο Ruby on Rails (π.χ. `/MyAccount.css` → `/MyAccount`)
* **Null Byte**: Συντομεύει διαδρομές στο OpenLiteSpeed (π.χ. `/MyAccount%00aaa` → `/MyAccount`).
* **Newline Byte**: Διαχωρίζει τα στοιχεία URL στο Nginx (π.χ. `/users/MyAccount%0aaaa` → `/account/MyAccount`).
Άλλοι συγκεκριμένοι διαχωριστές μπορεί να βρεθούν ακολουθώντας αυτή τη διαδικασία:
* **Βήμα 1**: Εντοπίστε μη cacheable αιτήματα και χρησιμοποιήστε τα για να παρακολουθήσετε πώς χειρίζονται τα URLs με πιθανές διαχωριστές.
* **Βήμα 2**: Προσθέστε τυχαίους επιθέτες σε διαδρομές και συγκρίνετε την απάντηση του server για να προσδιορίσετε αν ένας χαρακτήρας λειτουργεί ως διαχωριστής.
* **Βήμα 3**: Εισάγετε πιθανούς διαχωριστές πριν από τον τυχαίο επιθέτη για να δείτε αν η απάντηση αλλάζει, υποδεικνύοντας τη χρήση διαχωριστή.
## Normalization & Encodings
* **Σκοπός**: Οι αναλυτές URL και στους δύο cache και origin servers κανονικοποιούν τα URLs για να εξάγουν διαδρομές για την αντιστοίχιση σημείων και τα κλειδιά cache.
* **Διαδικασία**: Εντοπίζει τους διαχωριστές διαδρομής, εξάγει και κανονικοποιεί τη διαδρομή αποκωδικοποιώντας χαρακτήρες και αφαιρώντας τμήματα τελείας.
### **Encodings**
Διαφορετικοί HTTP servers και proxies όπως Nginx, Node και CloudFront αποκωδικοποιούν τους διαχωριστές διαφορετικά, οδηγώντας σε ασυνέπειες σε CDNs και origin servers που θα μπορούσαν να εκμεταλλευτούν. Για παράδειγμα, αν ο web server εκτελεί αυτή τη μετατροπή `/myAccount%3Fparam` → `/myAccount?param` αλλά ο cache server διατηρεί ως κλειδί τη διαδρομή `/myAccount%3Fparam`, υπάρχει μια ασυνέπεια.
Ένας τρόπος για να ελέγξετε αυτές τις ασυνέπειες είναι να στείλετε αιτήματα URL κωδικοποιώντας διαφορετικούς χαρακτήρες μετά τη φόρτωση της διαδρομής χωρίς καμία κωδικοποίηση και να ελέγξετε αν η απάντηση της κωδικοποιημένης διαδρομής προήλθε από την αποθηκευμένη απάντηση.
### Dot segment
Η κανονικοποίηση διαδρομής όπου εμπλέκονται οι τελείες είναι επίσης πολύ ενδιαφέρουσα για επιθέσεις cache poisoning. Για παράδειγμα, `/static/../home/index` ή `/aaa..\home/index`, ορισμένοι cache servers θα αποθηκεύσουν αυτές τις διαδρομές με τον εαυτό τους ως κλειδιά ενώ άλλοι μπορεί να επιλύσουν τη διαδρομή και να χρησιμοποιήσουν `/home/index` ως το κλειδί cache.\
Ακριβώς όπως πριν, η αποστολή αυτού του είδους αιτημάτων και η επαλήθευση αν η απάντηση συγκεντρώθηκε από την cache βοηθά στην αναγνώριση αν η απάντηση για το `/home/index` είναι η απάντηση που στάλθηκε όταν ζητήθηκαν αυτές οι διαδρομές.
## Static Resources
Πολλοί cache servers θα αποθηκεύσουν πάντα μια απάντηση αν αναγνωριστεί ως στατική. Αυτό μπορεί να οφείλεται σε:
* **Η επέκταση**: Το 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
* Είναι δυνατόν να αναγκάσετε μια cache να αποθηκεύσει μια δυναμική απάντηση χρησιμοποιώντας έναν διαχωριστή και μια στατική επέκταση όπως ένα αίτημα προς το `/home$image.png` θα αποθηκεύσει το `/home$image.png` και ο origin server θα απαντήσει με το `/home`
* **Γνωστές στατικές καταλόγους**: Οι παρακάτω κατάλογοι περιέχουν στατικά αρχεία και επομένως η απάντησή τους θα πρέπει να αποθηκευτεί: /static, /assets, /wp-content, /media, /templates, /public, /shared
* Είναι δυνατόν να αναγκάσετε μια cache να αποθηκεύσει μια δυναμική απάντηση χρησιμοποιώντας έναν διαχωριστή, έναν στατικό κατάλογο και τελείες όπως: `/home/..%2fstatic/something` θα αποθηκεύσει το `/static/something` και η απάντηση θα είναι `/home`
* **Στατικοί κατάλογοι + τελείες**: Ένα αίτημα προς το `/static/..%2Fhome` ή προς το `/static/..%5Chome` μπορεί να αποθηκευτεί όπως είναι αλλά η απάντηση μπορεί να είναι `/home`
* **Στατικά αρχεία:** Ορισμένα συγκεκριμένα αρχεία αποθηκεύονται πάντα όπως το `/robots.txt`, `/favicon.ico`, και `/index.html`. Τα οποία μπορούν να καταχραστούν όπως το `/home/..%2Frobots.txt` όπου η cache μπορεί να αποθηκεύσει το `/robots.txt` και ο origin server να απαντήσει στο `/home`.
{% hint style="success" %}
Μάθετε & εξασκηθείτε στο AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Μάθετε & εξασκηθείτε στο GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)!
* **Εγγραφείτε στην** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}