← Tutti i cheatsheet

eWPT · Exploitation & Post-Ex

Insecure Deserialization

Difficoltà: Advanced Time to Master: 2h Prerequisiti: 07-CMS-Exploitation.md Lab: OWASP WebGoat, modulo Insecure Deserialization


Obiettivo

Questo è probabilmente l’argomento più “da capire concettualmente, senza doverlo padroneggiare a fondo” di tutto il cheatsheet, e te lo dico chiaro: non è il cuore di eWPT, ma lasciarlo del tutto sconosciuto è un rischio che non vale la pena correre, perché quando capita in un lab (o all’esame) è quasi sempre un salto diretto a RCE. L’idea di fondo è questa: molte applicazioni serializzano oggetti (li trasformano in una stringa/bytes per salvarli o spedirli) e poi li deserializzano quando servono di nuovo. Se l’app deserializza dati che arrivano da te senza validarli, e il linguaggio lo permette, puoi costruire un oggetto che durante la deserializzazione esegue codice arbitrario. Non serve capire ogni dettaglio della gadget chain per riconoscerla ed evitare di ignorarla.


Concetti chiave

Serializzazione, in una frase

Un oggetto in memoria (con i suoi campi, il suo stato) viene convertito in una sequenza di byte/testo per essere salvato su disco, messo in un cookie, o mandato su rete; deserializzare fa il percorso inverso, ricreando l’oggetto da quella sequenza.

Perché deserializzare dati non fidati è pericoloso

Il processo di deserializzazione, in molti linguaggi, non si limita a “leggere dati”: può invocare automaticamente metodi dell’oggetto che sta ricostruendo (costruttori, metodi “magici” chiamati durante il processo). Se un attaccante controlla i byte serializzati, controlla anche quali oggetti vengono istanziati e quali metodi vengono chiamati: con la “gadget chain” giusta (una sequenza di classi già presenti nell’applicazione o nelle sue librerie), questo porta a esecuzione di comandi.

Dove riconoscerlo

Indizio Perché è un candidato
Cookie o parametro con stringa Base64 che decodifica in qualcosa di illeggibile/binario spesso un oggetto serializzato (Java, PHP, .NET)
Header/valore che inizia con O: seguito da un numero firma tipica di un oggetto PHP serializzato (O:4:"User":2:{...})
Header/valore che inizia con rO0 (Base64) o byte AC ED 00 05 firma di un oggetto Java serializzato
API che accetta esplicitamente formati come Java serialization, PHP unserialize(), .NET BinaryFormatter il linguaggio te lo dice: se lo vedi documentato, testalo

Strumenti

Tool Uso Output Note
ysoserial java -jar ysoserial.jar CommonsCollections6 'id' > payload.bin payload Java serializzato pronto genera gadget chain note per librerie Java comuni
PHPGGC phpggc Laravel/RCE1 system 'id' payload PHP serializzato pronto equivalente di ysoserial per gadget chain PHP note (Laravel, Symfony, ecc.)
Burp (decoder manuale) decodifica Base64 e ispeziona la struttura struttura dell’oggetto serializzato primo passo per capire cosa stai guardando prima di lanciare un tool

Payload / Esempi

Cookie: session_data=Tzo0OiJVc2VyIjoyOntzOjQ6Im5hbWUiO3M6NToiYWRtaW4iO3M6NDoicm9sZSI7czoxOiIxIjt9
echo "Tzo0OiJVc2VyIjoyOntzOjQ6Im5hbWUiO3M6NToiYWRtaW4iO3M6NDoicm9sZSI7czoxOiIxIjt9" | base64 -d
# O:4:"User":2:{s:4:"name";s:5:"admin";s:4:"role";s:1:"1";}

Spiegazione: decodificato, il valore rivela chiaramente la firma O:4:"User" tipica di un oggetto PHP serializzato con due campi; anche solo modificando role e ri-serializzando/ri-codificando in Base64 potresti già ottenere un’escalation di privilegi banale, prima ancora di parlare di gadget chain per RCE.

Esempio 2: generare un payload RCE con ysoserial (Java)

java -jar ysoserial.jar CommonsCollections6 'id' > payload.bin

Spiegazione: ysoserial costruisce l’oggetto serializzato che, una volta deserializzato dall’applicazione target, esegue il comando indicato (id), sfruttando classi di Apache Commons Collections tipicamente già presenti come dipendenza in molte app Java: la scelta della “gadget chain” giusta (CommonsCollections6 è solo un esempio) dipende dalle librerie effettivamente in uso sul target.

Esempio 3: generare un payload RCE con PHPGGC (PHP)

phpggc Laravel/RCE1 system 'id' -b

Spiegazione: stesso principio di ysoserial ma per l’ecosistema PHP: -b codifica direttamente in Base64 il payload, pronto per essere inserito in un cookie o parametro che l’app deserializzerà con unserialize().


Evasion / Bypass Techniques

  • Se l’applicazione firma i dati serializzati (HMAC) per impedire la manomissione, cercare la chiave di firma leaked (config esposta, repository pubblico) è spesso l’unico modo per procedere: senza chiave valida, un payload modificato viene scartato prima ancora della deserializzazione
  • Alcune gadget chain richiedono che una libreria specifica sia presente in una versione precisa: se il primo tentativo fallisce, prova a enumerare le dipendenze effettive dell’app (a volte visibili in errori di stack trace) prima di cambiare gadget chain a caso

Lab Hands-On

Lab 1: OWASP WebGoat, Insecure Deserialization

Obiettivo: identificare un cookie contenente un oggetto Java serializzato e sfruttarlo per eseguire un comando Difficulty: Difficile Time: 1h

Walkthrough breve:

  1. Individua il cookie/parametro sospetto e conferma che è un oggetto serializzato (decodifica e cerca la firma)
  2. Genera un payload con ysoserial usando una gadget chain compatibile con le librerie note dell’app
  3. Sostituisci il valore originale col payload generato e osserva l’esecuzione

Common Mistakes

  • Ignorare del tutto l’argomento perché “avanzato” -> riconoscerlo (la firma O:, rO0, AC ED 00 05) richiede due minuti e ti evita di lasciare sul tavolo un RCE diretto
  • Provare a modificare a mano un oggetto serializzato senza aggiornare la lunghezza dichiarata delle stringhe (es. s:5:"admin") -> il parser scarta l’oggetto come malformato prima ancora di deserializzarlo
  • Usare ysoserial/PHPGGC senza prima capire quale linguaggio/libreria gira sul target -> è tempo perso, il fingerprinting dello stack (già visto in Reconnaissance) viene prima


Connessioni


Checklist di padronanza

  • So riconoscere la firma di un oggetto serializzato PHP e uno Java
  • Capisco perché deserializzare dati non fidati è pericoloso, a livello concettuale
  • So generare un payload con ysoserial o PHPGGC data una gadget chain nota
  • So quando un dato firmato (HMAC) blocca la manomissione diretta del payload