Τι να κάνετε εάν υπάρχουν ιερογλυφικά αντί για κείμενο (στο Word, πρόγραμμα περιήγησης ή έγγραφο κειμένου). Μεταμφίεση χαρακτήρων: πτυχές ασφαλείας προσανατολισμένες στο unicode Τι να κάνετε εάν ένα αρχείο ανοίξει με ιερογλυφικά

Νομίζω ότι έχετε συναντήσει εκμεταλλεύσεις που έχουν ταξινομηθεί ως Unicode περισσότερες από μία φορές, αναζητήσατε τη σωστή κωδικοποίηση για να εμφανίσετε μια σελίδα και είστε ευχαριστημένοι με τα επόμενα τεχνάσματα εδώ και εκεί. Ποτέ δεν ξέρεις τι άλλο! Αν θέλετε να μάθετε ποιος ξεκίνησε όλο αυτό το χάος και εξακολουθεί να το καθαρίζει μέχρι σήμερα, δέστε τις ζώνες σας και διαβάστε παρακάτω.

Όπως λένε, «η πρωτοβουλία τιμωρείται» και, όπως πάντα, για όλα φταίνε οι Αμερικανοί.

Και ήταν έτσι. Στην αυγή της ακμής της βιομηχανίας υπολογιστών και της εξάπλωσης του Διαδικτύου, προέκυψε η ανάγκη για ένα παγκόσμιο σύστημα αναπαράστασης συμβόλων. Και στη δεκαετία του '60 του περασμένου αιώνα, εμφανίστηκε το ASCII - "American Standard Code for Information Interchange", μια γνωστή κωδικοποίηση χαρακτήρων 7-bit. Το τελευταίο όγδοο αχρησιμοποίητο bit αφέθηκε ως bit ελέγχου για την προσαρμογή του πίνακα ASCII ώστε να ταιριάζει στις ανάγκες κάθε πελάτη υπολογιστή σε μια συγκεκριμένη περιοχή. Αυτό το bit κατέστησε δυνατή την επέκταση του πίνακα ASCII ώστε να χρησιμοποιεί τους δικούς του χαρακτήρες για κάθε γλώσσα. Οι υπολογιστές παρασχέθηκαν σε πολλές χώρες, όπου χρησιμοποιούσαν ήδη τον δικό τους τροποποιημένο πίνακα. Αλλά αργότερα αυτό το χαρακτηριστικό εξελίχθηκε σε πονοκέφαλο, αφού η ανταλλαγή δεδομένων μεταξύ των υπολογιστών έγινε αρκετά προβληματική. Οι νέες κωδικοσελίδες 8-bit δεν ήταν συμβατές μεταξύ τους - ο ίδιος κώδικας θα μπορούσε να σημαίνει πολλούς διαφορετικούς χαρακτήρες. Για την επίλυση αυτού του προβλήματος, ο ISO (Διεθνής Οργανισμός Τυποποίησης) πρότεινε έναν νέο πίνακα, τον "ISO 8859".

Αυτό το πρότυπο μετονομάστηκε αργότερα σε UCS ("Universal Character Set"). Ωστόσο, μέχρι την πρώτη κυκλοφορία του UCS, είχε εμφανιστεί το Unicode. Επειδή όμως οι στόχοι και οι στόχοι και των δύο προτύπων συνέπιπταν, αποφασίστηκε να ενώσουμε τις δυνάμεις μας. Λοιπόν, η Unicode έχει αναλάβει το δύσκολο έργο να δώσει σε κάθε χαρακτήρα έναν μοναδικό προσδιορισμό. Αυτήν τη στιγμή η τελευταία έκδοση του Unicode είναι η 5.2.

Θέλω να σας προειδοποιήσω - στην πραγματικότητα, η ιστορία με τις κωδικοποιήσεις είναι πολύ θολή. Διαφορετικές πηγές παρέχουν διαφορετικά γεγονότα, επομένως δεν πρέπει να εστιάσετε σε ένα πράγμα, απλώς να γνωρίζετε πώς διαμορφώθηκαν τα πάντα και να ακολουθείτε τα σύγχρονα πρότυπα. Ελπίζω ότι δεν είμαστε ιστορικοί.

Μάθημα σύγκρουσης Unicode

Πριν εμβαθύνω στο θέμα, θα ήθελα να εξηγήσω τι είναι το Unicode από τεχνική άποψη. Γνωρίζουμε ήδη τους στόχους αυτού του προτύπου, το μόνο που μένει είναι να επιδιορθώσουμε το υλικό.

Τι είναι λοιπόν το Unicode; Με απλά λόγια, αυτός είναι ένας τρόπος να αναπαραστήσετε οποιονδήποτε χαρακτήρα ως συγκεκριμένο κωδικό για όλες τις γλώσσες του κόσμου. Η τελευταία έκδοση του προτύπου περιέχει περίπου 1.100.000 κωδικούς, οι οποίοι καταλαμβάνουν χώρο από U+0000 έως U+10FFFF. Αλλά να είστε προσεκτικοί εδώ! Το Unicode ορίζει αυστηρά τι είναι ένας κωδικός για έναν χαρακτήρα και πώς αυτός ο κώδικας θα αναπαρασταθεί στη μνήμη. Οι κωδικοί χαρακτήρων (για παράδειγμα, 0041 για τον χαρακτήρα "A") δεν έχουν κανένα νόημα, αλλά υπάρχει μια λογική για την αναπαράσταση αυτών των κωδικών σε κωδικοποιήσεις. Η κοινοπραξία Unicode προσφέρει τους ακόλουθους τύπους κωδικοποιήσεων, που ονομάζονται UTF (Unicode Transformation Formats). Και εδώ είναι:

  • UTF-7: Αυτή η κωδικοποίηση δεν συνιστάται για λόγους ασφαλείας και συμβατότητας. Περιγράφεται στο RFC 2152. Δεν είναι μέρος της Unicode, αλλά εισήχθη από αυτήν την κοινοπραξία.
  • UTF-8: Η πιο κοινή κωδικοποίηση στο χώρο του Ιστού. Είναι μια μεταβλητή, πλάτους 1 έως 4 byte. Συμβατό προς τα πίσω με πρωτόκολλα και προγράμματα που χρησιμοποιούν ASCII. Καταλαμβάνει το εύρος από U+0000 έως U+007F.
  • UTF-16: Χρησιμοποιεί μεταβλητό πλάτος από 2 έως 4 byte. Η πιο κοινή χρήση είναι 2 byte. Το UCS-2 είναι η ίδια κωδικοποίηση, μόνο με σταθερό πλάτος 2 byte και περιορισμένο στα όρια BMP.
  • UTF-32: Χρησιμοποιεί σταθερό πλάτος 4 byte, δηλαδή 32 bit. Ωστόσο, χρησιμοποιούνται μόνο 21 bit, τα υπόλοιπα 11 είναι γεμάτα με μηδενικά. Αν και αυτή η κωδικοποίηση είναι επαχθής από άποψη χώρου, θεωρείται η πιο αποτελεσματική από άποψη απόδοσης λόγω της διευθυνσιοδότησης 32 bit στους σύγχρονους υπολογιστές.

Το πλησιέστερο ανάλογο του UTF-32 είναι η κωδικοποίηση UCS-4, αλλά σήμερα χρησιμοποιείται λιγότερο συχνά.

Παρά το γεγονός ότι τα UTF-8 και UTF-32 μπορούν να αντιπροσωπεύουν λίγο περισσότερους από δύο δισεκατομμύρια χαρακτήρες, αποφασίστηκε να περιοριστούμε σε κάτι περισσότερο από ένα εκατομμύριο για λόγους συμβατότητας με το UTF-16. Ολόκληρος ο χώρος κωδικών ομαδοποιείται σε 17 επίπεδα, το καθένα με 65.536 σύμβολα. Τα πιο συχνά χρησιμοποιούμενα σύμβολα βρίσκονται στο μηδενικό επίπεδο βάσης. Αναφέρεται ως BMP - Basic Multiplane.
Μια ροή δεδομένων σε κωδικοποιήσεις UTF-16 και UTF-32 μπορεί να αναπαρασταθεί με δύο τρόπους - μικρό endian και μεγάλο endian, που ονομάζονται UTF-16LE/UTF-32LE, UTF16BE/UTF-32BE, αντίστοιχα. Όπως ίσως μαντέψατε, το LE είναι μικρό-ενδιανό και το BE είναι μεγάλο-ενδιανό. Αλλά πρέπει με κάποιο τρόπο να μπορούμε να διακρίνουμε αυτές τις παραγγελίες. Για να το κάνετε αυτό, χρησιμοποιήστε το σήμα παραγγελίας byte U+FEFF, στην αγγλική έκδοση - BOM, "Byte Order Mask". Αυτό το BOM μπορεί επίσης να εμφανίζεται στο UTF-8, αλλά δεν σημαίνει τίποτα εκεί.

Για λόγους συμβατότητας προς τα πίσω, το Unicode έπρεπε να φιλοξενήσει χαρακτήρες από υπάρχουσες κωδικοποιήσεις. Αλλά εδώ προκύπτει ένα άλλο πρόβλημα - υπάρχουν πολλές παραλλαγές πανομοιότυπων χαρακτήρων που πρέπει να επεξεργαστούν με κάποιο τρόπο. Επομένως, απαιτείται η λεγόμενη "κανονικοποίηση", μετά την οποία είναι ήδη δυνατή η σύγκριση δύο χορδών. Υπάρχουν 4 μορφές κανονικοποίησης:

  • Μορφή κανονικοποίησης D (NFD): κανονική αποσύνθεση.
  • Μορφή κανονικοποίησης C (NFC): κανονική αποσύνθεση + κανονική σύνθεση.
  • Φόρμα κανονικοποίησης KD (NFKD): συμβατή αποσύνθεση.
  • Μορφή κανονικοποίησης KC ​​(NFKC): συμβατή αποσύνθεση + κανονική σύνθεση.

Τώρα ας μιλήσουμε περισσότερο για αυτές τις περίεργες λέξεις.

Το Unicode ορίζει δύο τύπους ισότητας συμβολοσειρών - την κανονική και τη συμβατότητα.

Το πρώτο περιλαμβάνει την αποσύνθεση ενός σύνθετου συμβόλου σε πολλά μεμονωμένα σχήματα, τα οποία στο σύνολό τους αποτελούν το αρχικό σύμβολο. Η δεύτερη ισότητα βρίσκει το πιο κοντινό σύμβολο που ταιριάζει. Και η σύνθεση είναι ο συνδυασμός συμβόλων από διαφορετικά μέρη, η αποσύνθεση είναι η αντίθετη δράση. Γενικά, κοιτάξτε το σχέδιο, όλα θα μπουν στη θέση τους.

Για λόγους ασφαλείας, η κανονικοποίηση θα πρέπει να γίνει πριν υποβληθεί η συμβολοσειρά σε οποιοδήποτε φίλτρο για επαλήθευση. Μετά από αυτήν τη λειτουργία, το μέγεθος του κειμένου μπορεί να αλλάξει, κάτι που μπορεί να έχει αρνητικές συνέπειες, αλλά θα το δούμε αργότερα.

Από άποψη θεωρίας, αυτό είναι όλο, δεν έχω πει πολλά ακόμα, αλλά ελπίζω να μην έχω χάσει τίποτα σημαντικό. Το Unicode είναι απίστευτα τεράστιο, περίπλοκα, χοντρά βιβλία δημοσιεύονται σε αυτό και είναι πολύ δύσκολο να εξηγηθούν συνοπτικά, προσιτά και πλήρως τα βασικά ενός τόσο δυσκίνητου προτύπου. Σε κάθε περίπτωση, για βαθύτερη κατανόηση θα πρέπει να ελέγξετε τους πλευρικούς συνδέσμους. Έτσι, όταν η εικόνα με το Unicode έχει γίνει περισσότερο ή λιγότερο καθαρή, μπορούμε να προχωρήσουμε.

Οπτική ψευδαίσθηση

Πιθανότατα έχετε ακούσει για πλαστογράφηση IP/ARP/DNS και έχετε μια καλή ιδέα για το τι είναι. Αλλά υπάρχει επίσης η λεγόμενη «οπτική πλαστογράφηση» - αυτή είναι η ίδια παλιά μέθοδος που χρησιμοποιούν ενεργά οι ψαράδες για να εξαπατήσουν τα θύματα. Σε τέτοιες περιπτώσεις, χρησιμοποιείται η χρήση παρόμοιων γραμμάτων, όπως «o» και «0», «5» και «s». Αυτή είναι η πιο κοινή και απλούστερη επιλογή και είναι πιο εύκολο να την παρατηρήσετε. Ένα παράδειγμα είναι η επίθεση phishing του 2000 στο PayPal, η οποία αναφέρεται ακόμη και στις σελίδες του www.unicode.org. Ωστόσο, αυτό έχει μικρή σχέση με το θέμα μας στο Unicode.

Για πιο προχωρημένους τύπους, το Unicode έχει εμφανιστεί στον ορίζοντα, ή πιο συγκεκριμένα, το IDN, το οποίο είναι συντομογραφία για τα «Διεθνοποιημένα Ονόματα Τομέα». Το IDN επιτρέπει τη χρήση εθνικών χαρακτήρων αλφαβήτου σε ονόματα τομέα. Οι καταχωρητές ονομάτων τομέα το τοποθετούν ως βολικό πράγμα, λένε, πληκτρολογήστε το όνομα τομέα στη μητρική σας γλώσσα! Ωστόσο, αυτή η ευκολία είναι πολύ αμφισβητήσιμη. Λοιπόν, εντάξει, το μάρκετινγκ δεν είναι το θέμα μας. Φανταστείτε όμως τι καταφύγιο είναι αυτό για phishers, ειδικούς SEO, κυβερνοκαταλήψεις και άλλα κακά πνεύματα. Μιλάω για ένα εφέ που ονομάζεται πλαστογράφηση IDN. Αυτή η επίθεση ανήκει στην κατηγορία της οπτικής πλαστογράφησης στην αγγλική λογοτεχνία ονομάζεται επίσης «ομογράφος επίθεση», δηλαδή επιθέσεις που χρησιμοποιούν ομόγραφα (λέξεις που είναι πανομοιότυπες στην ορθογραφία).

Ναι, όταν πληκτρολογείτε γράμματα, κανείς δεν θα κάνει λάθος και δεν θα πληκτρολογήσει έναν εσκεμμένα ψευδή τομέα. Αλλά τις περισσότερες φορές, οι χρήστες κάνουν κλικ σε συνδέσμους. Αν θέλετε να πειστείτε για την αποτελεσματικότητα και την απλότητα της επίθεσης, τότε δείτε την εικόνα.

Το IDNA2003 εφευρέθηκε ως ένα είδος πανάκειας, αλλά ήδη από φέτος, το 2010, τέθηκε σε ισχύ το IDNA2008. Το νέο πρωτόκολλο έπρεπε να λύσει πολλά από τα προβλήματα του νεαρού IDNA2003, αλλά εισήγαγε νέες ευκαιρίες για επιθέσεις πλαστογράφησης. Προκύπτουν και πάλι προβλήματα συμβατότητας - σε ορισμένες περιπτώσεις, η ίδια διεύθυνση σε διαφορετικά προγράμματα περιήγησης μπορεί να οδηγήσει σε διαφορετικούς διακομιστές. Το γεγονός είναι ότι το Punycode μπορεί να μετατραπεί διαφορετικά για διαφορετικά προγράμματα περιήγησης - όλα θα εξαρτηθούν από τις τυπικές προδιαγραφές που υποστηρίζονται.
Το πρόβλημα της οπτικής εξαπάτησης δεν σταματά εκεί. Το Unicode έρχεται επίσης στην υπηρεσία των spammers. Μιλάμε για φίλτρα ανεπιθύμητης αλληλογραφίας - τα πρωτότυπα γράμματα αποστέλλονται από τους αποστολείς ανεπιθύμητης αλληλογραφίας μέσω ενός Unicode obfuscator, ο οποίος αναζητά παρόμοιους χαρακτήρες από διαφορετικά εθνικά αλφάβητα χρησιμοποιώντας το λεγόμενο UC-Simlist ("Unicode Similarity List", μια λίστα παρόμοιων χαρακτήρων Unicode) . Αυτό είναι όλο! Το φίλτρο antispam εγκαταλείπει και δεν μπορεί πλέον να αναγνωρίσει κάτι σημαντικό σε ένα τέτοιο χάος χαρακτήρων, αλλά ο χρήστης είναι αρκετά ικανός να διαβάσει το κείμενο. Δεν αρνούμαι ότι βρέθηκε λύση σε αυτό το πρόβλημα, αλλά οι spammers έχουν το πάνω χέρι. Λοιπόν, και κάτι ακόμα από την ίδια σειρά επιθέσεων. Είστε σίγουροι ότι ανοίγετε ένα αρχείο κειμένου και δεν αντιμετωπίζετε ένα δυαδικό;

Στο σχήμα, όπως μπορείτε να δείτε, έχουμε ένα αρχείο που ονομάζεται evilexe. txt. Αλλά αυτό είναι ψευδές! Το αρχείο στην πραγματικότητα ονομάζεται eviltxt.exe. Τι χάλια είναι αυτά σε παρένθεση, ρωτάτε; Και αυτό είναι το U+202E ή η ΠΑΡΑΚΑΤΑΣΤΑΣΗ ΔΕΞΙΑ ΠΡΟΣ ΑΡΙΣΤΕΡΑ, το λεγόμενο Bidi (από τη λέξη αμφίδρομη) - ένας αλγόριθμος Unicode για την υποστήριξη γλωσσών όπως τα αραβικά, τα εβραϊκά και άλλες. Τα τελευταία έχουν γραφή από δεξιά προς τα αριστερά. Μετά την εισαγωγή του χαρακτήρα Unicode RLO, θα δούμε όλα όσα έρχονται μετά το RLO με αντίστροφη σειρά. Ως παράδειγμα αυτής της μεθόδου από την πραγματική ζωή, μπορώ να δώσω μια επίθεση πλαστογράφησης στο Mozilla Firfox - cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3376.

Παράκαμψη φίλτρων - στάδιο Νο. 1

Σήμερα είναι ήδη γνωστό ότι οι μεγάλες φόρμες (μη συντομότερη μορφή) του UTF-8 δεν μπορούν να υποβληθούν σε επεξεργασία, καθώς πρόκειται για μια πιθανή ευπάθεια. Ωστόσο, οι προγραμματιστές PHP δεν μπορούν να πειστούν από αυτό. Ας καταλάβουμε ποιο είναι αυτό το σφάλμα. Ίσως θυμάστε λανθασμένο φιλτράρισμα και utf8_decode(). Αυτή είναι η περίπτωση που θα εξετάσουμε λεπτομερέστερα. Έχουμε λοιπόν αυτόν τον κώδικα PHP: