hacktricks/pentesting-web/cache-deception/README.md

30 KiB
Raw Blame History

Ατζέντα Κατάχρησης Κρυφού Αποθηκευτικού Χώρου και Απάτης Κρυφού Αποθηκευτικού Χώρου

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Ερυθρού Συνεργείου HackTricks AWS)!

Άλλοι τρόποι υποστήριξης των HackTricks:


Χρησιμοποιήστε το Trickest για να δημιουργήσετε εύκολα και να αυτοματοποιήσετε ροές εργασίας με τα πιο προηγμένα εργαλεία της κοινότητας.
Αποκτήστε πρόσβαση σήμερα:

{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %}

Η διαφορά

Ποια είναι η διαφορά μεταξύ κατάχρησης κρυφού αποθηκευτικού χώρου στον ιστό και απάτης κρυφού αποθηκευτικού χώρου στον ιστό;

  • Στην κατάχρηση κρυφού αποθηκευτικού χώρου στον ιστό, ο επιτιθέμενος προκαλεί την εφαρμογή να αποθηκεύσει κάποιο κακόβουλο περιεχόμενο στη μνήμη cache, και αυτό το περιεχόμενο εξυπηρετείται από τη μνήμη cache σε άλλους χρήστες της εφαρμογής.
  • Στην απάτη κρυφού αποθηκευτικού χώρου στον ιστό, ο επιτιθέμενος προκαλεί την εφαρμογή να αποθηκεύσει κάποιο ευαίσθητο περιεχόμενο που ανήκει σε άλλο χρήστη στη μνήμη cache, και στη συνέχεια ο επιτιθέμενος ανακτά αυτό το περιεχόμενο από τη μνήμη cache.

Κατάχρηση Κρυφού Αποθηκευτικού Χώρου

Η κατάχρηση κρυφού αποθηκευτικού χώρου στοχεύει στην παραπλάνηση της μνήμης cache της πλευράς του πελάτη για να αναγκάσει τους πελάτες να φορτώσουν πόρους που είναι απροσδόκητοι, μερικοί ή υπό τον έλεγχο ενός επιτιθέμενου. Η έκταση της επίδρασης εξαρτάται από τη δημοφιλία της σελίδας που επηρεάζεται, καθώς η μολυσμένη απάντηση εξυπηρετείται αποκλειστικά σε χρήστες που επισκέπτονται τη σελίδα κατά την περίοδο μόλυνσης της μνήμης cache.

Η εκτέλεση μιας επίθεσης κατάχρησης κρυφού αποθηκευτικού χώρου περιλαμβάνει αρκετά βήματα:

  1. Αναγνώριση των Μη-Κλειδωμένων Εισόδων: Αυτά είναι παράμετροι που, αν και δεν απαιτούνται για να αποθηκευτεί μια αίτηση, μπορεί να τροποποιήσουν την απάντηση που επιστρέφεται από τον διακομιστή. Η αναγνώριση αυτών των εισόδων είναι κρίσιμη καθώς μπορούν να εκμεταλλευτούν για να τροποποιήσουν τη μνήμη cache.
  2. Εκμετάλλευση των Μη-Κλειδωμένων Εισόδων: Μετά την αναγνώριση των μη-κλειδωμένων εισόδων, το επόμενο βήμα είναι να καταλάβετε πώς να εκμεταλλευτείτε αυτές τις παραμέτρους για να τροποποιήσετε την απάντηση του διακομιστή με έναν τρόπο που εξυπηρετεί τον επιτιθέμενο.
  3. Βεβαίωση ότι η Μολυσμένη Απάντηση Αποθηκεύεται: Το τελευταίο βήμα είναι να βεβαιωθείτε ότι η τροποποιημένη απάντηση αποθηκεύεται στη μνήμη cache. Με αυτόν τον τρόπο, οποιοσδήποτε χρήστης έχει πρόσβαση στην επηρεασμένη σελίδα κατά την περίοδο της μόλυνσης της μνήμης cache θα λάβει τη μολυσμένη απάντηση.

Ανακάλυψη: Έλεγχος κεφαλίδων HTTP

Συνήθως, όταν μια απάντηση ήταν αποθηκευμένη στη μνήμη cache θα υπάρχει ένα κεφάλιο που το υποδεικνύει, μπορείτε να ελέγξετε ποια κεφάλια πρέπει να προσέξετε σε αυτήν την ανάρτηση: Κεφαλίδες Αποθήκευσης HTTP.

Ανακάλυψη: Κωδικοί σφαλμάτων αποθήκευσης

Αν υποψιάζεστε ότι η απάντηση αποθηκεύεται σε μνήμη cache, θα μπορούσατε να στείλετε αιτήσεις με ένα κακό κεφάλι, το οποίο θα έπρεπε να απαντηθεί με ένα κωδικό κατάστασης 400. Στη συνέχεια δοκιμάστε να έχετε πρόσβαση στο αίτημα κανονικά και αν η απάντηση είναι κωδικός κατάστασης 400, ξέρετε ότι είναι ευάλωτη (και μπορείτε ακόμη να πραγματοποιήσετε ένα DoS).

Μπορείτε να βρείτε περισσότερες επιλογές στο:

{% content-ref url="cache-poisoning-to-dos.md" %} cache-poisoning-to-dos.md {% endcontent-ref %}

Ωστόσο, σημειώστε ότι μερικές φορές αυτοί οι τύποι κωδικών κατάστασης δεν αποθηκεύονται έτσι αυτό το τεστ δεν θα μπορούσε να είναι αξιόπιστο.

Ανακάλυψη: Αναγνώριση και αξιολόγηση μη-κλειδωμένων εισόδων

Μπορείτε να χρησιμοποιήσετε το Param Miner για να δοκιμάσετε με βία παραμέτρους και κεφαλίδες που μπορεί να αλλάζουν την απάντηση της σελίδας. Για παράδειγμα, μια σελίδα μπορεί να χρησιμοποιεί το κεφάλι X-Forwarded-For για να υποδείξει στον πελάτη να φορτώσει το σενάριο από εκεί:

<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>

Εξαγωγή επιβλαβούς απάντησης από τον διακομιστή πίσω από το back-end

Με την παράμετρο/κεφαλίδα που εντοπίσατε, ελέγξτε πώς γίνεται η απολύμανση και πού αντανακλάται ή επηρεάζει την απόκριση από την κεφαλίδα. Μπορείτε να το καταχραστείτε με οποιονδήποτε τρόπο (να εκτελέσετε XSS ή να φορτώσετε έναν κώδικα JS που ελέγχετε εσείς; να εκτελέσετε DoS;...)

Λήψη της αποθηκευμένης απόκρισης

Μόλις έχετε εντοπίσει τη σελίδα που μπορεί να καταχραστεί, ποια παράμετρος/κεφαλίδα να χρησιμοποιήσετε και πώς να το καταχραστείτε, πρέπει να λάβετε τη σελίδα αποθηκευμένη. Ανάλογα με τον πόρο που προσπαθείτε να αποκτήσετε στην cache, αυτό μπορεί να πάρει κάποιο χρόνο, ίσως χρειαστεί να προσπαθήσετε για μερικά δευτερόλεπτα.
Η κεφαλίδα X-Cache στην απόκριση μπορεί να είναι πολύ χρήσιμη καθώς μπορεί να έχει την τιμή miss όταν το αίτημα δεν ήταν αποθηκευμένο και την τιμή hit όταν είναι αποθηκευμένο.
Η κεφαλίδα Cache-Control είναι επίσης ενδιαφέρουσα για να γνωρίζετε αν ένας πόρος αποθηκεύεται και πότε θα αποθηκευτεί ξανά ο πόρος: Cache-Control: public, max-age=1800
Μια άλλη ενδιαφέρουσα κεφαλίδα είναι η Vary. Αυτή η κεφαλίδα χρησιμοποιείται συχνά για να υποδεικνύει επιπλέον κεφαλίδες που θεωρούνται μέρος του κλειδιού της cache ακόμα κι αν συνήθως δεν είναι κλειδωμένες. Επομένως, αν ο χρήστης γνωρίζει το User-Agent του θύματος που στοχεύει, μπορεί να δηλητηριάσει την cache για τους χρήστες που χρησιμοποιούν αυτό το συγκεκριμένο User-Agent.
Μια ακόμη κεφαλίδα που σχετίζεται με την cache είναι η Age. Ορίζει το χρόνο σε δευτερόλεπτα που το αντικείμενο έχει παραμείνει στην προϋπολογιστική cache.

Όταν αποθηκεύετε ένα αίτημα, να είστε προσεκτικοί με τις κεφαλίδες που χρησιμοποιείτε επειδή κάποιες από αυτές θα μπορούσαν να χρησιμοποιηθούν απροσδόκητα ως κλειδωμένες και το θύμα θα πρέπει να χρησιμοποιήσει αυτήν την ίδια κεφαλίδα. Δοκιμάστε πάντα ένα Δηλητηριασμός Προσωρινής Μνήμης με διαφορετικούς περιηγητές για να ελέγξετε αν λειτουργεί.

Παραδείγματα Εκμετάλλευσης

Ευκολότερο παράδειγμα

Μια κεφαλίδα όπως το X-Forwarded-For αντανακλάται στην απόκριση χωρίς απολύτως απολύτως απολύμανση.
Μπορείτε να στείλετε ένα βασικό φορτωμένο XSS και να δηλητηριάσετε την cache έτσι ώστε όλοι όσοι έχουν πρόσβαση στη σελίδα θα έχουν XSS:

GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: a."><script>alert(1)</script>"

Note ότι αυτό θα δημιουργήσει μια δημιουργία στο αίτημα προς /en?region=uk και όχι προς /en

Δημιουργία cache για DoS

{% content-ref url="cache-poisoning-to-dos.md" %} cache-poisoning-to-dos.md {% endcontent-ref %}

Τα cookies θα μπορούσαν επίσης να αντανακλώνται στην απόκριση μιας σελίδας. Αν μπορείτε να το εκμεταλλευτείτε για να προκαλέσετε ένα XSS για παράδειγμα, θα μπορούσατε να εκμεταλλευτείτε το XSS σε αρκετούς πελάτες που φορτώνουν την κακόβουλη απόκριση της cache.

GET / HTTP/1.1
Host: vulnerable.com
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"

Σημειώστε ότι εάν το ευάλωτο cookie χρησιμοποιείται συχνά από τους χρήστες, οι τακτικές αιτήσεις θα καθαρίζουν τη μνήμη cache.

Δηλητηρίαση cache με διάβαση διαδρομής για να κλέψετε το κλειδί API

Αυτή η ανάλυση εξηγεί πώς ήταν δυνατόν να κλαπεί ένα κλειδί API της OpenAI με ένα URL όπως https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123 επειδή οτιδήποτε ταιριάζει με /share/* θα αποθηκεύεται στην cache χωρίς η Cloudflare να κανονικοποιεί το URL, το οποίο έγινε όταν το αίτημα έφτασε στον web server.

Χρήση πολλαπλών κεφαλίδων για την εκμετάλλευση ευπάθειών δηλητηρίασης cache στο web

Μερικές φορές θα χρειαστεί να εκμεταλλευτείτε αρκετές μη-κλειδωμένες εισόδους για να μπορέσετε να καταχραστείτε μια cache. Για παράδειγμα, μπορείτε να βρείτε ένα Ανοικτό ανακατευτήρισμα (Open redirect) εάν ορίσετε το X-Forwarded-Host σε ένα τομέα που ελέγχετε εσείς και το X-Forwarded-Scheme σε http. Αν ο διακομιστής προωθεί όλα τα αιτήματα HTTP σε HTTPS και χρησιμοποιεί την κεφαλίδα X-Forwarded-Scheme ως το όνομα τομέα για την ανακατεύθυνση, μπορείτε να ελέγξετε προς πού θα οδηγηθεί η σελίδα με την ανακατεύθυνση.

GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/
X-Forwarded-Scheme: http

Εκμετάλλευση με περιορισμένο Vary header

Αν ανακαλύψετε ότι το X-Host header χρησιμοποιείται ως όνομα domain για τη φόρτωση ενός πόρου JS αλλά το Vary header στην απόκριση υποδεικνύει User-Agent, τότε πρέπει να βρείτε έναν τρόπο να εξαγάγετε το User-Agent του θύματος και να δηλητηριάσετε τη μνήμη cache χρησιμοποιώντας αυτόν τον user agent:

GET / HTTP/1.1
Host: vulnerbale.net
User-Agent: THE SPECIAL USER-AGENT OF THE VICTIM
X-Host: attacker.com

Παχύ Get

Στείλτε ένα αίτημα GET με το αίτημα τόσο στο URL όσο και στο σώμα. Εάν ο διακομιστής web χρησιμοποιεί αυτό από το σώμα αλλά ο διακομιστής cache αποθηκεύει αυτό από το URL, οποιοσδήποτε προσπελαύνει αυτό το URL θα χρησιμοποιήσει πραγματικά την παράμετρο από το σώμα. Όπως η ευπάθεια που εντόπισε ο James Kettle στην ιστοσελίδα του Github:

GET /contact/report-abuse?report=albinowax HTTP/1.1
Host: github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 22

report=innocent-victim

Απόκρυψη Παραμέτρων

Για παράδειγμα, είναι δυνατόν να χωρίσετε τις παραμέτρους σε διακομιστές ruby χρησιμοποιώντας τον χαρακτήρα ; αντί για το &. Αυτό μπορεί να χρησιμοποιηθεί για να τοποθετήσετε τιμές παραμέτρων χωρίς κλειδί μέσα σε κλειδωμένες και να τις καταχραστείτε.

Εργαστήριο Portswigger: https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking

Εκμεταλλευόμενοι την Ατέλεια Κρυπτογράφησης Κρυφής Μνήμης HTTP με την κατάχρηση της Ατέλειας Αιτήσεων HTTP Smuggling

Μάθετε εδώ πώς να εκτελέσετε επιθέσεις Κρυφής Μνήμης Προσωρινής Αποθήκευσης με την κατάχρηση της Αιτήσεων HTTP Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning).

Αυτοματοποιημένος Έλεγχος για Κρυφή Μνήμη Ιστού

Το Web Cache Vulnerability Scanner μπορεί να χρησιμοποιηθεί για τον αυτόματο έλεγχο της κρυφής μνήμης ιστού. Υποστηρίζει πολλές διαφορετικές τεχνικές και είναι υψηλά προσαρμόσιμο.

Παράδειγμα χρήσης: wcvs -u example.com


Χρησιμοποιήστε το Trickest για να δημιουργήσετε εύκολα και να αυτοματοποιήσετε ροές εργασίας με τα πιο προηγμένα εργαλεία της κοινότητας.
Αποκτήστε πρόσβαση σήμερα:

{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %}

Ευάλωτα Παραδείγματα

Apache Traffic Server (CVE-2021-27577)

Ο ATS προώθησε το κομμάτι μέσα στο URL χωρίς να το αφαιρέσει και δημιούργησε το κλειδί της μνήμης μόνο χρησιμοποιώντας τον κεντρικό υπολογιστή, τη διαδρομή και το ερώτημα (αγνοώντας το κομμάτι). Έτσι, το αίτημα /#/../?r=javascript:alert(1) στάλθηκε στον πίσω χώρο ως /#/../?r=javascript:alert(1) και το κλειδί της μνήμης δεν είχε το φορτίο μέσα σε αυτό, μόνο τον κεντρικό υπολογιστή, τη διαδρομή και το ερώτημα.

GitHub CP-DoS

Η αποστολή μιας κακής τιμής στην κεφαλίδα content-type προκάλεσε μια αποθηκευμένη απάντηση 405. Το κλειδί της μνήμης περιείχε το cookie, οπότε ήταν δυνατό μόνο να επιτεθεί σε μη εξουσιοδοτημένους χρήστες.

GitLab + GCP CP-DoS

Το GitLab χρησιμοποιεί κάδους GCP για την αποθήκευση στατικού περιεχομένου. Οι Κάδοι GCP υποστηρίζουν την κεφαλίδα x-http-method-override. Έτσι, ήταν δυνατό να σταλεί η κεφαλίδα x-http-method-override: HEAD και να δηλητηριάσει τη μνήμη προκειμένου να επιστρέψει ένα κενό σώμα απάντησης. Μπορούσε επίσης να υποστηρίξει τη μέθοδο PURGE.

Rack Middleware (Ruby on Rails)

Στις εφαρμογές Ruby on Rails, συχνά χρησιμοποιείται το Rack middleware. Ο σκοπός του κώδικα Rack είναι να πάρει την τιμή της κεφαλίδας x-forwarded-scheme και να την ορίσει ως το σχήμα του αιτήματος. Όταν στέλνεται η κεφαλίδα x-forwarded-scheme: http, συμβαίνει μια ανακατεύθυνση 301 στην ίδια τοποθεσία, προκαλώντας πιθανώς έναν Αποκλεισμό των Υπηρεσιών (DoS) σε αυτό το πόρισμα. Επιπλέον, η εφαρμογή ενδέχεται να αναγνωρίσει την κεφαλίδα X-forwarded-host και να ανακατευθύνει τους χρήστες στο καθορισμένο κεντρικό υπολογιστή. Αυτή η συμπεριφορά μπορεί να οδηγήσει στη φόρτωση αρχείων JavaScript από τον διακομιστή ενός επιτιθέμενου, δημιουργώντας έναν κίνδυνο ασφάλειας.

403 και Κάδοι Αποθήκευσης

Η Cloudflare προηγουμένως αποθήκευε απαντήσεις 403. Η προσπάθεια πρόσβασης σε S3 ή Azure Storage Blobs με εσφαλμένες κεφαλίδες Εξουσιοδότησης θα οδηγούσε σε μια απάντηση 403 που θα αποθηκευόταν. Αν και η Cloudflare έχει σταματήσει την αποθήκευση απαντήσεων 403, αυτή η συμπεριφορά ενδέχεται να εξακολουθεί να υπάρχει σε άλλες υπηρεσίες διαμεσολάβησης.

Ενσωμάτωση Κλειδωμένων Παραμέτρων

Οι μνήμες συχνά περιλαμβάνουν συγκεκριμένες παραμέτρους GET στο κλειδί της μνήμης. Για παράδειγμα, το Varnish της Fastly αποθήκευε την παράμετρο size στα αιτήματα. Ωστόσο, αν στάλθηκε επίσης μια εκδοχή κωδικοποιημένη με URL της παραμέτρου (π.χ., siz%65) με μια εσφαλμένη τιμή, το κλειδί της μνήμης θα κατασκευαζόταν χρησιμοποιώντας τη σωστή παράμετρο size. Ωστόσο, ο πίσω χώρος θα επεξεργαζόταν την τιμή στην παράμετρο κωδικοποιημένη με URL. Η κωδικοποίηση με URL της δεύτερης παραμέτρου size οδήγησε στην παράλειψή της από τη μνήμη αλλά στη χρήση της από τον πίσω χώρο. Η ανάθεση μιας τιμής 0 σε αυτήν την παράμετρο οδήγησε σε ένα cacheable σφάλμα 400 Bad Request.

Κανόνες Πράκτορα Χρήστη

Ορισμένοι προγραμματιστές αποκλείουν αιτήσεις με πράκτορες χρήστη που ταιριάζουν με αυτούς των εργαλείων υψηλής κίνησης όπως το FFUF ή το Nuclei για τη διαχείριση του φορτίου του διακομιστή. Παράδοξα, αυτή η προσέγγιση μπορεί να εισάγει ευπάθειες όπως η κατάχρηση της μνήμης cache και ο DoS.

Παράνομα Πεδία Κεφαλίδων

Το RFC7230 καθορίζει τους αποδεκτούς χαρακτήρες στα ονόματα των κεφαλίδων. Οι κεφαλίδες που περιέχουν χαρακτήρες εκτός του καθορισμένου εύρους tchar θα έπρεπε ιδανικά να προκαλούν μια απάντηση 400 Bad Request. Στην πράξη, οι διακομιστές δεν πάντα τηρούν αυτό το πρότυπο. Ένα ενδεικτικό παράδειγμα είναι η Akamai, η οποία προωθεί κεφαλίδες με μη έγκυρους χαρακτήρες και αποθηκεύει οποιοδήποτε σφάλμα 400, όσο το cache-control header δεν είναι παρόν. Εντοπίστηκε ένα εκμεταλλεύσιμο πρότυπο όπου η αποστολή μιας κεφαλίδας με έναν παράνομο χαρακτήρα, όπως \, θα οδηγούσε σε ένα cacheable σφάλμα 400 Bad Request.

Εύρεση νέων κεφαλ

Αυτόματα Εργαλεία

  • toxicache: Σαρωτής σε Golang για την εντοπισμό ευπαθειών δηλητηρίασης της μνήμης cache σε ιστοσελίδες σε μια λίστα διευθύνσεων URL και δοκιμή πολλαπλών τεχνικών εισαγωγής.

Αναφορές


Χρησιμοποιήστε το Trickest για να δημιουργήσετε εύκολα και να αυτοματοποιήσετε ροές εργασίας με τα πιο προηγμένα εργαλεία της κοινότητας.
Αποκτήστε πρόσβαση σήμερα:

{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %}

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks: