tags: Serializzazione Deserializzazione Hacking_Deserialization


La pratica di serializzare i dati viene fatta perchè porta notevoli vantanggi in fase di trasferimento o di stoccaggio, ma se fatta in maniera non sicura può portare a conseguenze molto gravi come RCE o reverse shell.

Ogni linguaggio di programmazione ha le sue funzioni che permettono la serializzazione per esempio PHP serializza in questo modo:

$serialized_note = serialize($note);

Un esempio di programma che serializza le note dell’utente potrebbe essere:

class Notes {
    public $Notescontent;
 
    public function __construct($content) {
        $this->Notescontent = $content;
    }
}
 
$note = new Notes("Welcome to THM");
$serialized_note = serialize($note);

Lo stesso pogramma lo si può fare anche con Python, Python utilizza un modulo chiamato Pickle per serializzare e deserializzare gli oggetti. Questo modulo converte un oggetto Python in un flusso di byte (e viceversa), consentendone il salvataggio in un file o la trasmissione in rete. Pickling è uno strumento potente per gli sviluppatori Python perché gestisce quasi tutti i tipi di oggetti Python senza richiedere alcuna gestione manuale dello stato dell’oggetto:

import pickle
import base64
 
...
serialized_data = request.form['serialized_data']
notes_obj = pickle.loads(base64.b64decode(serialized_data))
message = "Notes successfully unpickled."
...
 
elif request.method == 'POST':
    if 'pickle' in request.form:
        content = request.form['note_content']
        notes_obj.add_note(content)
        pickled_content = pickle.dumps(notes_obj)
        serialized_data = base64.b64encode(pickled_content).decode('utf-8')
        binary_data = ' '.join(f'{x:02x}' for x in pickled_content)
        message = "Notes pickled successfully."