# XS-Search/XS-Leaks {{#include ../banners/hacktricks-training.md}} ## Basic Information XS-Search είναι μια μέθοδος που χρησιμοποιείται για **την εξαγωγή πληροφοριών από διαφορετικές προελεύσεις** εκμεταλλευόμενη **ευπάθειες πλευρικών καναλιών**. Τα κύρια στοιχεία που εμπλέκονται σε αυτή την επίθεση περιλαμβάνουν: - **Ευάλωτο Διαδίκτυο**: Ο στόχος ιστότοπος από τον οποίο προορίζεται να εξαχθούν πληροφορίες. - **Διαδίκτυο του Επιτιθέμενου**: Ο κακόβουλος ιστότοπος που δημιουργείται από τον επιτιθέμενο, τον οποίο επισκέπτεται το θύμα, φιλοξενώντας την εκμετάλλευση. - **Μέθοδος Συμπερίληψης**: Η τεχνική που χρησιμοποιείται για να ενσωματώσει το Ευάλωτο Διαδίκτυο στο Διαδίκτυο του Επιτιθέμενου (π.χ., window.open, iframe, fetch, HTML tag με href, κ.λπ.). - **Τεχνική Διαρροής**: Τεχνικές που χρησιμοποιούνται για να διακρίνουν διαφορές στην κατάσταση του Ευάλωτου Διαδικτύου με βάση τις πληροφορίες που συλλέγονται μέσω της μεθόδου συμπερίληψης. - **Καταστάσεις**: Οι δύο πιθανές συνθήκες του Ευάλωτου Διαδικτύου, τις οποίες ο επιτιθέμενος στοχεύει να διακρίνει. - **Ανιχνεύσιμες Διαφορές**: Παρατηρήσιμες παραλλαγές στις οποίες ο επιτιθέμενος βασίζεται για να συμπεράνει την κατάσταση του Ευάλωτου Διαδικτύου. ### Detectable Differences Διάφορες πτυχές μπορούν να αναλυθούν για να διαφοροποιήσουν τις καταστάσεις του Ευάλωτου Διαδικτύου: - **Κωδικός Κατάστασης**: Διαχωρισμός μεταξύ **διαφορετικών κωδικών κατάστασης 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. - **Χρόνος**: Παρατήρηση σταθερών χρονικών διαφορών μεταξύ των δύο καταστάσεων. ### Inclusion Methods - **HTML Elements**: Το HTML προσφέρει διάφορα στοιχεία για **συμπερίληψη πόρων από διαφορετικές προελεύσεις**, όπως στυλ, εικόνες ή σενάρια, αναγκάζοντας τον περιηγητή να ζητήσει έναν μη-HTML πόρο. Μια συλλογή πιθανών HTML στοιχείων για αυτό το σκοπό μπορεί να βρεθεί στο [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks). - **Frames**: Στοιχεία όπως **iframe**, **object** και **embed** μπορούν να ενσωματώσουν HTML πόρους απευθείας στη σελίδα του επιτιθέμενου. Εάν η σελίδα **λείπει προστασία πλαισίωσης**, η JavaScript μπορεί να έχει πρόσβαση στο αντικείμενο παραθύρου του πλαισίου μέσω της ιδιότητας contentWindow. - **Pop-ups**: Η μέθοδος **`window.open`** ανοίγει έναν πόρο σε μια νέα καρτέλα ή παράθυρο, παρέχοντας μια **χειριστή παραθύρου** για την αλληλεπίδραση της JavaScript με μεθόδους και ιδιότητες σύμφωνα με το SOP. Οι αναδυόμενες οθόνες, που χρησιμοποιούνται συχνά σε διαδικασίες αυτόματης σύνδεσης, παρακάμπτουν τους περιορισμούς πλαισίωσης και cookie ενός πόρου στόχου. Ωστόσο, οι σύγχρονοι περιηγητές περιορίζουν τη δημιουργία αναδυόμενων παραθύρων σε ορισμένες ενέργειες χρηστών. - **JavaScript Requests**: Η JavaScript επιτρέπει άμεσες αιτήσεις σε πόρους στόχου χρησιμοποιώντας **XMLHttpRequests** ή το **Fetch API**. Αυτές οι μέθοδοι προσφέρουν ακριβή έλεγχο πάνω στην αίτηση, όπως η επιλογή να ακολουθήσουν HTTP ανακατευθύνσεις. ### Leak Techniques - **Event Handler**: Μια κλασική τεχνική διαρροής στα XS-Leaks, όπου οι χειριστές γεγονότων όπως **onload** και **onerror** παρέχουν πληροφορίες σχετικά με την επιτυχία ή αποτυχία φόρτωσης πόρων. - **Σφάλματα**: Εξαιρέσεις JavaScript ή ειδικές σελίδες σφαλμάτων μπορούν να παρέχουν πληροφορίες διαρροής είτε άμεσα από το μήνυμα σφάλματος είτε διαχωρίζοντας την παρουσία και την απουσία του. - **Παγκόσμιοι Περιορισμοί**: Φυσικοί περιορισμοί ενός περιηγητή, όπως η χωρητικότητα μνήμης ή άλλοι επιβεβλημένοι περιορισμοί του περιηγητή, μπορούν να σήμαναν πότε έχει φτάσει ένα όριο, λειτουργώντας ως τεχνική διαρροής. - **Παγκόσμια Κατάσταση**: Ανιχνεύσιμες αλληλεπιδράσεις με τις **παγκόσμιες καταστάσεις** των περιηγητών (π.χ., η διεπαφή Ιστορίας) μπορούν να εκμεταλλευτούν. Για παράδειγμα, ο **αριθμός των καταχωρίσεων** στην ιστορία ενός περιηγητή μπορεί να προσφέρει ενδείξεις σχετικά με σελίδες από διαφορετικές προελεύσεις. - **Performance API**: Αυτό το API παρέχει **λεπτομέρειες απόδοσης της τρέχουσας σελίδας**, συμπεριλαμβανομένου του χρόνου δικτύου για το έγγραφο και τους φορτωμένους πόρους, επιτρέποντας συμπεράσματα σχετικά με τους ζητούμενους πόρους. - **Αναγνώσιμες Ιδιότητες**: Ορισμένες HTML ιδιότητες είναι **αναγνώσιμες από διαφορετικές προελεύσεις** και μπορούν να χρησιμοποιηθούν ως τεχνική διαρροής. Για παράδειγμα, η ιδιότητα `window.frame.length` επιτρέπει στη JavaScript να μετρά τα πλαίσια που περιλαμβάνονται σε μια ιστοσελίδα από διαφορετική προέλευση. ## XSinator Tool & Paper Το XSinator είναι ένα αυτόματο εργαλείο για **έλεγχο περιηγητών έναντι αρκετών γνωστών XS-Leaks** που εξηγούνται στην εργασία του: [**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf) Μπορείτε να **πρόσβαση στο εργαλείο στο** [**https://xsinator.com/**](https://xsinator.com/) > [!WARNING] > **Εξαιρούμενες XS-Leaks**: Αναγκαστήκαμε να εξαιρέσουμε XS-Leaks που βασίζονται σε **εργαζόμενους υπηρεσιών** καθώς θα παρεμβαίνουν σε άλλες διαρροές στο XSinator. Επιπλέον, επιλέξαμε να **εξαιρέσουμε XS-Leaks που βασίζονται σε κακή διαμόρφωση και σφάλματα σε μια συγκεκριμένη διαδικτυακή εφαρμογή**. Για παράδειγμα, κακές διαμορφώσεις CrossOrigin Resource Sharing (CORS), διαρροές postMessage ή Cross-Site Scripting. Επιπλέον, εξαιρέσαμε τις χρονικά βασισμένες XS-Leaks καθώς συχνά υποφέρουν από αργές, θορυβώδεις και ανακριβείς. ## **Timing Based techniques** Ορισμένες από τις παρακάτω τεχνικές θα χρησιμοποιήσουν το χρόνο ως μέρος της διαδικασίας για να ανιχνεύσουν διαφορές στις πιθανές καταστάσεις των ιστοσελίδων. Υπάρχουν διάφοροι τρόποι μέτρησης του χρόνου σε έναν περιηγητή ιστού. **Ρολόγια**: Το [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) API επιτρέπει στους προγραμματιστές να αποκτούν μετρήσεις χρόνου υψηλής ανάλυσης.\ Υπάρχει ένας σημαντικός αριθμός APIs που οι επιτιθέμενοι μπορούν να καταχραστούν για να δημιουργήσουν έμμεσες ρολόγια: [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), [Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel), [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout), CSS animations, και άλλα.\ Για περισσότερες πληροφορίες: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/). ## Event Handler Techniques ### Onload/Onerror - **Inclusion Methods**: Frames, HTML Elements - **Detectable Difference**: Status Code - **More info**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/) - **Summary**: αν προσπαθήσετε να φορτώσετε έναν πόρο, τα γεγονότα onerror/onload ενεργοποιούνται με την επιτυχία/αποτυχία φόρτωσης του πόρου, είναι δυνατόν να καταλάβετε τον κωδικό κατάστασης. - **Code example**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)]() {{#ref}} xs-search/cookie-bomb-+-onerror-xs-leak.md {{#endref}} Το παράδειγμα κώδικα προσπαθεί να **φορτώσει αντικείμενα σενάριων από JS**, αλλά **άλλα tags** όπως αντικείμενα, στυλ, εικόνες, ήχοι θα μπορούσαν επίσης να χρησιμοποιηθούν. Επιπλέον, είναι επίσης δυνατό να εισαχθεί το **tag απευθείας** και να δηλωθούν τα γεγονότα `onload` και `onerror` μέσα στο tag (αντί να τα εισάγουμε από JS). Υπάρχει επίσης μια έκδοση αυτής της επίθεσης χωρίς σενάριο: ```html ``` In this case if `example.com/404` is not found `attacker.com/?error` will be loaded. ### Onload Timing - **Inclusion Methods**: HTML Elements - **Detectable Difference**: Timing (γενικά λόγω Περιεχομένου Σελίδας, Κωδικός Κατάστασης) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) - **Summary:** The [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API** can be used to measure how much time it takes to perform a request. However, other clocks could be used, such as [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming) which can identify tasks running for more than 50ms. - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) another example in: {{#ref}} xs-search/performance.now-example.md {{#endref}} #### Onload Timing + Forced Heavy Task This technique is just like the previous one, but the **attacker** will also **force** some action to take a **relevant amount time** when the **answer is positive or negative** and measure that time. {{#ref}} xs-search/performance.now-+-force-heavy-task.md {{#endref}} ### unload/beforeunload Timing - **Inclusion Methods**: Frames - **Detectable Difference**: Timing (γενικά λόγω Περιεχομένου Σελίδας, Κωδικός Κατάστασης) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) - **Summary:** The [SharedArrayBuffer clock](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) can be used to measure how much time it takes to perform a request. Other clocks could be used. - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) The time taken to fetch a resource can be measured by utilizing the [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) and [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) events. The **`beforeunload`** event is fired when the browser is about to navigate to a new page, while the **`unload`** event occurs when the navigation is actually taking place. The time difference between these two events can be calculated to determine the **duration the browser spent fetching the resource**. ### Sandboxed Frame Timing + onload - **Inclusion Methods**: Frames - **Detectable Difference**: Timing (γενικά λόγω Περιεχομένου Σελίδας, Κωδικός Κατάστασης) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) - **Summary:** The [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API can be used to measure how much time it takes to perform a request. Other clocks could be used. - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) It has been observed that in the absence of [Framing Protections](https://xsleaks.dev/docs/defenses/opt-in/xfo/), the time required for a page and its subresources to load over the network can be measured by an attacker. This measurement is typically possible because the `onload` handler of an iframe is triggered only after the completion of resource loading and JavaScript execution. To bypass the variability introduced by script execution, an attacker might employ the [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) attribute within the ` ``` ### #ID + error + onload - **Inclusion Methods**: Frames - **Detectable Difference**: Page Content - **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**: Page Content - **More info**: - **Summary:** Αν η **σελίδα** **επιστρέφει** το **ευαίσθητο** περιεχόμενο, **ή** ένα **περιεχόμενο** που μπορεί να **ελεγχθεί** από τον χρήστη. Ο χρήστης θα μπορούσε να ορίσει **έγκυρο JS κώδικα στην αρνητική περίπτωση**, να **φορτώνει** κάθε προσπάθεια μέσα σε **`