XSS (Cross Site Scripting)
Αν ενδιαφέρεστε για καριέρα στον hacking και να χακάρετε το μη χακάρισμα - προσλαμβάνουμε! (απαιτείται άριστη γνώση πολωνικών, γραπτά και προφορικά).
Μεθοδολογία
Ελέγξτε αν οποιαδήποτε τιμή ελέγχετε (παράμετροι, μονοπάτι, κεφαλίδες?, cookies?) αντανακλάται στο HTML ή χρησιμοποιείται από JS κώδικα.
Βρείτε το πλαίσιο όπου αντανακλάται/χρησιμοποιείται.
Αν αντανακλάται
Ελέγξτε ποια σύμβολα μπορείτε να χρησιμοποιήσετε και ανάλογα με αυτό, προετοιμάστε το payload:
Σε ακατέργαστο HTML:
Μπορείτε να δημιουργήσετε νέες ετικέτες HTML;
Μπορείτε να χρησιμοποιήσετε γεγονότα ή χαρακτηριστικά που υποστηρίζουν το πρωτόκολλο
javascript:
;Μπορείτε να παρακάμψετε τις προστασίες;
Ερμηνεύεται το περιεχόμενο HTML από οποιαδήποτε μηχανή JS πελάτη (AngularJS, VueJS, Mavo...), θα μπορούσατε να εκμεταλλευτείτε μια Client Side Template Injection.
Αν δεν μπορείτε να δημιουργήσετε ετικέτες HTML που εκτελούν κώδικα JS, θα μπορούσατε να εκμεταλλευτείτε μια Dangling Markup - HTML scriptless injection ;
Μέσα σε μια ετικέτα HTML:
Μπορείτε να βγείτε σε ακατέργαστο HTML πλαίσιο;
Μπορείτε να δημιουργήσετε νέα γεγονότα/χαρακτηριστικά για να εκτελέσετε κώδικα JS;
Υποστηρίζει το χαρακτηριστικό όπου είστε παγιδευμένοι την εκτέλεση JS;
Μπορείτε να παρακάμψετε τις προστασίες;
Μέσα σε κώδικα JavaScript:
Μπορείτε να διαφύγετε την ετικέτα
<script>
;Μπορείτε να διαφύγετε τη συμβολοσειρά και να εκτελέσετε διαφορετικό κώδικα JS;
Είναι η είσοδός σας σε template literals `` ;
Μπορείτε να παρακάμψετε τις προστασίες;
Javascript λειτουργία που εκτελείται
Μπορείτε να υποδείξετε το όνομα της λειτουργίας που θα εκτελεστεί. π.χ.:
?callback=alert(1)
Αν χρησιμοποιείται:
Θα μπορούσατε να εκμεταλλευτείτε μια DOM XSS, προσέξτε πώς ελέγχεται η είσοδός σας και αν η ελεγχόμενη είσοδός σας χρησιμοποιείται από οποιοδήποτε sink.
Όταν εργάζεστε σε μια σύνθετη XSS μπορεί να βρείτε ενδιαφέρον να γνωρίζετε για:
Debugging Client Side JSΑντανακλώμενες τιμές
Για να εκμεταλλευτείτε επιτυχώς μια XSS το πρώτο πράγμα που πρέπει να βρείτε είναι μια τιμή που ελέγχετε και αντανακλάται στη σελίδα web.
Ενδιάμεσα αντανακλώμενη: Αν διαπιστώσετε ότι η τιμή μιας παραμέτρου ή ακόμα και του μονοπατιού αντανακλάται στη σελίδα web θα μπορούσατε να εκμεταλλευτείτε μια Reflected XSS.
Αποθηκευμένη και αντανακλώμενη: Αν διαπιστώσετε ότι μια τιμή που ελέγχετε αποθηκεύεται στον διακομιστή και αντανακλάται κάθε φορά που αποκτάτε πρόσβαση σε μια σελίδα θα μπορούσατε να εκμεταλλευτείτε μια Stored XSS.
Πρόσβαση μέσω JS: Αν διαπιστώσετε ότι μια τιμή που ελέγχετε αποκτάται χρησιμοποιώντας JS θα μπορούσατε να εκμεταλλευτείτε μια DOM XSS.
Πλαίσια
Όταν προσπαθείτε να εκμεταλλευτείτε μια XSS το πρώτο πράγμα που πρέπει να γνωρίζετε είναι πού αντανακλάται η είσοδός σας. Ανάλογα με το πλαίσιο, θα μπορείτε να εκτελέσετε αυθαίρετο κώδικα JS με διαφορετικούς τρόπους.
Ακατέργαστο HTML
Αν η είσοδός σας αντανακλάται στην ακατέργαστη HTML σελίδα θα χρειαστεί να εκμεταλλευτείτε κάποια ετικέτα HTML προκειμένου να εκτελέσετε κώδικα JS: <img , <iframe , <svg , <script
... αυτές είναι μόνο μερικές από τις πολλές δυνατές ετικέτες HTML που θα μπορούσατε να χρησιμοποιήσετε.
Επίσης, έχετε κατά νου την Client Side Template Injection.
Μέσα σε χαρακτηριστικά ετικετών HTML
Αν η είσοδός σας αντανακλάται μέσα στην τιμή του χαρακτηριστικού μιας ετικέτας θα μπορούσατε να δοκιμάσετε:
Να διαφύγετε από το χαρακτηριστικό και από την ετικέτα (τότε θα είστε στην ακατέργαστη HTML) και να δημιουργήσετε νέα ετικέτα HTML για να εκμεταλλευτείτε:
"><img [...]
Αν μπορείτε να διαφύγετε από το χαρακτηριστικό αλλά όχι από την ετικέτα (
>
είναι κωδικοποιημένο ή διαγραμμένο), ανάλογα με την ετικέτα θα μπορούσατε να δημιουργήσετε ένα γεγονός που εκτελεί κώδικα JS:" autofocus onfocus=alert(1) x="
Αν δεν μπορείτε να διαφύγετε από το χαρακτηριστικό (
"
κωδικοποιείται ή διαγράφεται), τότε ανάλογα με ποιο χαρακτηριστικό η τιμή σας αντανακλάται αν ελέγχετε όλη την τιμή ή μόνο ένα μέρος θα μπορείτε να το εκμεταλλευτείτε. Για παράδειγμα, αν ελέγχετε ένα γεγονός όπωςonclick=
θα μπορείτε να το κάνετε να εκτελεί αυθαίρετο κώδικα όταν κάνετε κλικ. Ένα άλλο ενδιαφέρον παράδειγμα είναι το χαρακτηριστικόhref
, όπου μπορείτε να χρησιμοποιήσετε το πρωτόκολλοjavascript:
για να εκτελέσετε αυθαίρετο κώδικα:href="javascript:alert(1)"
Αν η είσοδός σας αντανακλάται μέσα σε "μη εκμεταλλεύσιμες ετικέτες" θα μπορούσατε να δοκιμάσετε το κόλπο
accesskey
για να εκμεταλλευτείτε την ευπάθεια (θα χρειαστείτε κάποια μορφή κοινωνικής μηχανικής για να το εκμεταλλευτείτε):" accesskey="x" onclick="alert(1)" x="
Παράξενο παράδειγμα του Angular που εκτελεί XSS αν ελέγχετε ένα όνομα κλάσης:
Inside JavaScript code
In this case your input is reflected between <script> [...] </script>
tags of a HTML page, inside a .js
file or inside an attribute using javascript:
protocol:
Αν είναι αντανάκλαση μεταξύ των
<script> [...] </script>
ετικετών, ακόμη και αν η είσοδός σας είναι μέσα σε οποιοδήποτε είδος αποσπασμάτων, μπορείτε να προσπαθήσετε να εισάγετε</script>
και να ξεφύγετε από αυτό το πλαίσιο. Αυτό λειτουργεί επειδή ο περιηγητής θα αναλύσει πρώτα τις ετικέτες HTML και στη συνέχεια το περιεχόμενο, επομένως, δεν θα παρατηρήσει ότι η εισαγόμενη ετικέτα</script>
είναι μέσα στον κώδικα HTML.Αν είναι αντανάκλαση μέσα σε μια συμβολοσειρά JS και το τελευταίο κόλπο δεν λειτουργεί, θα χρειαστεί να βγείτε από τη συμβολοσειρά, εκτελέσετε τον κώδικά σας και ανακατασκευάσετε τον κώδικα JS (αν υπάρχει κάποιο σφάλμα, δεν θα εκτελεστεί):
'-alert(1)-'
';-alert(1)//
\';alert(1)//
Αν είναι αντανάκλαση μέσα σε πρότυπες κυριολεξίες μπορείτε να ενσωματώσετε εκφράσεις JS χρησιμοποιώντας τη σύνταξη
${ ... }
:var greetings = `Hello, ${alert(1)}`
Η κωδικοποίηση Unicode λειτουργεί για να γράψει έγκυρο κώδικα javascript:
Javascript Hoisting
Javascript Hoisting αναφέρεται στην ευκαιρία να δηλώσετε συναρτήσεις, μεταβλητές ή κλάσεις μετά τη χρήση τους, ώστε να μπορείτε να εκμεταλλευτείτε σενάρια όπου ένα XSS χρησιμοποιεί μη δηλωμένες μεταβλητές ή συναρτήσεις. Δείτε την παρακάτω σελίδα για περισσότερες πληροφορίες:
JS HoistingJavascript Function
Πολλές ιστοσελίδες έχουν endpoints που αποδέχονται ως παράμετρο το όνομα της συνάρτησης που θα εκτελεστεί. Ένα κοινό παράδειγμα που μπορεί να συναντήσετε είναι κάτι σαν: ?callback=callbackFunc
.
Ένας καλός τρόπος για να διαπιστώσετε αν κάτι που δίνεται απευθείας από τον χρήστη προσπαθεί να εκτελεστεί είναι τροποποιώντας την τιμή της παραμέτρου (για παράδειγμα σε 'Vulnerable') και κοιτάζοντας στην κονσόλα για σφάλματα όπως:
Σε περίπτωση που είναι ευάλωτο, θα μπορούσατε να προκαλέσετε μια ειδοποίηση απλά στέλνοντας την τιμή: ?callback=alert(1)
. Ωστόσο, είναι πολύ συνηθισμένο αυτά τα endpoints να επικυρώνουν το περιεχόμενο για να επιτρέπουν μόνο γράμματα, αριθμούς, τελείες και κάτω παύλες ([\w\._]
).
Ωστόσο, ακόμη και με αυτόν τον περιορισμό, είναι ακόμα δυνατό να εκτελέσετε ορισμένες ενέργειες. Αυτό συμβαίνει επειδή μπορείτε να χρησιμοποιήσετε αυτούς τους έγκυρους χαρακτήρες για να πρόσβαση σε οποιοδήποτε στοιχείο στο DOM:
Ορισμένες χρήσιμες συναρτήσεις για αυτό:
Μπορείτε επίσης να προσπαθήσετε να ενεργοποιήσετε συναρτήσεις Javascript απευθείας: obj.sales.delOrders
.
Ωστόσο, συνήθως τα endpoints που εκτελούν τη δηλωμένη συνάρτηση είναι endpoints χωρίς πολύ ενδιαφέρον DOM, άλλες σελίδες στην ίδια προέλευση θα έχουν ένα πιο ενδιαφέρον DOM για να εκτελέσουν περισσότερες ενέργειες.
Επομένως, προκειμένου να καταχραστεί αυτή η ευπάθεια σε διαφορετικό DOM αναπτύχθηκε η εκμετάλλευση Same Origin Method Execution (SOME):
SOME - Same Origin Method ExecutionDOM
Υπάρχει κώδικας JS που χρησιμοποιεί μη ασφαλώς κάποια δεδομένα που ελέγχονται από έναν επιτιθέμενο όπως το location.href
. Ένας επιτιθέμενος θα μπορούσε να το εκμεταλλευτεί για να εκτελέσει αυθαίρετο κώδικα JS.
Universal XSS
Αυτού του είδους οι XSS μπορούν να βρεθούν οπουδήποτε. Δεν εξαρτώνται μόνο από την εκμετάλλευση του πελάτη μιας εφαρμογής ιστού αλλά από οποιοδήποτε περίγραμμα. Αυτού του είδους η αυθαίρετη εκτέλεση JavaScript μπορεί ακόμη και να καταχραστεί για να αποκτήσει RCE, διαβάσει αυθαίρετα αρχεία σε πελάτες και διακομιστές, και άλλα. Ορισμένα παραδείγματα:
Server Side XSS (Dynamic PDF)Electron Desktop AppsWAF bypass encoding image
Εισαγωγή μέσα σε ακατέργαστο HTML
Όταν η είσοδός σας αντικατοπτρίζεται μέσα στη σελίδα HTML ή μπορείτε να ξεφύγετε και να εισαγάγετε κώδικα HTML σε αυτό το πλαίσιο, το πρώτο πράγμα που πρέπει να κάνετε είναι να ελέγξετε αν μπορείτε να καταχραστείτε το <
για να δημιουργήσετε νέες ετικέτες: Απλώς προσπαθήστε να αντικατοπτρίσετε αυτό το χαρακτήρα και ελέγξτε αν είναι HTML encoded ή διαγραφεί ή αν είναι αντικατοπτρισμένο χωρίς αλλαγές. Μόνο στην τελευταία περίπτωση θα μπορέσετε να εκμεταλλευτείτε αυτή την περίπτωση.
Για αυτές τις περιπτώσεις επίσης κρατήστε στο μυαλό σας Client Side Template Injection.
Σημείωση: Ένα σχόλιο HTML μπορεί να κλείσει χρησιμοποιώντας******** -->
ή ****--!>
Σε αυτή την περίπτωση και αν δεν χρησιμοποιούνται μαύρες/λευκές λίστες, θα μπορούσατε να χρησιμοποιήσετε payloads όπως:
Αλλά, αν χρησιμοποιείται μαύρη/λευκή λίστα ετικετών/χαρακτηριστικών, θα χρειαστεί να δοκιμάσετε ποια ετικέτες μπορείτε να δημιουργήσετε. Μόλις εντοπίσετε ποιες ετικέτες επιτρέπονται, θα χρειαστεί να δοκιμάσετε χαρακτηριστικά/γεγονότα μέσα στις βρεθείσες έγκυρες ετικέτες για να δείτε πώς μπορείτε να επιτεθείτε στο πλαίσιο.
Δοκιμή ετικετών/γεγονότων
Πηγαίνετε στο https://portswigger.net/web-security/cross-site-scripting/cheat-sheet και κάντε κλικ στο Αντιγραφή ετικετών στο πρόχειρο. Στη συνέχεια, στείλτε όλες αυτές χρησιμοποιώντας το Burp intruder και ελέγξτε αν κάποια ετικέτα δεν ανακαλύφθηκε ως κακόβουλη από το WAF. Μόλις ανακαλύψετε ποιες ετικέτες μπορείτε να χρησιμοποιήσετε, μπορείτε να δοκιμάσετε όλα τα γεγονότα χρησιμοποιώντας τις έγκυρες ετικέτες (στην ίδια ιστοσελίδα κάντε κλικ στο Αντιγραφή γεγονότων στο πρόχειρο και ακολουθήστε την ίδια διαδικασία όπως πριν).
Προσαρμοσμένες ετικέτες
Αν δεν βρείτε καμία έγκυρη HTML ετικέτα, μπορείτε να προσπαθήσετε να δημιουργήσετε μια προσαρμοσμένη ετικέτα και να εκτελέσετε κώδικα JS με το χαρακτηριστικό onfocus
. Στο αίτημα XSS, πρέπει να τελειώσετε το URL με #
για να κάνετε τη σελίδα να εστιάζει σε αυτό το αντικείμενο και να εκτελεί τον κώδικα:
Blacklist Bypasses
Αν χρησιμοποιείται κάποια μορφή μαύρης λίστας, θα μπορούσατε να προσπαθήσετε να την παρακάμψετε με μερικά ανόητα κόλπα:
Length bypass (small XSSs)
Περισσότερα μικρά XSS για διάφορα περιβάλλοντα payload μπορείτε να τα βρείτε εδώ και εδώ.
The last one is using 2 unicode characters which expands to 5: telsr More of these characters can be found here. To check in which characters are decomposed check here.
Click XSS - Clickjacking
If in order to exploit the vulnerability you need the user to click a link or a form with prepopulated data you could try to abuse Clickjacking (if the page is vulnerable).
Impossible - Dangling Markup
If you just think that it's impossible to create an HTML tag with an attribute to execute JS code, you should check Danglig Markup because you could exploit the vulnerability without executing JS code.
Injecting inside HTML tag
Inside the tag/escaping from attribute value
If you are in inside a HTML tag, the first thing you could try is to escape from the tag and use some of the techniques mentioned in the previous section to execute JS code. If you cannot escape from the tag, you could create new attributes inside the tag to try to execute JS code, for example using some payload like (note that in this example double quotes are use to escape from the attribute, you won't need them if your input is reflected directly inside the tag):
Στυλ γεγονότων
Μέσα στο χαρακτηριστικό
Ακόμα και αν δεν μπορείτε να ξεφύγετε από το χαρακτηριστικό ("
κωδικοποιείται ή διαγράφεται), ανάλογα με ποιο χαρακτηριστικό αντικατοπτρίζεται η τιμή σας αν ελέγχετε όλη την τιμή ή μόνο ένα μέρος θα μπορείτε να το εκμεταλλευτείτε. Για παράδειγμα, αν ελέγχετε ένα γεγονός όπως το onclick=
θα μπορείτε να το κάνετε να εκτελεί αυθαίρετο κώδικα όταν κάνετε κλικ.
Ένα άλλο ενδιαφέρον παράδειγμα είναι το χαρακτηριστικό href
, όπου μπορείτε να χρησιμοποιήσετε το πρωτόκολλο javascript:
για να εκτελέσετε αυθαίρετο κώδικα: href="javascript:alert(1)"
Παράκαμψη μέσα σε γεγονός χρησιμοποιώντας HTML κωδικοποίηση/URL κωδικοποίηση
Οι HTML κωδικοποιημένοι χαρακτήρες μέσα στην τιμή των χαρακτηριστικών HTML ετικετών αποκωδικοποιούνται κατά την εκτέλεση. Επομένως, κάτι σαν το παρακάτω θα είναι έγκυρο (το payload είναι με έντονα γράμματα): <a id="author" href="http://none" onclick="var tracker='http://foo?
'-alert(1)-'
';">Go Back </a>
Σημειώστε ότι οποιαδήποτε μορφή HTML κωδικοποίησης είναι έγκυρη:
Σημειώστε ότι η κωδικοποίηση URL θα λειτουργήσει επίσης:
Παράκαμψη εσωτερικού γεγονότος χρησιμοποιώντας κωδικοποίηση Unicode
Ειδικά Πρωτόκολλα Μέσα στο attribute
Εκεί μπορείτε να χρησιμοποιήσετε τα πρωτόκολλα javascript:
ή data:
σε ορισμένα μέρη για να εκτελέσετε αυθαίρετο JS κώδικα. Ορισμένα θα απαιτούν αλληλεπίδραση του χρήστη και άλλα όχι.
Μέρη όπου μπορείτε να εισάγετε αυτά τα πρωτόκολλα
Γενικά, το javascript:
πρωτόκολλο μπορεί να χρησιμοποιηθεί σε οποιαδήποτε ετικέτα που δέχεται το χαρακτηριστικό href
και σε τις περισσότερες από τις ετικέτες που δέχονται το χαρακτηριστικό src
(αλλά όχι <img
)
Άλλες τεχνικές απόκρυψης
Σε αυτή την περίπτωση, το HTML encoding και το Unicode encoding trick από την προηγούμενη ενότητα είναι επίσης έγκυρα καθώς βρίσκεστε μέσα σε ένα attribute.
Moreover, there is another nice trick for these cases: Ακόμα και αν η είσοδός σας μέσα στο javascript:...
είναι κωδικοποιημένη URL, θα αποκωδικοποιηθεί πριν εκτελεστεί. So, if you need to escape from the string using a single quote and you see that είναι κωδικοποιημένη URL, remember that δεν έχει σημασία, it will be interpreted as a single quote during the execution time.
Σημειώστε ότι αν προσπαθήσετε να χρησιμοποιήσετε και τα δύο URLencode + HTMLencode
με οποιαδήποτε σειρά για να κωδικοποιήσετε το payload δεν θα λειτουργήσει, αλλά μπορείτε να τα αναμίξετε μέσα στο payload.
Χρησιμοποιώντας Hex και Octal encode με javascript:
Μπορείτε να χρησιμοποιήσετε Hex και Octal encode μέσα στο src
attribute του iframe
(τουλάχιστον) για να δηλώσετε HTML tags για να εκτελέσετε JS:
Αντεστραμμένο tab nabbing
Αν μπορείτε να εισάγετε οποιαδήποτε διεύθυνση URL σε μια αυθαίρετη <a href=
ετικέτα που περιέχει τα target="_blank" και rel="opener"
χαρακτηριστικά, ελέγξτε τη παρακάτω σελίδα για να εκμεταλλευτείτε αυτή τη συμπεριφορά:
σχετικά με την παράκαμψη χειριστών συμβάντων
Πρώτα απ' όλα, ελέγξτε αυτή τη σελίδα (https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) για χρήσιμους "on" χειριστές συμβάντων. Σε περίπτωση που υπάρχει κάποια μαύρη λίστα που σας εμποδίζει να δημιουργήσετε αυτούς τους χειριστές συμβάντων, μπορείτε να δοκιμάσετε τις παρακάτω παρακάμψεις:
XSS σε "Μη εκμεταλλεύσιμες ετικέτες" (κρυφή είσοδος, σύνδεσμος, κανονική, μετα)
Από εδώ είναι τώρα δυνατό να εκμεταλλευτούμε τις κρυφές εισόδους με:
Και σε meta tags:
Από εδώ: Μπορείτε να εκτελέσετε ένα XSS payload μέσα σε ένα κρυφό χαρακτηριστικό, εφόσον μπορείτε να πεισθείτε τον θύμα να πατήσει τον συνδυασμό πλήκτρων. Στο Firefox Windows/Linux ο συνδυασμός πλήκτρων είναι ALT+SHIFT+X και στο OS X είναι CTRL+ALT+X. Μπορείτε να καθορίσετε έναν διαφορετικό συνδυασμό πλήκτρων χρησιμοποιώντας ένα διαφορετικό πλήκτρο στο χαρακτηριστικό πρόσβασης. Ακολουθεί ο φορέας:
Το XSS payload θα είναι κάτι σαν αυτό: " accesskey="x" onclick="alert(1)" x="
Παράκαμψη Μαύρης Λίστας
Διάφορα κόλπα με τη χρήση διαφορετικής κωδικοποίησης έχουν ήδη αποκαλυφθεί σε αυτή την ενότητα. Πήγαινε πίσω για να μάθεις πού μπορείς να χρησιμοποιήσεις:
HTML κωδικοποίηση (HTML tags)
Unicode κωδικοποίηση (μπορεί να είναι έγκυρος κωδικός JS):
\u0061lert(1)
URL κωδικοποίηση
Hex και Octal κωδικοποίηση
κωδικοποίηση δεδομένων
Παράκαμψη για HTML tags και attributes
Διάβασε τις Παράκαμψεις Μαύρης Λίστας της προηγούμενης ενότητας.
Παράκαμψη για κωδικό JavaScript
Διάβασε την παράκαμψη μαύρης λίστας JavaScript της επόμενης ενότητας.
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;}
Τώρα μπορείς να τροποποιήσεις τον σύνδεσό μας και να τον φέρεις στη μορφή
<a href="" id=someid class=test onclick=alert() a="">
Αυτό το κόλπο ελήφθη από https://medium.com/@skavans_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703
Εισαγωγή μέσα στον κωδικό JavaScript
Σε αυτές τις περιπτώσεις η είσοδός σου θα αντανακλάται μέσα στον κωδικό JS ενός αρχείου .js
ή μεταξύ των ετικετών <script>...</script>
ή μεταξύ HTML events που μπορούν να εκτελέσουν κωδικό JS ή μεταξύ attributes που δέχονται το πρωτόκολλο javascript:
.
Διαφυγή ετικέτας <script>
Αν ο κωδικός σου εισάγεται μέσα σε <script> [...] var input = 'reflected data' [...] </script>
μπορείς εύκολα να διαφύγεις κλείνοντας την ετικέτα <script>
:
Σημειώστε ότι σε αυτό το παράδειγμα δεν έχουμε καν κλείσει την απλή παράθεση. Αυτό συμβαίνει επειδή η ανάλυση HTML εκτελείται πρώτα από τον περιηγητή, η οποία περιλαμβάνει την αναγνώριση στοιχείων της σελίδας, συμπεριλαμβανομένων των μπλοκ σεναρίου. Η ανάλυση της JavaScript για να κατανοήσει και να εκτελέσει τα ενσωματωμένα σενάρια πραγματοποιείται μόνο αργότερα.
Μέσα στον κώδικα JS
Εάν τα <>
απολυμαίνονται, μπορείτε ακόμα να διαφύγετε τη συμβολοσειρά όπου η είσοδός σας είναι τοποθετημένη και να εκτελέσετε αυθαίρετη JS. Είναι σημαντικό να διορθώσετε τη σύνταξη JS, γιατί αν υπάρχουν σφάλματα, ο κώδικας JS δεν θα εκτελεστεί:
Template literals ``
Για να κατασκευάσετε strings εκτός από τα μονά και διπλά εισαγωγικά, η JS δέχεται επίσης backticks ``
. Αυτό είναι γνωστό ως template literals καθώς επιτρέπουν την ενσωμάτωση εκφράσεων JS χρησιμοποιώντας τη σύνταξη ${ ... }
.
Επομένως, αν διαπιστώσετε ότι η είσοδός σας αντικατοπτρίζεται μέσα σε μια JS string που χρησιμοποιεί backticks, μπορείτε να εκμεταλλευτείτε τη σύνταξη ${ ... }
για να εκτελέσετε τυχαίο JS κώδικα:
Αυτό μπορεί να εκμεταλλευτεί χρησιμοποιώντας:
Κωδικοποιημένη εκτέλεση κώδικα
Unicode Encode JS εκτέλεση
Τεχνικές παράκαμψης μαύρων λιστών JavaScript
Συμβολοσειρές
Ειδικές διαφυγές
Αντικαταστάσεις κενών μέσα στον κώδικα JS
Σχόλια JavaScript (από Σχόλια JavaScript κόλπο)
JavaScript νέες γραμμές (από JavaScript νέες γραμμές κόλπο)
JavaScript κενά
Javascript μέσα σε ένα σχόλιο
JavaScript χωρίς παρενθέσεις