tags: Identificazione_Deserializzazione Deserializzazione
Dove guardare per capire se c’è serializzazione
Nel contesto web la serializzazione di solito si nasconde in:
-
Cookie di sessione o “remember me”
-
Parametri dell’URL (query string) o hidden field nei form
-
Body di richieste POST/PUT (specialmente se non è JSON “pulito”)
-
Header custom (es.
X-User-Data,X-Preferences, ecc.) -
Oggetti passati via API interne (meno immediato, ma nei lab a volte è simulato)
Approccio pratico con Burp/ZAP:
-
Intercetti una richiesta.
-
Guardi TUTTI i parametri:
-
Se vedi stringhe brevi tipo
id=5,page=home→ poco interessante. -
Se vedi roba del tipo:
-
stringhe lunghissime Base64-ish (
eyJ...,rO0...,Tzox..., ecc.) -
blob binari o esadecimali molto lunghi
allora ti scatta il sospetto: “questo potrebbe essere un oggetto serializzato”.
-
-
-
Provi a:
-
Decodificare Base64
Se dopo il decode vedi:-
JSON leggibile → probabilmente NO native serialization (è solo JSON).
-
Testo strano con pattern tipo
O:8:"stdClass":1:{...}→ PHP. -
Prefisso
rO0AB→ Java. -
Sequenze come
i:1;s:4:"test";→ PHP serialize. -
Caratteri binari sporchi con header costante → possibile Java/.NET/Pickle ecc.
-
-
PortSwigger definisce proprio l’insecure deserialization come “quando dati controllabili dall’utente vengono deserializzati dall’applicazione”
Tilde
Un metodo comune utilizzato dai pentester è quello di aggiungere una ~ alla fine del nome di un file PHP è una tecnica comune utilizzata dagli aggressori per tentare di accedere a file di backup o temporanei creati da editor di testo o sistemi di controllo versione. Quando un file viene modificato o salvato, alcuni editor di testo o sistemi di controllo versione potrebbero creare una copia di backup del file originale con una tilde aggiunta al nome del file.
Per esempio:
http://10.80.188.227/who/index.php~Messaggi di errore
Alcuni messaggi di errore possono indicare indirettamente problemi con la serializzazione. Ad esempio, PHP potrebbe generare errori o avvisi che contengono frasi come unserialize() o errore di deserializzazione dell’oggetto, che sono indizi di processi di serializzazione sottostanti e potenziali punti di vulnerabilità.
Incoerenze nel comportamento dell’applicazione
Comportamenti imprevisti in risposta a input manipolati (ad esempio, cookie modificati o dati POST) possono suggerire problemi con il modo in cui i dati vengono deserializzati e gestiti. Osservare il modo in cui l’applicazione gestisce i dati serializzati alterati può fornire indizi sul codice potenzialmente vulnerabile.
Cookie
I cookie vengono spesso utilizzati per archiviare dati serializzati nelle applicazioni web. Esaminando il contenuto dei cookie si può normalmente dedurre:
Valori codificati Base64 nei cookie (PHP e .NET)
Se i cookie contengono dati che sembrano codificati Base64, la decodifica potrebbe rivelare oggetti serializzati o strutture dati. PHP utilizza spesso la serializzazione per la gestione delle sessioni e la memorizzazione delle variabili di sessione in formato serializzato.
Stato di visualizzazione ASP.NET
Le applicazioni .NET potrebbero utilizzare la serializzazione nello stato di visualizzazione inviato al browser del client. A volte è possibile vedere un campo denominato __VIEWSTATE, che è codificato base64. Decodificarlo ed esaminarlo può rivelare se contiene dati serializzati che potrebbero essere sfruttati.
Riconoscere i formati più comuni
### Java serialization
Pattern tipici:
- In **hex**: il flusso Java serializzato inizia spesso con `AC ED 00 05`.
- In **Base64**, lo stesso header appare tipicamente come stringhe che iniziano con:
`rO0AB` (frequentissimo).
Se in un cookie o in un parametro vedi `rO0AB` + roba lunga e incomprensibile, è quasi sicuramente Java serialized object.
---
### NET
Per .NET, tipico pattern:
- Stringhe Base64 che iniziano con `AAEAAAD/////` [Cobalt+1]
Se trovi un valore lunghissimo, Base64, che inizia così → sospetto fortissimo di deserializzazione .NET.
---
### PHP `serialize() / unserialize()`
Molto più leggibile:
- Pattern:**`a:`, `s:`, `i:`, `O:`** seguiti da numeri e `;`/`:{`
Esempio di valore che potresti trovare in un cookie o in un parametro:
`a:2:{s:4:"user";s:5:"admin";s:5:"isAdmin";b:1;}`
Oppure oggetti:
`O:4:"User":2:{s:4:"name";s:5:"admin";s:7:"isAdmin";b:1;}`
Questo è classicissimo **PHP serialize()**, ed è proprio collegato alle classiche PHP Object Injection / insecure deserialization. [qwiet.ai+1](https://qwiet.ai/an-insecure-deserialization-cheat-sheet/?utm_source=chatgpt.com)
---
### Python `pickle`
Sul wire si vede come:
- Binary blob che può iniziare con `0x80 0x03` o `0x80 0x04` (a seconda del protocollo)
- In Base64 non ha un pattern “carino” come `rO0` (Java), ma spesso, se decodifichi, vedi cose tipo:
- `c__builtin__\nexec\n` oppure
- `cos\nsystem\n(S'ls'...`
Nel mondo reale `pickle` non è comunissimo in HTTP per le app classiche, ma:
- è usatissimo in backend, microservizi, code (es. Celery), ML model loading, ecc.
---
### Altri (giusto per cultura)
- **Ruby** (Marshal): header `0408` e struttura particolare.
- **Framework custom**: qualche app serializza oggetti in JSON ma con metadati di tipo (es. `$type` in JSON.NET, ecc.), che possono portare comunque a deserializzazione pericolosa.