Οι επιθέσεις XSS επιτρέπουν στους επιτιθέμενους να εισάγουν σενάρια από την πλευρά του πελάτη σε ιστοσελίδες που προβάλλονται από άλλους χρήστες. Τα κύρια αποτελέσματα αυτής της ευπάθειας είναι η δυνατότητα εκτέλεσης οποιωνδήποτε ενεργειών στο πλαίσιο του συνδεδεμένου χρήστη και η ανάγνωση οποιωνδήποτε δεδομένων στο πλαίσιο του συνδεδεμένου χρήστη.
Σενάριο επίθεσης
Ο επιτιθέμενος εντοπίζει την ευπάθεια XSS σε έναν ιστότοπο που χρησιμοποιεί το θύμα, π.χ. τον ιστότοπο μιας τράπεζας.
Το θύμα είναι συνδεδεμένο σε αυτή τη σελίδα
Ο επιτιθέμενος στέλνει στο θύμα μια παραποιημένη διεύθυνση URL
Το θύμα κάνει κλικ στη διεύθυνση URL
Στο θύμα τράπεζα ιστοσελίδα, JavaScriptκωδικός αρχίζει να εκτελείται για να υποκλέψει τα δεδομένα του χρήστη ή να εκτελέσει μια μεταφορά για λογαριασμό του στο λογαριασμό του επιτιθέμενου.
Αξίζει να σημειωθεί ότι οι πράξεις που εκτελούνται για λογαριασμό του θύματος μπορεί να είναι αόρατες για το θύμα, καθώς μπορεί να λαμβάνουν χώρα στο παρασκήνιο χρησιμοποιώντας το API της τράπεζας, ή ο επιτιθέμενος μπορεί να τις εκτελέσει αργότερα με τα δεδομένα που απαιτούνται για τον έλεγχο ταυτότητας, τα tokens, τα cookies κ.λπ.
Τύποι XSS
1. Reflected XSS
Πρόκειται για ένα είδος όπου ο κώδικας HTML/JavaScript που περιέχεται σε οποιαδήποτε παράμετρο (π.χ. GET, POST ή cookie) εμφανίζεται στην απόκριση.
Μια σελίδα με είσοδο κειμένου για αναζήτηση για κάτι που βάζει την παράμετρο ?search=foo στην κατάληξη της διεύθυνσης URL κατά την αναζήτηση του API. Μετά την εισαγωγή οποιασδήποτε φράσης, εάν δεν βρεθεί, τοποθετείται ένα μήνυμα επιστροφής σε HTML ex.
<div>Δεν βρέθηκε αποτέλεσμα για <b>foo</b></div>
Μπορούμε να προσπαθήσουμε να βάλουμε τη διεύθυνση URL ?search=..
2.DOM XSS
Αυτό συμβαίνει όταν η εκτέλεσή του ενεργοποιείται με τη χρήση επικίνδυνων λειτουργιών στο JavaScript, όπως `eval` ή `innerHtml`. Το "Ζωντανό παράδειγμα" παρακάτω δείχνει μια επίθεση DOM XSS με βάση το `innerHtml` λειτουργία.
3. Αποθηκευμένο XSS
Εδώ ο κακόβουλος κώδικας γράφεται στην πλευρά του διακομιστή. Για παράδειγμα, μπορούμε να στείλουμε ένα σχόλιο με κακόβουλο κώδικα σε μια δημοσίευση ιστολογίου που μεταφορτώνεται στον διακομιστή. Το έργο του είναι, για παράδειγμα, να περιμένει τη μετριοπάθεια του διαχειριστή και στη συνέχεια να κλέψει τα δεδομένα της συνεδρίας του κ.λπ.
Μέθοδοι έγχυσης
1. Στο περιεχόμενο της ετικέτας
`onerror=alert('XSS')`στο
<img src onerror="alert('XSS')" />
2. Στο περιεχόμενο του χαρακτηριστικού
`" onmouseover=alert('XSS')` στο
<div class="" onmouseover="alert('XSS')""></div>
Στο περιεχόμενο του χαρακτηριστικού χωρίς τα εισαγωγικά
x onclick=alert('XSS')στο
<div class="x" onclick="alert('XSS')"></div>
Στο hrefΧαρακτηριστικό ef
javascript:alert('XSS') στο
<a href="javascript:alert('XSS')"></a>
Στη συμβολοσειρά μέσα στον κωδικό JavaScript
";alert('XSS')// στο
Στο χαρακτηριστικό με το συμβάν JavaScript
');alert('XSS')// όπου ', είναι ένα απλό εισαγωγικό, σε
Κωδικοποίηση δεδομένων με χρήση ενσωματωμένων συναρτήσεων που βρίσκονται σε πολλά γλώσσες προγραμματισμού.
Χρήση συστημάτων προτύπων με αυτόματη κωδικοποίηση. Τα περισσότερα από τα δημοφιλή πλαίσια που χρησιμοποιούν τέτοια συστήματα μας προστατεύουν από την έγχυση XSS (Django, Templates, Vue, React κ.λπ.).
Μην χρησιμοποιείτε συναρτήσεις όπως eval ή Λειτουργία με αναξιόπιστα δεδομένα χρηστών.
Μην χρησιμοποιείτε συναρτήσεις και ιδιότητες που αναθέτουν κώδικα HTML απευθείας στα στοιχεία του δέντρου DOM, π.χ, innerHTML, outerHTML, insertAdjacentHTML, ocument.write. Αντ' αυτού, μπορείτε να χρησιμοποιήσετε συναρτήσεις που αναθέτουν κείμενο απευθείας σε αυτά τα στοιχεία, όπως η textContent ή innerText.
Να είστε προσεκτικοί όταν ανακατευθύνετε τον χρήστη σε μια διεύθυνση URL που βρίσκεται υπό τον έλεγχό του. Κίνδυνος έγχυσης location = 'javascript('XSS')'.
Φιλτράρετε την HTML χρησιμοποιώντας βιβλιοθήκες όπως DOMPurify.
Να είστε προσεκτικοί με το ανέβασμα .html ή .svg αρχεία. Μπορείτε να δημιουργήσετε έναν ξεχωριστό τομέα από τον οποίο θα εξυπηρετούνται τα ανεβασμένα αρχεία.
Χρησιμοποιήστε το Πολιτική ασφάλειας περιεχομένου μηχανισμό.
Ρίξτε μια ματιά στα φίλτρα anti-XSS που είναι ενσωματωμένα στα πιο δημοφιλή προγράμματα περιήγησης.
Αν βρήκατε αυτό το άρθρο ενδιαφέρον, ακολουθήστε τον Lukasz στο Github: https://github.com/twistezo