Come visto sopra, il codice fornisce un errore “Eccezione nel thread “principale” java.lang.ClassCastException: testserialization.ExploitDeser non può essere lanciato su testserialization.Employee ” il che significa che il type-casting non è corretto, tuttavia il codice viene ancora eseguito. La funzione readObject della classe DeserializeDemo è in grado di eseguire l’implementazione personalizzata di readObject della classe ExploitDeser.,
Questo è ciò che è la deserializzazione insicura qui, che anche se c’è ancora un errore di type-casting se i dati serializzati di una classe personalizzata con un’implementazione personalizzata di readObject vengono forniti come input, viene eseguito come mostrato sopra.
Questo è ciò che viene fatto dalle catene di gadget utilizzate da ysoserial e da altri strumenti di sfruttamento della deserializzazione java in cui cercano il concatenamento delle classi per approdare finalmente in un’implementazione personalizzata di readObject che può eseguire codice a livello di sistema fornito come parte dell’input dell’utente.,
Remediation
Ora, che abbiamo dato un’occhiata a ciò che è la deserializzazione e come viene sfruttata, diamo un’occhiata alla bonifica a questo.
La correzione di cui parleremo qui si chiama “Convalida della classe Look-ahead” in cui possiamo whitelist l’elenco delle classi che vogliamo deserializzare. Biru. nel nostro scenario ci aspetteremmo di consentire solo ai dati degli oggetti della classe Employee di essere deserializzati e per rimanere non dovrebbe consentire la deserializzazione.,
Quindi, fondamentalmente ciò che fa questo metodo è, sovrascrive la funzione “resolveClass” che fa parte della classe “ObjectInputStream”(utilizzata durante la deserializzazione) ed esegue un elenco bianco dell’elenco di classess che deve essere deserializzato.
Ora che abbiamo finito con la teoria, passiamo all’implementazione.,
Permette di creare una nuova classe “LookAheadObjectInputStream” estendere a ObjectInputSteam classe in modo che si può ignorare la funzione di membro resolveClass:
Nel codice sopra la riga:
if (!desc.getName().equals(Employee.class.getName())) {
è fondamentalmente cercando se serializzato contenuto contiene un oggetto della classe Employee altro fornisce errore “non autorizzati deserializzazione tentativo” e ne impedisce l’esecuzione.,
Ora, il finale modificato il codice per “DeserializedDemo” è come indicato di seguito:
Nel codice di cui sopra, osservare il codice evidenziato in che invece di chiamare la ObjectInputStream classe, LookAheadObjectInputStream di classe è convocata che andranno a sostituire il resolveClass metodo durante la fase di esecuzione ed eseguire di conseguenza.
Ora, consente di passare il dannoso.,ser file creato in precedenza, come input per la deserializzazione e osservare l’output:
Come si può vedere sopra, questa volta implementazione personalizzata di metodi readobject dalla classe personalizzata “ExploitDeser” non vengono eseguiti durante la deserializzazione., Invece ci viene fornito il messaggio di errore personalizzato “Tentativo di deserializzazione non autorizzato” che è stato impostato nella funzione resolveClass sovrascritta sotto la classe LookAheadObjectInputStream.
Questo è un esempio molto semplice di utilizzo del metodo di convalida della classe look-ahead per prevenire la deserializzazione non sicura. Un’ampia implementazione attorno a questa idea è la libreria” serialKiller”. Link può essere trovato di seguito:
Quindi, questo può essere considerato come una delle soluzioni per mitigare la deserializzazione insicura in java.,
Sto ancora esaminando altri metodi di mitigazione di cui parlerò in seguito.
Si prega di fornire il vostro prezioso feedback. Fino ad allora mantenere l’hacking e l’apprendimento….