Cache Poisoning via URL discrepancies
Αυτή είναι μια περίληψη των τεχνικών που προτείνονται στην ανάρτηση https://portswigger.net/research/gotta-cache-em-all προκειμένου να εκτελούνται επιθέσεις cache poisoning καταχρώντας τις διαφορές μεταξύ cache proxies και web servers.
Ο στόχος αυτής της επίθεσης είναι να κάνει τον cache server να πιστεύει ότι φορτώνεται ένας στατικός πόρος έτσι ώστε να τον αποθηκεύει στην cache ενώ ο cache server αποθηκεύει ως κλειδί cache μέρος της διαδρομής αλλά ο web server απαντά επιλύοντας μια άλλη διαδρομή. Ο web server θα επιλύσει τη πραγματική διαδρομή που θα φορτώνει μια δυναμική σελίδα (η οποία μπορεί να αποθηκεύει ευαίσθητες πληροφορίες σχετικά με τον χρήστη, ένα κακόβουλο payload όπως XSS ή να ανακατευθύνει για να φορτώσει ένα αρχείο JS από τον ιστότοπο του επιτιθέμενου για παράδειγμα).
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
.
Last updated