Exploiting __VIEWSTATE without knowing the secrets
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Bug bounty tip: sign up for Intigriti, a premium bug bounty platform created by hackers, for hackers! Join us at https://go.intigriti.com/hacktricks today, and start earning bounties up to $100,000!
ViewState χρησιμεύει ως η προεπιλεγμένη μηχανισμός στο ASP.NET για τη διατήρηση δεδομένων σελίδας και ελέγχου σε διάφορες ιστοσελίδες. Κατά την απόδοση του HTML μιας σελίδας, η τρέχουσα κατάσταση της σελίδας και οι τιμές που πρέπει να διατηρηθούν κατά τη διάρκεια μιας επαναφοράς (postback) σειριοποιούνται σε συμβολοσειρές κωδικοποιημένες σε base64. Αυτές οι συμβολοσειρές τοποθετούνται στη συνέχεια σε κρυφά πεδία ViewState.
Οι πληροφορίες ViewState μπορούν να χαρακτηριστούν από τις εξής ιδιότητες ή τους συνδυασμούς τους:
Base64:
Αυτός ο τύπος χρησιμοποιείται όταν και οι δύο ιδιότητες EnableViewStateMac
και ViewStateEncryptionMode
είναι ρυθμισμένες σε false.
Base64 + MAC (Κωδικός Αυθεντικοποίησης Μηνυμάτων) Ενεργοποιημένος:
Η ενεργοποίηση του MAC επιτυγχάνεται ρυθμίζοντας την ιδιότητα EnableViewStateMac
σε true. Αυτό παρέχει επαλήθευση ακεραιότητας για τα δεδομένα ViewState.
Base64 + Κρυπτογραφημένος:
Η κρυπτογράφηση εφαρμόζεται όταν η ιδιότητα ViewStateEncryptionMode
είναι ρυθμισμένη σε true, διασφαλίζοντας την εμπιστευτικότητα των δεδομένων ViewState.
Η εικόνα είναι ένας πίνακας που περιγράφει διαφορετικές ρυθμίσεις για το ViewState στο ASP.NET με βάση την έκδοση του .NET framework. Ακολουθεί μια περίληψη του περιεχομένου:
Για οποιαδήποτε έκδοση του .NET, όταν και οι δύο MAC και Κρυπτογράφηση είναι απενεργοποιημένοι, δεν απαιτείται MachineKey, και επομένως δεν υπάρχει εφαρμόσιμη μέθοδος για να το προσδιορίσετε.
Για εκδόσεις κάτω από 4.5, εάν ο MAC είναι ενεργοποιημένος αλλά η Κρυπτογράφηση δεν είναι, απαιτείται MachineKey. Η μέθοδος για τον προσδιορισμό του MachineKey αναφέρεται ως "Blacklist3r."
Για εκδόσεις κάτω από 4.5, ανεξάρτητα από το αν ο MAC είναι ενεργοποιημένος ή απενεργοποιημένος, εάν η Κρυπτογράφηση είναι ενεργοποιημένη, απαιτείται MachineKey. Ο προσδιορισμός του MachineKey είναι έργο για τον "Blacklist3r - Future Development."
Για εκδόσεις 4.5 και άνω, όλοι οι συνδυασμοί MAC και Κρυπτογράφησης (είτε και οι δύο είναι true, είτε ο ένας είναι true και ο άλλος false) απαιτούν MachineKey. Ο MachineKey μπορεί να προσδιοριστεί χρησιμοποιώντας τον "Blacklist3r."
Είναι επίσης δυνατό να απενεργοποιηθεί εντελώς το ViewStateMAC ρυθμίζοντας το κλειδί μητρώου AspNetEnforceViewStateMac
σε μηδέν στο:
Αναγνώριση Χαρακτηριστικών ViewState
Μπορείτε να προσπαθήσετε να προσδιορίσετε αν το ViewState είναι προστατευμένο με MAC καταγράφοντας ένα αίτημα που περιέχει αυτή την παράμετρο με το BurpSuite. Αν το Mac δεν χρησιμοποιείται για την προστασία της παραμέτρου, μπορείτε να το εκμεταλλευτείτε χρησιμοποιώντας YSoSerial.Net
Οι προγραμματιστές μπορούν να αφαιρέσουν το ViewState από το να γίνει μέρος ενός HTTP Request (ο χρήστης δεν θα λάβει αυτό το cookie). Κάποιος μπορεί να υποθέσει ότι αν το ViewState είναι μη παρόν, η υλοποίησή τους είναι ασφαλής από οποιαδήποτε δυνητική ευπάθεια που προκύπτει από την αποσειριοποίηση του ViewState. Ωστόσο, αυτό δεν ισχύει. Αν προσθέσουμε την παράμετρο ViewState στο σώμα του αιτήματος και στείλουμε το σειριοποιημένο payload μας που δημιουργήθηκε χρησιμοποιώντας το ysoserial, θα μπορέσουμε ακόμα να επιτύχουμε εκτέλεση κώδικα όπως φαίνεται στην Περίπτωση 1.
Για να ενεργοποιήσουμε το ViewState MAC για μια συγκεκριμένη σελίδα πρέπει να κάνουμε τις παρακάτω αλλαγές σε ένα συγκεκριμένο αρχείο aspx:
Μπορούμε επίσης να το κάνουμε για την γενική εφαρμογή ρυθμίζοντάς το στο αρχείο web.config όπως φαίνεται παρακάτω:
Καθώς η παράμετρος είναι προστατευμένη με MAC, αυτή τη φορά για να εκτελέσουμε επιτυχώς την επίθεση, πρώτα χρειάζεται το κλειδί που χρησιμοποιήθηκε.
Μπορείτε να προσπαθήσετε να χρησιμοποιήσετε Blacklist3r(AspDotNetWrapper.exe) για να βρείτε το κλειδί που χρησιμοποιήθηκε.
Badsecrets είναι ένα άλλο εργαλείο που μπορεί να εντοπίσει γνωστά machineKeys. Είναι γραμμένο σε Python, οπότε σε αντίθεση με το Blacklist3r, δεν έχει εξάρτηση από Windows. Για τα .NET viewstates, υπάρχει ένα εργαλείο "python blacklist3r", το οποίο είναι ο ταχύτερος τρόπος για να το χρησιμοποιήσετε.
Μπορεί να παρέχεται είτε με το viewstate και τον generator απευθείας:
Ή, μπορεί να συνδεθεί απευθείας στη στοχοθετημένη διεύθυνση URL και να προσπαθήσει να αποσπάσει το viewstate από το HTML:
Για να αναζητήσετε ευάλωτα viewstates σε μεγάλη κλίμακα, σε συνδυασμό με την καταμέτρηση υποτομέων, μπορεί να χρησιμοποιηθεί το badsecrets
BBOT module:
Αν είστε τυχεροί και βρείτε το κλειδί, μπορείτε να προχωρήσετε με την επίθεση χρησιμοποιώντας YSoSerial.Net:
Σε περιπτώσεις όπου η παράμετρος _VIEWSTATEGENERATOR
δεν αποστέλλεται από τον διακομιστή, δεν χρειάζεται να παρέχετε την παράμετρο --generator
αλλά αυτές τις:
Σε αυτή την περίπτωση δεν είναι γνωστό αν η παράμετρος είναι προστατευμένη με MAC. Τότε, η τιμή είναι πιθανό να είναι κρυπτογραφημένη και θα χρειαστείτε το Machine Key για να κρυπτογραφήσετε το payload σας για να εκμεταλλευτείτε την ευπάθεια.
Σε αυτή την περίπτωση το Blacklist3r module είναι υπό ανάπτυξη...
Πριν από το .NET 4.5, το ASP.NET μπορεί να δέχεται μια μη κρυπτογραφημένη ___VIEWSTATE
_παράμετρο από τους χρήστες ακόμα και αν ViewStateEncryptionMode
έχει οριστεί σε Always. Το ASP.NET ελέγχει μόνο την παρουσία της __VIEWSTATEENCRYPTED
παραμέτρου στο αίτημα. Αν κάποιος αφαιρέσει αυτή την παράμετρο και στείλει το μη κρυπτογραφημένο payload, θα επεξεργαστεί κανονικά.
Επομένως, αν οι επιτιθέμενοι βρουν έναν τρόπο να αποκτήσουν το Machinekey μέσω άλλης ευπάθειας όπως η διαδρομή αρχείων, η εντολή YSoSerial.Net που χρησιμοποιήθηκε στην Περίπτωση 2, μπορεί να χρησιμοποιηθεί για να εκτελέσει RCE χρησιμοποιώντας την ευπάθεια αποσυμπίεσης ViewState.
Αφαιρέστε την παράμετρο __VIEWSTATEENCRYPTED
από το αίτημα προκειμένου να εκμεταλλευτείτε την ευπάθεια αποσυμπίεσης ViewState, αλλιώς θα επιστρέψει ένα σφάλμα επικύρωσης MAC Viewstate και η εκμετάλλευση θα αποτύχει.
Μπορούμε να αναγκάσουμε τη χρήση του πλαισίου ASP.NET καθορίζοντας την παρακάτω παράμετρο μέσα στο αρχείο web.config όπως φαίνεται παρακάτω.
Εναλλακτικά, αυτό μπορεί να γίνει καθορίζοντας την παρακάτω επιλογή μέσα στην παράμετρο machineKey
του αρχείου web.config.
Όπως και στην προηγούμενη περίπτωση, το value είναι κρυπτογραφημένο. Στη συνέχεια, για να στείλει μια έγκυρη payload, ο επιτιθέμενος χρειάζεται το κλειδί.
Μπορείτε να προσπαθήσετε να χρησιμοποιήσετε το Blacklist3r(AspDotNetWrapper.exe) για να βρείτε το κλειδί που χρησιμοποιείται:
Για μια πιο λεπτομερή περιγραφή για το IISDirPath και το TargetPagePath ανατρέξτε εδώ
Ή, με το Badsecrets (με μια τιμή γεννήτριας):
Μόλις εντοπιστεί ένα έγκυρο Machine key, το επόμενο βήμα είναι να δημιουργηθεί ένα σειριοποιημένο payload χρησιμοποιώντας YSoSerial.Net
Αν έχετε την τιμή του __VIEWSTATEGENERATOR
, μπορείτε να προσπαθήσετε να χρησιμοποιήσετε την παράμετρο --generator
με αυτή την τιμή και να παραλείψετε τις παραμέτρους --path
και --apppath
.
Μια επιτυχής εκμετάλλευση της ευπάθειας αποσυμπίεσης ViewState θα οδηγήσει σε ένα out-of-band αίτημα σε έναν διακομιστή που ελέγχεται από τον επιτιθέμενο, το οποίο περιλαμβάνει το όνομα χρήστη. Αυτός ο τύπος εκμετάλλευσης αποδεικνύεται σε μια απόδειξη έννοιας (PoC) που μπορεί να βρεθεί μέσω ενός πόρου με τίτλο "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Για περισσότερες λεπτομέρειες σχετικά με το πώς λειτουργεί η διαδικασία εκμετάλλευσης και πώς να χρησιμοποιήσετε εργαλεία όπως το Blacklist3r για να προσδιορίσετε το MachineKey, μπορείτε να αναθεωρήσετε την παρεχόμενη PoC της Επιτυχούς Εκμετάλλευσης.
Η ιδιότητα ViewStateUserKey μπορεί να χρησιμοποιηθεί για να αμυνθεί κατά ενός CSRF attack. Αν έχει οριστεί μια τέτοια κλειδί στην εφαρμογή και προσπαθήσουμε να δημιουργήσουμε το ViewState payload με τις μεθόδους που συζητήθηκαν μέχρι τώρα, το payload δεν θα επεξεργαστεί από την εφαρμογή. Πρέπει να χρησιμοποιήσετε μία ακόμη παράμετρο για να δημιουργήσετε σωστά το payload:
Για όλες τις περιπτώσεις δοκιμών, αν το payload ViewState YSoSerial.Net λειτουργεί επιτυχώς, τότε ο διακομιστής απαντά με “500 Internal server error” έχοντας περιεχόμενο απάντησης “Η πληροφορία κατάστασης είναι μη έγκυρη για αυτή τη σελίδα και μπορεί να έχει διαφθαρεί” και λαμβάνουμε το OOB request.
Ελέγξτε για περισσότερες πληροφορίες εδώ
Tip bug bounty: εγγραφείτε στο Intigriti, μια premium πλατφόρμα bug bounty που δημιουργήθηκε από hackers, για hackers! Ελάτε μαζί μας στο https://go.intigriti.com/hacktricks σήμερα, και αρχίστε να κερδίζετε βραβεία έως $100,000!
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)