Το Cross-Site Scripting, ευρέως γνωστό ως XSS, είναι μια από τις πιο επικίνδυνες μεθόδους επίθεσης που χρησιμοποιείται από κυβερνοεγκληματίες, επομένως είναι ζωτικής σημασίας κάθε προγραμματιστής και ερευνητής ασφάλειας να γνωρίζει τι είναι και πώς να αποτροπή επιθέσεων. Λοιπόν, πώς μπορείτε να αναλάβετε δράση ενάντια στην ευπάθεια XSS; Χρησιμοποιείτε HTML, JavaScript ή DOM για να εμφανίσετε τα δεδομένα που λαμβάνει ένας ιστότοπος από τον χρήστη. Ένας ή περισσότεροι από αυτούς τους τρεις διαφορετικούς τομείς μπορούν να συνεργαστούν.
Πώς να αποτρέψετε το XSS χρησιμοποιώντας HTML
Το XSS επιτρέπει στους εισβολείς να εισάγουν κακόβουλους κωδικούς ή σενάρια σε ιστοσελίδες, που στοχεύουν ανυποψίαστους χρήστες που επισκέπτονται τον ιστότοπο. Αυτό θα μπορούσε να κλέψει προσωπικά δεδομένα, να ανακατευθύνει τους επισκέπτες σε άλλο ιστότοπο που έχει δημιουργηθεί από τον κυβερνοεγκληματία ή με άλλον τρόπο να παραβιάσει την εμφάνιση της ιστοσελίδας. Αλλά μπορείτε να αποτρέψετε αυτό από το να συμβεί? για παράδειγμα, σταματώντας την εισαγωγή HTML.
Φανταστείτε ότι έχετε έναν ιστότοπο με βιβλίο επισκεπτών. Ας υποθέσουμε ότι οι επισκέπτες σας που χρησιμοποιούν αυτό το βιβλίο επισκεπτών μπορούν να γράψουν τα ονόματα και τα μηνύματά τους εδώ και τα μηνύματά τους μπορούν να προβληθούν δημόσια. Ένας εισβολέας που θέλει να κάνει μια δοκιμή XSS στο βιβλίο επισκεπτών σας θα χρησιμοποιήσει την περιοχή που έχετε διαθέσει για τη σύνταξη ενός μηνύματος. Αυτός ο κυβερνοεγκληματίας θα εκτελέσει έναν κώδικα JavaScript εδώ. Για παράδειγμα, ένας εισβολέας θα μπορούσε να χρησιμοποιήσει κώδικα JavaScript όπως:
<γραφή>συναγερμός("Το XSS!")</script>
Ο εισβολέας πρέπει να χρησιμοποιήσει μια ετικέτα σεναρίου για να είναι επιτυχής. Εάν δεν το κάνουν, ο κώδικας JavaScript δεν θα λειτουργήσει. Πρέπει να κωδικοποιήσετε τη δήλωση < έτσι ώστε οι χρήστες να μην μπορούν ποτέ να χρησιμοποιήσουν ετικέτες HTML. Αυτό θα δυσκολέψει τον εισβολέα να εργαστεί με ετικέτες HTML.
Πώς να αποτρέψετε το XSS χρησιμοποιώντας JavaScript
Η λογική στην HTML είναι επίσης ισχύει σε JavaScript. Σε ορισμένες εφαρμογές, είναι δυνατή η εκτύπωση των δεδομένων που λαμβάνονται από τον ιστότοπο από τον χρήστη με έναν κώδικα JavaScript.
Σκεφτείτε αυτήν την κωδικοποίηση:
<p id="Τυπώνω"></Π>
<γραφή>
document.getElementById("δοκιμή").innerHTML = "";
</script>
Φανταστείτε ότι ένας ιστότοπος χρησιμοποιεί ένα μπλοκ κώδικα όπως το παραπάνω. Ο προγραμματιστής χρησιμοποίησε μια ετικέτα "p" που ονομάζεται "print" εδώ. Όπως μπορείτε να δείτε από τον κώδικα, μια τιμή θα προέλθει από την παράμετρο "αναζήτηση" και ο προγραμματιστής θέλει να εμφανίσει αυτήν την εισερχόμενη τιμή στην ετικέτα "p". Ο προγραμματιστής που έκανε αυτή τη λειτουργία ήθελε να χρησιμοποιήσει τη δυνατότητα innerHTML της JavaScript.
Τώρα ας δούμε την κατάσταση από τη σκοπιά του κυβερνοεπιτιθέμενου. Σε μια τέτοια περίπτωση, ο εισβολέας θα εκτελέσει μια δοκιμή XSS εντός της ετικέτας "script". Για αυτό, ο εισβολέας δεν χρειάζεται να επανεκκινήσει την ετικέτα, επειδή χρησιμοποιείται ήδη μια ετικέτα "script". Ο εισβολέας θα μπορούσε στη συνέχεια να γράψει μια δοκιμή όπως αυτή:
όνομα αρχείου.php; αναζήτηση=α" συναγερμός("Το XSS!"); f= "
Αυτός ο κωδικός θα εμφανιστεί στον ιστότοπο ως:
document.getElementById("δοκιμή").innerHTML = " ένα" συναγερμός("Το XSS!"); f="";
Αυτή η επίθεση θα ήταν επιτυχής. Για να κατανοήσουμε καλύτερα το ζήτημα, ας εξετάσουμε ένα ακόμη παράδειγμα τεχνικής που θα μπορούσε να χρησιμοποιήσει ένας εισβολέας. Ο χάκερ μπορεί να έχει εφαρμόσει μια δοκιμή XSS όπως:
όνομα αρχείου.php; αναζήτηση=";</script><em>Φατίχ</em>
Έτσι θα ήταν όταν προβάλλονταν από τον ιστότοπο:
document.getElementById("δοκιμή").innerHTML = "";</script><em>Φατίχ</em>";
Αυτό μπορεί να φαίνεται λίγο περίεργο επειδή ο εισβολέας έχει κλείσει την πρώτη ετικέτα "script" χρησιμοποιώντας μια δομή όπως "/script" εδώ. Και έτσι, ο εισβολέας μπορεί να επανεκκινήσει οποιονδήποτε κώδικα JavaScript και HTML θέλει.
Αν σκεφτείτε αυτά τα δύο διαφορετικά παραδείγματα, η προστασία από το XSS φαίνεται αρκετά απλή. Η απαραίτητη προφύλαξη θα ήταν η κωδικοποίηση του " και ' χαρακτήρες που βλέπετε στο πρώτο παράδειγμα. Στο δεύτερο παράδειγμα, κωδικοποιήστε τους χαρακτήρες < και >.
Πώς να αποτρέψετε το XSS χρησιμοποιώντας το DOM
Σε αυτήν την παραλλαγή του XSS, τα δεδομένα που λαμβάνει ο ιστότοπος από τον χρήστη μπορεί να επηρεάσουν την ιδιότητα ενός στοιχείου DOM. Για παράδειγμα, οι πληροφορίες χρώματος που λαμβάνει ο ιστότοπος από τον χρήστη μπορούν να επηρεάσουν το χρώμα φόντου ενός πίνακα ή ολόκληρο το φόντο της σελίδας. Έτσι ο χρήστης παρεμβαίνει άθελά του στις στυλιστικές διατάξεις του σώματος και του τραπεζιού. Ο παρακάτω κώδικας είναι ένα καλό παράδειγμα για αυτό:
<σώμα bgcolor="<?php echo $_GET['χρώμα']; ?>"/>
Με αυτό, ο ιστότοπος χρησιμοποιεί την παράμετρο "color" που λαμβάνεται από τον χρήστη απευθείας στην ιδιότητα "bgcolor" του στοιχείου "body". Τι θα μπορούσε λοιπόν να κάνει ένας επιθετικός σε αυτό το σημείο; Θα μπορούσαν να εκτελέσουν αυτόν τον κακόβουλο κώδικα:
όνομα αρχείου.php; χρώμα = κόκκινο" onload="συναγερμός('Το XSS!')
Αυτό μοιάζει με αυτό όταν προβάλλεται από τον ιστότοπο:
<σώμα bgcolor=" το κόκκινο" onload="συναγερμός('Το XSS!') "/>
Για να μην συμβεί αυτό, ο προγραμματιστής θα πρέπει να κωδικοποιήσει το " χαρακτήρας.
Ωστόσο, υπάρχει ένα ακόμη σημαντικό στοιχείο στο JavaScript που πρέπει να σημειωθεί. Το ακόλουθο απόσπασμα κώδικα είναι ένα παράδειγμα για αυτό:
<a href="javascript: alert('Το XSS!')">
Αυτό σημαίνει ότι είναι δυνατό να εκτελεστεί κάποιος κώδικας JavaScript απευθείας. Ένα από τα καλύτερα προληπτικά μέτρα είναι να βεβαιωθείτε ότι ο ιστότοπος ελέγχει εάν τα δεδομένα που λαμβάνει από τους χρήστες είναι πραγματικό URL. Η απλούστερη μέθοδος είναι να βεβαιωθείτε ότι υπάρχουν εκφράσεις όπως "HTTP" και "HTTPS" (η ασφαλής έκδοση του HTTP) στη σύνδεση.
Ένα παράδειγμα λειτουργίας για την αποτροπή XSS με PHP
Έχετε δει μερικά παραδείγματα για το πώς να προστατεύσετε μια εφαρμογή ή έναν ιστότοπο από επιθέσεις XSS. Μπορείτε να χρησιμοποιήσετε τα αποσπάσματα κώδικα σε αυτόν τον πίνακα με την PHP:
Κωδικοποίηση σε HTML |
htmlspecialchars($str, ENT_COMPAT) |
Κωδικοποίηση σε JavaScript και χαρακτηριστικό DOM |
htmlspecialchars($str, ENT_NOQUOTES) |
Έλεγχος URL |
'/^(((https?)|(\/\/))).*/'; |
Σημειώστε ότι αυτά είναι απλώς παραδείγματα και θα διαφέρουν ανάλογα με τη γλώσσα λογισμικού που χρησιμοποιείτε.
Μπορείς δημιουργήστε μια διαδικτυακή εφαρμογή με PHP και δοκιμάστε τους κωδικούς που βλέπετε παραπάνω για να τους στείλετε μήνυμα. Αν αναρωτιέστε πώς να χρησιμοποιήσετε όλες αυτές τις μεθόδους, μπορείτε να πάρετε μερικές ιδέες από το μπλοκ κώδικα PHP παρακάτω, το οποίο θα είναι χρήσιμο ακόμα κι αν χρησιμοποιείτε διαφορετική γλώσσα:
<?php
$data = $_GET['data'];λειτουργίαin_attribute($str){
ΕΠΙΣΤΡΟΦΗ htmlspecialchars($str, ENT_COMPAT);
// Το ENT_COMPAT θα κωδικοποιήσει τον χαρακτήρα διπλού εισαγωγικού (").
}
λειτουργίαin_html($str){
$link = '/^(((https?)|(\/\/))).*/';
αν(!preg_match($link, $str))
{
ΕΠΙΣΤΡΟΦΗ "/";
}
ΕΠΙΣΤΡΟΦΗ $str;
}
$data = in_attribute($data);
$data = in_html($data);
$data = real_url (δεδομένα);
?>
Προστατέψτε τον ιστότοπό σας από XSS και άλλα
Το XSS είναι ένας δημοφιλής φορέας επίθεσης που χρησιμοποιείται από χάκερ. Συνήθως, μια τιμή διαδρομής στη διεύθυνση URL, οποιοδήποτε πεδίο στον ιστότοπό σας όπου μπορούν να εισαχθούν δεδομένα (όπως πεδία φόρμες και σχόλια), μπορεί να χρησιμοποιηθεί για τον έλεγχο μιας ευπάθειας XSS. Αλλά φυσικά, υπάρχουν πολλές διαφορετικές μέθοδοι που μπορούν να χρησιμοποιήσουν οι εγκληματίες του κυβερνοχώρου για να επιτεθούν σε έναν ιστότοπο, ειδικά αν έχετε έναν ιστότοπο που έχει πολλούς χρήστες και κρύβει τις πληροφορίες τους.