Cache Poisoning and Cache Deception
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:
What is the difference between web cache poisoning and web cache deception?
Στην καταστροφή της μνήμης cache του ιστού, ο επιτιθέμενος προκαλεί την εφαρμογή να αποθηκεύσει κάποιο κακόβουλο περιεχόμενο στη μνήμη cache, και αυτό το περιεχόμενο σερβίρεται από τη μνήμη cache σε άλλους χρήστες της εφαρμογής.
Στην παραπλάνηση της μνήμης cache του ιστού, ο επιτιθέμενος προκαλεί την εφαρμογή να αποθηκεύσει κάποιο ευαίσθητο περιεχόμενο που ανήκει σε άλλο χρήστη στη μνήμη cache, και ο επιτιθέμενος στη συνέχεια ανακτά αυτό το περιεχόμενο από τη μνήμη cache.
Η καταστροφή της μνήμης cache στοχεύει στη χειραγώγηση της μνήμης cache πλευράς του πελάτη για να αναγκάσει τους πελάτες να φορτώσουν πόρους που είναι απροσδόκητοι, μερικοί ή υπό τον έλεγχο ενός επιτιθέμενου. Το εύρος της επίδρασης εξαρτάται από τη δημοτικότητα της επηρεαζόμενης σελίδας, καθώς η μολυσμένη απάντηση σερβίρεται αποκλειστικά σε χρήστες που επισκέπτονται τη σελίδα κατά την περίοδο μόλυνσης της μνήμης cache.
Η εκτέλεση μιας επίθεσης καταστροφής της μνήμης cache περιλαμβάνει αρκετά βήματα:
Ταυτοποίηση Μη Κλειδωμένων Εισόδων: Αυτές είναι παράμετροι που, αν και δεν απαιτούνται για να αποθηκευτεί ένα αίτημα στη μνήμη cache, μπορούν να αλλάξουν την απάντηση που επιστρέφει ο διακομιστής. Η ταυτοποίηση αυτών των εισόδων είναι κρίσιμη καθώς μπορούν να εκμεταλλευτούν για να χειραγωγήσουν τη μνήμη cache.
Εκμετάλλευση των Μη Κλειδωμένων Εισόδων: Αφού ταυτοποιηθούν οι μη κλειδωμένες είσοδοι, το επόμενο βήμα περιλαμβάνει την ανακάλυψη του τρόπου κακής χρήσης αυτών των παραμέτρων για να τροποποιηθεί η απάντηση του διακομιστή με τρόπο που να ωφελεί τον επιτιθέμενο.
Διασφάλιση ότι η Μολυσμένη Απάντηση είναι Αποθηκευμένη: Το τελικό βήμα είναι να διασφαλιστεί ότι η χειραγωγημένη απάντηση αποθηκεύεται στη μνήμη cache. Με αυτόν τον τρόπο, οποιοσδήποτε χρήστης έχει πρόσβαση στη μολυσμένη σελίδα ενώ η μνήμη cache είναι μολυσμένη θα λάβει την μολυσμένη απάντηση.
Συνήθως, όταν μια απάντηση έχει αποθηκευτεί στη μνήμη cache θα υπάρχει μια κεφαλίδα που το υποδεικνύει, μπορείτε να ελέγξετε ποιες κεφαλίδες πρέπει να προσέξετε σε αυτή την ανάρτηση: HTTP Cache headers.
Αν σκέφτεστε ότι η απάντηση αποθηκεύεται σε μια μνήμη cache, θα μπορούσατε να προσπαθήσετε να στείλετε αιτήματα με κακή κεφαλίδα, η οποία θα πρέπει να απαντηθεί με κωδικό κατάστασης 400. Στη συνέχεια, προσπαθήστε να αποκτήσετε πρόσβαση στο αίτημα κανονικά και αν η απάντηση είναι κωδικός κατάστασης 400, ξέρετε ότι είναι ευάλωτο (και θα μπορούσατε ακόμη και να εκτελέσετε μια DoS).
Μπορείτε να βρείτε περισσότερες επιλογές στο:
Cache Poisoning to DoSΩστόσο, σημειώστε ότι μερικές φορές αυτοί οι τύποι κωδικών κατάστασης δεν αποθηκεύονται στη μνήμη cache οπότε αυτή η δοκιμή μπορεί να μην είναι αξιόπιστη.
Μπορείτε να χρησιμοποιήσετε Param Miner για να επιτεθείτε σε παραμέτρους και κεφαλίδες που μπορεί να αλλάζουν την απάντηση της σελίδας. Για παράδειγμα, μια σελίδα μπορεί να χρησιμοποιεί την κεφαλίδα X-Forwarded-For
για να υποδείξει στον πελάτη να φορτώσει το σενάριο από εκεί:
Με την παράμετρο/κεφαλίδα που έχει εντοπιστεί, ελέγξτε πώς καθαρίζεται και πού αντικατοπτρίζεται ή επηρεάζει την απάντηση από την κεφαλίδα. Μπορείτε να το εκμεταλλευτείτε με κάποιον τρόπο (να εκτελέσετε XSS ή να φορτώσετε έναν κωδικό JS που ελέγχετε; να εκτελέσετε DoS;...)
Αφού έχετε εντοπίσει τη σελίδα που μπορεί να εκμεταλλευτεί, ποια παράμετρος/κεφαλίδα να χρησιμοποιήσετε και πώς να εκμεταλλευτείτε αυτήν, πρέπει να λάβετε τη σελίδα αποθηκευμένη στην cache. Ανάλογα με τον πόρο που προσπαθείτε να αποθηκεύσετε στην cache, αυτό μπορεί να πάρει κάποιο χρόνο, ίσως χρειαστεί να προσπαθήσετε για αρκετά δευτερόλεπτα.
Η κεφαλίδα X-Cache
στην απάντηση μπορεί να είναι πολύ χρήσιμη καθώς μπορεί να έχει την τιμή miss
όταν το αίτημα δεν αποθηκεύτηκε στην cache και την τιμή hit
όταν είναι αποθηκευμένο.
Η κεφαλίδα Cache-Control
είναι επίσης ενδιαφέρον να γνωρίζετε αν ένας πόρος αποθηκεύεται στην cache και πότε θα είναι η επόμενη φορά που ο πόρος θα αποθηκευτεί ξανά: Cache-Control: public, max-age=1800
Μια άλλη ενδιαφέρουσα κεφαλίδα είναι η Vary
. Αυτή η κεφαλίδα χρησιμοποιείται συχνά για να υποδείξει πρόσθετες κεφαλίδες που θεωρούνται μέρος του κλειδιού cache ακόμη και αν κανονικά δεν είναι κλειδωμένες. Επομένως, αν ο χρήστης γνωρίζει το User-Agent
του θύματος που στοχεύει, μπορεί να δηλητηριάσει την cache για τους χρήστες που χρησιμοποιούν αυτό το συγκεκριμένο User-Agent
.
Μια ακόμη κεφαλίδα σχετική με την cache είναι η Age
. Ορίζει τον χρόνο σε δευτερόλεπτα που το αντικείμενο έχει παραμείνει στην cache του proxy.
Όταν αποθηκεύετε ένα αίτημα στην cache, να είστε προσεκτικοί με τις κεφαλίδες που χρησιμοποιείτε γιατί μερικές από αυτές μπορεί να χρησιμοποιηθούν απροσδόκητα ως κλειδωμένες και το θύμα θα χρειαστεί να χρησιμοποιήσει αυτήν την ίδια κεφαλίδα. Πάντα δοκιμάστε μια Δηλητηρίαση Cache με διαφορετικούς περιηγητές για να ελέγξετε αν λειτουργεί.
Μια κεφαλίδα όπως το X-Forwarded-For
αντικατοπτρίζεται στην απάντηση χωρίς καθαρισμό.
Μπορείτε να στείλετε ένα βασικό payload XSS και να δηλητηριάσετε την cache ώστε όλοι όσοι έχουν πρόσβαση στη σελίδα να υποστούν XSS:
Σημειώστε ότι αυτό θα δηλητηριάσει ένα αίτημα προς /en?region=uk
και όχι προς /en
Τα cookies θα μπορούσαν επίσης να ανακλώνται στην απόκριση μιας σελίδας. Εάν μπορείτε να το εκμεταλλευτείτε για να προκαλέσετε XSS, για παράδειγμα, θα μπορούσατε να είστε σε θέση να εκμεταλλευτείτε XSS σε αρκετούς πελάτες που φορτώνουν την κακόβουλη απόκριση cache.
Σημειώστε ότι αν το ευάλωτο cookie χρησιμοποιείται πολύ από τους χρήστες, οι κανονικές αιτήσεις θα καθαρίζουν την cache.
Ελέγξτε:
Cache Poisoning via URL discrepanciesΑυτή η αναφορά εξηγεί πώς ήταν δυνατό να κλαπεί ένα OpenAI API key με μια διεύθυνση URL όπως https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123
επειδή οτιδήποτε ταιριάζει με /share/*
θα αποθηκευτεί στην cache χωρίς να κανονικοποιηθεί η διεύθυνση URL από το Cloudflare, κάτι που έγινε όταν η αίτηση έφτασε στον web server.
Αυτό εξηγείται επίσης καλύτερα σε:
Cache Poisoning via URL discrepanciesΜερικές φορές θα χρειαστεί να εκμεταλλευτείτε αρκετές μη κλειδωμένες εισόδους για να μπορέσετε να καταχραστείτε μια cache. Για παράδειγμα, μπορεί να βρείτε μια Ανοιχτή ανακατεύθυνση αν ορίσετε το X-Forwarded-Host
σε ένα domain που ελέγχετε και το X-Forwarded-Scheme
σε http
. Αν ο server προωθεί όλα τα HTTP αιτήματα σε HTTPS και χρησιμοποιεί την κεφαλίδα X-Forwarded-Scheme
ως το όνομα του domain για την ανακατεύθυνση. Μπορείτε να ελέγξετε πού δείχνει η σελίδα μέσω της ανακατεύθυνσης.
Vary
headerΑν διαπιστώσετε ότι ο X-Host
header χρησιμοποιείται ως όνομα τομέα για τη φόρτωση ενός JS πόρου αλλά ο Vary
header στην απάντηση υποδεικνύει User-Agent
. Τότε, πρέπει να βρείτε έναν τρόπο να εξάγετε τον User-Agent του θύματος και να δηλητηριάσετε την cache χρησιμοποιώντας αυτόν τον user agent:
Στείλτε ένα GET αίτημα με το αίτημα στη διεύθυνση URL και στο σώμα. Αν ο διακομιστής ιστού χρησιμοποιεί αυτό από το σώμα αλλά ο διακομιστής cache αποθηκεύει αυτό από τη διεύθυνση URL, οποιοσδήποτε έχει πρόσβαση σε αυτή τη διεύθυνση URL θα χρησιμοποιήσει στην πραγματικότητα την παράμετρο από το σώμα. Όπως η ευπάθεια που βρήκε ο James Kettle στον ιστότοπο του Github:
There it a portswigger lab about this: https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get
Για παράδειγμα, είναι δυνατόν να διαχωρίσετε παραμέτρους σε διακομιστές ruby χρησιμοποιώντας τον χαρακτήρα ;
αντί για &
. Αυτό θα μπορούσε να χρησιμοποιηθεί για να τοποθετήσετε τις τιμές παραμέτρων χωρίς κλειδί μέσα σε κλειδωμένες και να τις εκμεταλλευτείτε.
Portswigger lab: https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking
Μάθετε εδώ πώς να εκτελέσετε Cache Poisoning επιθέσεις εκμεταλλευόμενοι το HTTP Request Smuggling.
Ο Web Cache Vulnerability Scanner μπορεί να χρησιμοποιηθεί για αυτόματη δοκιμή για web cache poisoning. Υποστηρίζει πολλές διαφορετικές τεχνικές και είναι πολύ παραμετροποιήσιμος.
Example usage: wcvs -u example.com
Ο ATS προώθησε το τμήμα μέσα στο URL χωρίς να το αφαιρέσει και δημιούργησε το κλειδί cache χρησιμοποιώντας μόνο τον host, το path και το query (αγνοώντας το τμήμα). Έτσι, το αίτημα /#/../?r=javascript:alert(1)
στάλθηκε στο backend ως /#/../?r=javascript:alert(1)
και το κλειδί cache δεν είχε το payload μέσα του, μόνο host, path και query.
Η αποστολή μιας κακής τιμής στην κεφαλίδα content-type προκάλεσε μια 405 cached απάντηση. Το κλειδί cache περιείχε το cookie, επομένως ήταν δυνατόν να επιτεθεί μόνο σε μη αυθεντικοποιημένους χρήστες.
Το GitLab χρησιμοποιεί GCP buckets για να αποθηκεύει στατικό περιεχόμενο. GCP Buckets υποστηρίζουν την κεφαλίδα x-http-method-override
. Έτσι, ήταν δυνατόν να σταλεί η κεφαλίδα x-http-method-override: HEAD
και να δηλητηριαστεί η cache ώστε να επιστρέφει ένα κενό σώμα απάντησης. Θα μπορούσε επίσης να υποστηρίξει τη μέθοδο PURGE
.
Σε εφαρμογές Ruby on Rails, συχνά χρησιμοποιείται το Rack middleware. Ο σκοπός του κώδικα Rack είναι να πάρει την τιμή της κεφαλίδας x-forwarded-scheme
και να την ορίσει ως το σχήμα του αιτήματος. Όταν σταλεί η κεφαλίδα x-forwarded-scheme: http
, συμβαίνει μια 301 ανακατεύθυνση στην ίδια τοποθεσία, προκαλώντας ενδεχομένως μια Άρνηση Υπηρεσίας (DoS) σε αυτόν τον πόρο. Επιπλέον, η εφαρμογή μπορεί να αναγνωρίσει την κεφαλίδα X-forwarded-host
και να ανακατευθύνει τους χρήστες στον καθορισμένο host. Αυτή η συμπεριφορά μπορεί να οδηγήσει στη φόρτωση αρχείων JavaScript από τον διακομιστή ενός επιτιθέμενου, θέτοντας σε κίνδυνο την ασφάλεια.
Η Cloudflare προηγουμένως αποθήκευε 403 απαντήσεις. Η προσπάθεια πρόσβασης σε S3 ή Azure Storage Blobs με λανθασμένες κεφαλίδες Authorization θα είχε ως αποτέλεσμα μια 403 απάντηση που αποθηκεύτηκε. Αν και η Cloudflare έχει σταματήσει να αποθηκεύει 403 απαντήσεις, αυτή η συμπεριφορά μπορεί να είναι ακόμα παρούσα σε άλλες υπηρεσίες proxy.
Οι caches συχνά περιλαμβάνουν συγκεκριμένες παραμέτρους GET στο κλειδί cache. Για παράδειγμα, το Varnish της Fastly αποθήκευε την παράμετρο size
σε αιτήματα. Ωστόσο, αν μια URL-encoded έκδοση της παραμέτρου (π.χ. siz%65
) αποσταλεί επίσης με λανθασμένη τιμή, το κλειδί cache θα κατασκευαστεί χρησιμοποιώντας την σωστή παράμετρο size
. Ωστόσο, το backend θα επεξεργαστεί την τιμή στην URL-encoded παράμετρο. Η URL-encoding της δεύτερης παραμέτρου size
οδήγησε στην παράλειψή της από την cache αλλά στη χρήση της από το backend. Η εκχώρηση μιας τιμής 0 σε αυτή την παράμετρο είχε ως αποτέλεσμα ένα cacheable 400 Bad Request σφάλμα.
Ορισμένοι προγραμματιστές αποκλείουν αιτήματα με user-agents που ταιριάζουν με αυτά εργαλείων υψηλής κυκλοφορίας όπως το FFUF ή το Nuclei για να διαχειριστούν το φορτίο του διακομιστή. Σαρκαστικά, αυτή η προσέγγιση μπορεί να εισάγει ευπάθειες όπως η δηλητηρίαση cache και DoS.
Η RFC7230 καθορίζει τους αποδεκτούς χαρακτήρες στα ονόματα κεφαλίδων. Οι κεφαλίδες που περιέχουν χαρακτήρες εκτός της καθορισμένης tchar περιοχής θα έπρεπε ιδανικά να προκαλούν μια 400 Bad Request απάντηση. Στην πράξη, οι διακομιστές δεν τηρούν πάντα αυτό το πρότυπο. Ένα αξιοσημείωτο παράδειγμα είναι η Akamai, η οποία προωθεί κεφαλίδες με μη έγκυρους χαρακτήρες και αποθηκεύει οποιοδήποτε 400 σφάλμα, αρκεί να μην είναι παρούσα η κεφαλίδα cache-control
. Ένα εκμεταλλεύσιμο μοτίβο εντοπίστηκε όπου η αποστολή μιας κεφαλίδας με έναν παράνομο χαρακτήρα, όπως το \
, θα είχε ως αποτέλεσμα ένα cacheable 400 Bad Request σφάλμα.
https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6
Ο στόχος της Cache Deception είναι να κάνει τους πελάτες να φορτώνουν πόρους που πρόκειται να αποθηκευτούν από την cache με τις ευαίσθητες πληροφορίες τους.
Πρώτα απ' όλα, σημειώστε ότι οι επέκταση όπως .css
, .js
, .png
κ.λπ. είναι συνήθως ρυθμισμένες να αποθηκεύονται στην cache. Επομένως, αν αποκτήσετε πρόσβαση στο www.example.com/profile.php/nonexistent.js
, η cache θα αποθηκεύσει πιθανώς την απάντηση επειδή βλέπει την επέκταση .js
. Αλλά, αν η εφαρμογή αναπαράγει με το ευαίσθητο περιεχόμενο χρήστη που αποθηκεύεται στο www.example.com/profile.php, μπορείτε να κλέψετε αυτά τα περιεχόμενα από άλλους χρήστες.
Άλλα πράγματα για δοκιμή:
www.example.com/profile.php/.js
www.example.com/profile.php/.css
www.example.com/profile.php/test.js
www.example.com/profile.php/../test.js
www.example.com/profile.php/%2e%2e/test.js
Χρησιμοποιήστε λιγότερο γνωστές επεκτάσεις όπως .avif
Ένα άλλο πολύ σαφές παράδειγμα μπορεί να βρεθεί σε αυτή τη γραφή: https://hackerone.com/reports/593712. Στο παράδειγμα, εξηγείται ότι αν φορτώσετε μια ανύπαρκτη σελίδα όπως http://www.example.com/home.php/non-existent.css, το περιεχόμενο του http://www.example.com/home.php (με τις ευαίσθητες πληροφορίες του χρήστη) θα επιστραφεί και ο διακομιστής cache θα αποθηκεύσει το αποτέλεσμα. Στη συνέχεια, ο επιτιθέμενος μπορεί να αποκτήσει πρόσβαση στο http://www.example.com/home.php/non-existent.css στον δικό του περιηγητή και να παρατηρήσει τις εμπιστευτικές πληροφορίες των χρηστών που είχαν πρόσβαση πριν.
Σημειώστε ότι ο cache proxy θα πρέπει να είναι ρυθμισμένος να αποθηκεύει αρχεία βάσει της επέκτασης του αρχείου (.css) και όχι βάσει του content-type. Στο παράδειγμα http://www.example.com/home.php/non-existent.css θα έχει ένα text/html
content-type αντί για ένα text/css
mime type (το οποίο είναι το αναμενόμενο για ένα .css αρχείο).
Μάθετε εδώ πώς να εκτελέσετε Cache Deceptions επιθέσεις εκμεταλλευόμενοι το HTTP Request Smuggling.
toxicache: Σαρωτής Golang για να βρείτε ευπάθειες web cache poisoning σε μια λίστα URL και να δοκιμάσετε πολλές τεχνικές έγχυσης.
Χρησιμοποιήστε Trickest για να δημιουργήσετε και να ** αυτοματοποιήσετε ροές εργασίας** που υποστηρίζονται από τα πιο προηγμένα εργαλεία της κοινότητας. Αποκτήστε πρόσβαση σήμερα:
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)