.. | ||
cookie-bomb.md | ||
cookie-jar-overflow.md | ||
cookie-tossing.md | ||
README.md |
Χακτιβισμός με Cookies
Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!
Άλλοι τρόποι υποστήριξης του HackTricks:
- Αν θέλετε να δείτε την εταιρεία σας διαφημισμένη στο HackTricks ή να κατεβάσετε το HackTricks σε μορφή PDF ελέγξτε τα ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ!
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Ανακαλύψτε την Οικογένεια PEASS, τη συλλογή μας από αποκλειστικά NFTs
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα τηλεγράφου ή ακολουθήστε μας στο Twitter 🐦 @carlospolopm.
- Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια του GitHub.
Try Hard Security Group
{% embed url="https://discord.gg/tryhardsecurity" %}
Χαρακτηριστικά των Cookies
Τα Cookies έχουν αρκετά χαρακτηριστικά που ελέγχουν τη συμπεριφορά τους στον περιηγητή του χρήστη. Εδώ είναι μια επισκόπηση αυτών των χαρακτηριστικών με μια πιο παθητική φωνή:
Λήξη και Max-Age
Η ημερομηνία λήξης ενός cookie καθορίζεται από το χαρακτηριστικό Expires
. Αντίστροφα, το χαρακτηριστικό Max-age
ορίζει το χρόνο σε δευτερόλεπτα μέχρι το cookie να διαγραφεί. Επιλέξτε το Max-age
καθώς αντικατοπτρίζει πιο σύγχρονες πρακτικές.
Domain
Οι φιλοξενούμενοι που λαμβάνουν ένα cookie καθορίζονται από το χαρακτηριστικό Domain
. Από προεπιλογή, αυτό ορίζεται στον φιλοξενούντα που εξέδωσε το cookie, χωρίς να συμπεριλαμβάνει τα υποτομεία του. Ωστόσο, όταν το χαρακτηριστικό Domain
ορίζεται ρητά, περιλαμβάνει επίσης τα υποτομεία. Αυτό καθιστά την προδιαγραφή του χαρακτηριστικού Domain
μια λιγότερο περιοριστική επιλογή, χρήσιμη για περιπτώσεις όπου είναι απαραίτητο το κοινή χρήση των cookies σε υποτομεία. Για παράδειγμα, η ρύθμιση Domain=mozilla.org
καθιστά τα cookies προσβάσιμα στα υποτομεία του όπως το developer.mozilla.org
.
Διαδρομή
Μια συγκεκριμένη διαδρομή URL που πρέπει να υπάρχει στο αιτούμενο URL για την αποστολή της κεφαλίδας Cookie
υποδεικνύεται από το χαρακτηριστικό Path
. Αυτό το χαρακτηριστικό θεωρεί τον χαρακτήρα /
ως διαχωριστικό καταλόγου, επιτρέποντας τις αντιστοιχίες σε υποκαταλόγους επίσης.
Κανόνες Ταξινόμησης
Όταν δύο cookies έχουν το ίδιο όνομα, το επιλεγόμενο για αποστολή βασίζεται σε:
- Το cookie που ταιριάζει με τη μακρύτερη διαδρομή στο αιτούμενο URL.
- Το πιο πρόσφατα ορισμένο cookie αν οι διαδρομές είναι ίδιες.
SameSite
- Το χαρακτηριστικό
SameSite
καθορίζει εάν τα cookies αποστέλλονται σε αιτήσεις που προέρχονται από τομείς τρίτων. Προσφέρει τρεις ρυθμίσεις: - Αυστηρό: Περιορίζει το cookie από την αποστολή σε αιτήσεις τρίτων.
- Χαλαρό: Επιτρέπει το cookie να αποσταλεί με αιτήσεις GET που ξεκινούν από ιστότοπους τρίτων.
- Κανένα: Επιτρέπει το cookie να αποσταλεί από οποιοδήποτε τομέα τρίτων.
Να θυμάστε, κατά τη διαμόρφωση των cookies, η κατανόηση αυτών των χαρακτηριστικών μπορεί να βοηθήσει να εξασφαλιστεί ότι θα συμπεριφέρονται όπως αναμένεται σε διαφορετικά σενάρια.
Τύπος Αιτήματος | Παράδειγμα Κώδικα | Cookies Αποστέλλονται Όταν |
---|---|---|
Σύνδεσμος | <a href="..."></a> | NotSet*, Lax, None |
Προεκτέλεση | <link rel="prerender" href=".."/> | NotSet*, Lax, None |
Φόρμα GET | <form method="GET" action="..."> | NotSet*, Lax, None |
Φόρμα POST | <form method="POST" action="..."> | NotSet*, None |
iframe | <iframe src="..."></iframe> | NotSet*, None |
AJAX | $.get("...") | NotSet*, None |
Εικόνα | <img src="..."> | NetSet*, None |
Πίνακας από Invicti και ελαφρώς τροποποιημένο.
Ένα cookie με το χαρακτηριστικό SameSite θα ελαττώσει τις επιθέσεις CSRF όπου απαιτείται μια συνεδρία σύνδεσης.
*Σημειώστε ότι από το Chrome80 (Φεβ/2019) η προεπιλεγμένη συμπεριφορά ενός cookie χωρίς το χαρακτηριστικό samesite θα είναι χαλαρή (https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/).
Σημειώστε ότι προσωρινά, μετά την εφαρμογή αυτής της αλλαγής, τα cookies χωρίς πολιτική SameSite στο Chrome θα χειριστούν ως None κατά τα πρώτα 2 λεπτά και στη συνέχεια ως Lax για αιτήματα POST διασταυρούμενων τομέων κορυφαίου επιπέδου.
Σημαίες των Cookies
HttpOnly
Αυτό αποφεύγει τον πελάτη να έχει πρόσβαση στο cookie (Μέσω Javascript για παράδειγμα: document.cookie
)
Παρακάμψεις
- Αν η σελίδα στέλνει τα cookies ως απάντηση μιας αιτήσεως (για παράδειγμα σε μια σελίδα PHPinfo), είναι δυνατό να καταχραστείτε το XSS για να στείλετε μια αίτηση σε αυτή τη σελίδα και να κλέψετε τα cookies από την απάντηση (ελέγξτε ένα παράδειγμα στο https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/.
- Αυτό μπορεί να Παρακαμφθεί με αιτήσεις TRACE HTTP καθώς η απάντηση από τον διακομιστή (εάν αυτή η μέθοδος HTTP είναι διαθέσιμη) θα αντανακλά τα cookies που στάλθηκαν. Αυτή η τεχνική ονομάζεται Cross-Site Tracking.
- Αυτή η τεχνική αποφεύγεται από τους σύγχρονους περιηγητές μη επιτρέποντας την αποστολή ενός αιτήματος TRACE από το JS. Ωστόσο, έχουν βρεθεί κάποιες παρακάμψεις σε αυτό σε συγκεκριμένο λογισμικό όπως η αποστολή
\r\nTRACE
αντί γιαTRACE
στο IE6.0 SP2. - Ένας άλλος τρόπος είναι η εκμετάλλευση ευπάθειών μηδέν/ημέρας των περιηγητών.
- Είναι δυνατό να **αν
Επιθέσεις με Cookies
Εάν ένα προσαρμοσμένο cookie περιέχει ευαίσθητα δεδομένα, ελέγξτε το (ειδικά αν παίζετε ένα CTF), καθώς ενδέχεται να είναι ευάλωτο.
Αποκωδικοποίηση και Αλλοίωση Cookies
Τα ευαίσθητα δεδομένα που ενσωματώνονται σε cookies πρέπει πάντα να ελέγχονται προσεκτικά. Τα cookies που κωδικοποιούνται σε Base64 ή παρόμοιες μορφές μπορούν συχνά να αποκωδικοποιηθούν. Αυτή η ευπάθεια επιτρέπει στους επιτιθέμενους να τροποποιήσουν το περιεχόμενο του cookie και να υποκριθούν άλλους χρήστες κωδικοποιώντας τα τροποποιημένα δεδομένα τους πίσω στο cookie.
Απαγωγή Συνεδρίας
Αυτή η επίθεση περιλαμβάνει την κλοπή του cookie ενός χρήστη για να αποκτήσει μη εξουσιοδοτημένη πρόσβαση στον λογαριασμό του σε μια εφαρμογή. Χρησιμοποιώντας το κλεμμένο cookie, ένας επιτιθέμενος μπορεί να υποκριθεί τον νόμιμο χρήστη.
Σταθεροποίηση Συνεδρίας
Σε αυτό το σενάριο, ένας επιτιθέμενος εξαπατά ένα θύμα να χρησιμοποιήσει ένα συγκεκριμένο cookie για να συνδεθεί. Εάν η εφαρμογή δεν αναθέτει ένα νέο cookie κατά τη σύνδεση, ο επιτιθέμενος, κατέχοντας το αρχικό cookie, μπορεί να υποκριθεί το θύμα. Αυτή η τεχνική βασίζεται στο γεγονός ότι το θύμα συνδέεται με ένα cookie που παρέχεται από τον επιτιθέμενο.
Εάν βρήκατε ένα XSS σε ένα υποτομέα ή εάν έχετε έλεγχο ενός υποτομέα, διαβάστε:
{% content-ref url="cookie-tossing.md" %} cookie-tossing.md {% endcontent-ref %}
Δωρεά Συνεδρίας
Εδώ, ο επιτιθέμενος πείθει το θύμα να χρησιμοποιήσει το session cookie του επιτιθέμενου. Το θύμα, πιστεύοντας ότι έχει συνδεθεί στον δικό του λογαριασμό, θα εκτελέσει απροσδόκητα ενέργειες στο πλαίσιο του λογαριασμού του επιτιθέμενου.
Εάν βρήκατε ένα XSS σε ένα υποτομέα ή εάν έχετε έλεγχο ενός υποτομέα, διαβάστε:
{% content-ref url="cookie-tossing.md" %} cookie-tossing.md {% endcontent-ref %}
Cookies JWT
Κάντε κλικ στον προηγούμενο σύνδεσμο για να αποκτήσετε πρόσβαση σε μια σελίδα που εξηγεί πιθανές ελαττώματα στα JWT.
Τα JSON Web Tokens (JWT) που χρησιμοποιούνται σε cookies μπορεί επίσης να παρουσιάζουν ευπάθειες. Για λεπτομερείς πληροφορίες σχετικά με πιθανά ελαττώματα και πώς να τα εκμεταλλευτείτε, συνιστάται η πρόσβαση στο έγγραφο που συνδέεται με το hacking JWT.
Παραβίαση Αιτήσεων Από Διαφορετικές Ιστοσελίδες (CSRF)
Αυτή η επίθεση αναγκάζει έναν συνδεδεμένο χρήστη να εκτελέσει μη επιθυμητες ενέργειες σε μια ιστοσελίδα στην οποία είναι επί του παρόντος πιστοποιημένος. Οι επιτιθέμενοι μπορούν να εκμεταλλευτούν cookies που στέλνονται αυτόματα με κάθε αίτηση προς την ευάλωτη ιστοσελίδα.
Κενά Cookies
(Ελέγξτε περαιτέρω λεπτομέρειες στην αρχική έρευνα) Οι περιηγητές επιτρέπουν τη δημιουργία cookies χωρίς όνομα, το οποίο μπορεί να επιδειχθεί μέσω JavaScript ως εξής:
document.cookie = "a=v1"
document.cookie = "=test value;" // Setting an empty named cookie
document.cookie = "b=v2"
Το αποτέλεσμα στην κεφαλίδα cookie που στάλθηκε είναι a=v1; test value; b=v2;
. Ενδιαφέροντα, αυτό επιτρέπει την παρεμβολή στα cookies εάν ένα cookie με κενό όνομα έχει οριστεί, ενδεχομένως ελέγχοντας άλλα cookies με τον καθορισμό του κενού cookie σε μια συγκεκριμένη τιμή:
function setCookie(name, value) {
document.cookie = `${name}=${value}`;
}
setCookie("", "a=b"); // Setting the empty cookie modifies another cookie's value
Chrome Σφάλμα: Θέμα με τον Κωδικό Συνεχούς Unicode
Στο Chrome, εάν ένας κωδικός συνεχούς Unicode είναι μέρος ενός συνόλου cookie, το document.cookie
διαστρέφεται, επιστρέφοντας στη συνέχεια μια κενή συμβολοσειρά:
document.cookie = "\ud800=meep";
Αυτό έχει ως αποτέλεσμα το document.cookie
να εξάγει μια κενή συμβολοσειρά, υποδεικνύοντας μόνιμη διαφθορά.
Λειτουργία Εισροής Cookies Λόγω Προβλημάτων Ανάλυσης
(Ελέγξτε περισσότερες λεπτομέρειες στην αρχική έρευνα) Πολλοί διακομιστές ιστού, συμπεριλαμβανομένων αυτών από Java (Jetty, TomCat, Undertow) και Python (Zope, cherrypy, web.py, aiohttp, bottle, webob), χειρίζονται εσφαλμένα τις συμβολοσειρές cookie λόγω της ξεπερασμένης υποστήριξης του RFC2965. Διαβάζουν μια τιμή cookie που είναι διπλά-εισαγμένη ως μια μόνο τιμή ακόμα κι αν περιλαμβάνει ερωτηματικά, τα οποία θα έπρεπε να χωρίζουν κανονικά τα ζεύγη κλειδιού-τιμής:
RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
Ευπάθειες Έγχυσης Cookies
(Ελέγξτε περισσότερες λεπτομέρειες στην αρχική έρευνα) Η εσφαλμένη ανάλυση των cookies από διακομιστές, ειδικά Undertow, Zope, και αυτούς που χρησιμοποιούν τα http.cookie.SimpleCookie
και http.cookie.BaseCookie
της Python, δημιουργεί ευκαιρίες για επιθέσεις έγχυσης cookies. Αυτοί οι διακομιστές αποτυγχάνουν να ορθώς περιορίσουν την έναρξη νέων cookies, επιτρέποντας σε επιτιθέμενους να πλαστογραφήσουν cookies:
- Ο Undertow περιμένει ένα νέο cookie αμέσως μετά από μια παραθέση χωρίς ερωτηματικό.
- Το Zope ψάχνει για ένα κόμμα για να ξεκινήσει την ανάλυση του επόμενου cookie.
- Οι κλάσεις cookie της Python ξεκινούν την ανάλυση σε ένα χαρακτήρα κενού.
Αυτή η ευπάθεια είναι ιδιαίτερα επικίνδυνη σε web εφαρμογές που βασίζονται στην προστασία CSRF με βάση τα cookies, καθώς επιτρέπει σε επιτιθέμενους να εισάγουν πλαστογραφημένα cookies με το CSRF-token, πιθανώς παρακάμπτοντας μέτρα ασφαλείας. Το πρόβλημα επιδεινώνεται από τη χειριστική της Python για διπλότυπα ονόματα cookies, όπου η τελευταία εμφάνιση αντικαθιστά τις προηγούμενες. Επίσης, δημιουργεί ανησυχίες για τα cookies __Secure-
και __Host-
σε ανασφαλείς συμφράσεις και θα μπορούσε να οδηγήσει σε παρακάμψεις εξουσιοδότησης όταν τα cookies περνιούν σε διακομιστές που είναι ευάλωτοι στην πλαστογράφηση.
Επιπλέον Ευάλωτοι Έλεγχοι Cookies
Βασικοί Έλεγχοι
- Το cookie είναι ίδιο κάθε φορά που συνδέεστε.
- Αποσυνδεθείτε και δοκιμάστε να χρησιμοποιήσετε το ίδιο cookie.
- Δοκιμάστε να συνδεθείτε με 2 συσκευές (ή περιηγητές) στο ίδιο λογαριασμό χρησιμοποιώντας το ίδιο cookie.
- Ελέγξτε αν το cookie περιέχει κάποιες πληροφορίες και δοκιμάστε να το τροποποιήσετε.
- Δοκιμάστε να δημιουργήσετε αρκετούς λογαριασμούς με σχεδόν το ίδιο όνομα χρήστη και ελέγξτε αν μπορείτε να δείτε ομοιότητες.
- Ελέγξτε την επιλογή "Να με θυμάσαι" αν υπάρχει για να δείτε πώς λειτουργεί. Αν υπάρχει και μπορεί να είναι ευάλωτη, χρησιμοποιήστε πάντα το cookie του να με θυμάσαι χωρίς κανένα άλλο cookie.
- Ελέγξτε αν το προηγούμενο cookie λειτουργεί ακόμα ακόμα και αφού αλλάξετε τον κωδικό πρόσβασης.
Προηγμένες επιθέσεις με cookies
Αν το cookie παραμένει το ίδιο (ή σχεδόν) όταν συνδέεστε, αυτό πιθανότατα σημαίνει ότι το cookie σχετίζεται με κάποιο πεδίο του λογαριασμού σας (πιθανώς το όνομα χρήστη). Τότε μπορείτε:
- Δοκιμάστε να δημιουργήσετε πολλούς λογαριασμούς με πολύ παρόμοια ονόματα χρηστών και δοκιμάστε να μαντέψετε πώς λειτουργεί ο αλγόριθμος.
- Δοκιμάστε να bruteforce το όνομα χρήστη. Αν το cookie αποθηκεύει μόνο ως μέθοδο πιστοποίησης για το όνομα χρήστη σας, τότε μπορείτε να δημιουργήσετε ένα λογαριασμό με όνομα χρήστη "Bmin" και να bruteforce κάθε μοναδικό bit του cookie σας επειδή ένα από τα cookies που θα δοκιμάσετε θα είναι αυτό που ανήκει στον "admin".
- Δοκιμάστε το Padding Oracle (μπορείτε να αποκρυπτογραφήσετε το περιεχόμενο του cookie). Χρησιμοποιήστε το padbuster.
Padding Oracle - Παραδείγματα Padbuster
padbuster <URL/path/when/successfully/login/with/cookie> <COOKIE> <PAD[8-16]>
# When cookies and regular Base64
padbuster http://web.com/index.php u7bvLewln6PJPSAbMb5pFfnCHSEd6olf 8 -cookies auth=u7bvLewln6PJPSAbMb5pFfnCHSEd6olf
# If Base64 urlsafe or hex-lowercase or hex-uppercase --encoding parameter is needed, for example:
padBuster http://web.com/home.jsp?UID=7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6
7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6 8 -encoding 2
Ο Padbuster θα κάνει αρκετές προσπάθειες και θα σας ρωτήσει ποια συνθήκη είναι η συνθήκη σφάλματος (αυτή που δεν είναι έγκυρη).
Στη συνέχεια, θα αρχίσει να αποκρυπτογραφεί το cookie (μπορεί να διαρκέσει αρκετά λεπτά).
Αν η επίθεση πραγματοποιηθεί με επιτυχία, τότε μπορείτε να δοκιμάσετε να κρυπτογραφήσετε μια συμβολοσειρά της επιλογής σας. Για παράδειγμα, αν θέλατε να κρυπτογραφήσετε user=administrator.
padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext user=administrator
Αυτή η εκτέλεση θα σας δώσει το cookie σωστά κρυπτογραφημένο και κωδικοποιημένο με το string user=administrator μέσα.
CBC-MAC
Ίσως ένα cookie μπορεί να έχει κάποια τιμή και να υπογράφεται χρησιμοποιώντας CBC. Στη συνέχεια, η ακεραιότητα της τιμής είναι η υπογραφή που δημιουργείται χρησιμοποιώντας CBC με την ίδια τιμή. Καθώς συνιστάται να χρησιμοποιείται ως IV ένα μηδενικό διάνυσμα, αυτός ο τύπος ελέγχου ακεραιότητας θα μπορούσε να είναι ευάλωτος.
Η επίθεση
- Λάβετε την υπογραφή του ονόματος χρήστη administ = t
- Λάβετε την υπογραφή του ονόματος χρήστη rator\x00\x00\x00 XOR t = t'
- Ορίστε στο cookie την τιμή administrator+t' (t' θα είναι μια έγκυρη υπογραφή του (rator\x00\x00\x00 XOR t) XOR t = rator\x00\x00\x00
ECB
Αν το cookie είναι κρυπτογραφημένο χρησιμοποιώντας ECB θα μπορούσε να είναι ευάλωτο.
Όταν συνδέεστε, το cookie που λαμβάνετε πρέπει να είναι πάντα το ίδιο.
Πώς να ανιχνεύσετε και να επιτεθείτε:
Δημιουργήστε 2 χρήστες με σχεδόν τα ίδια δεδομένα (όνομα χρήστη, κωδικό πρόσβασης, email, κλπ.) και προσπαθήστε να ανακαλύψετε κάποιο πρότυπο μέσα στο δεδομένο cookie
Δημιουργήστε ένα χρήστη με το όνομα για παράδειγμα "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" και ελέγξτε αν υπάρχει κάποιο πρότυπο στο cookie (καθώς το ECB κρυπτογραφεί με τον ίδιο κλειδί κάθε block, τα ίδια κρυπτογραφημένα bytes μπορεί να εμφανιστούν αν το όνομα χρήστη είναι κρυπτογραφημένο).
Θα πρέπει να υπάρχει ένα πρότυπο (με το μέγεθος ενός χρησιμοποιούμενου block). Έτσι, γνωρίζοντας πώς κρυπτογραφούνται μια σειρά "a" μπορείτε να δημιουργήσετε ένα όνομα χρήστη: "a"*(μέγεθος του block)+"admin". Στη συνέχεια, μπορείτε να διαγράψετε το κρυπτογραφημένο πρότυπο ενός block από το cookie. Και θα έχετε το cookie του ονόματος χρήστη "admin".
Αναφορές
- https://blog.ankursundara.com/cookie-bugs/
- https://www.linkedin.com/posts/rickey-martin-24533653_100daysofhacking-penetrationtester-ethicalhacking-activity-7016286424526180352-bwDd
Try Hard Security Group
{% embed url="https://discord.gg/tryhardsecurity" %}
Μάθετε το hacking στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!
Άλλοι τρόποι υποστήριξης του HackTricks:
- Αν θέλετε να δείτε την εταιρεία σας διαφημισμένη στο HackTricks ή να κατεβάσετε το HackTricks σε PDF ελέγξτε τα ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ!
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Ανακαλύψτε την Οικογένεια PEASS, τη συλλογή μας από αποκλειστικά NFTs
- Εγγραφείτε στη 💬 ομάδα Discord ή στη ομάδα τηλεγραφήματος ή ακολουθήστε μας στο Twitter 🐦 @carlospolopm.
- Μοιραστείτε τα κόλπα σας στο hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια του github.