A (security) bug’s life

Immagino ci sia un path per migrare dalla tua versione perlomeno all’ultima LTS che ha gli aggiornamenti di sicurezza?

Probabilmente e’ un percorso lungo e tortuoso vista la situazione datata :asd: ma purtroppo e’ cosi quando non si tocca piu qualcosa “perche’ funziona” e 10 anni dopo metterci mano diventa una missione lunare

1 Like

Si ma poi boh

Da la’ il mio :mumble:

1 Like

No, al contrario e’ abbastanza complicato e ho dovuto manipolare alcune cose nella session per farlo funzionare. Complicato anche perche’ session cookie e’ HttpOnly, quindi non posso accedere ad esso con JavaScript direttamente e ho dovuto essere “creativo” :slight_smile:

Vabbe’ pero’ non puoi tirare sti bait e poi non spiegare un cazzo, possa un angelo biblicamente accurato farmi visita se mento.

Maschera il nome e quando arrivi a dettagli importanti cambia in qualcosa tipo:

E poi ho usato un attacco sql injection → e parapim parapam

Inb4 la descrizione che diventa: E’ parapim parapam, poi parapim parapam, e quindi parapim parapam.

e poi arrivo il Sig. Vaprolano che in combutta con Telotronkomir decise che fosse l’ora di indossa un Setinchini T’nculo
Si… sembra interessante.

OK, qui alcuni dettagli tecnici (scrivero’ una write up sul mio nuovo blog se mi danno il permesso).

  • E’ un media streaming service che richiede una subscription attiva per fare streaming, e limita streaming a 2 device per account.
  • Ho trovato che se condivido un cookie che contiene il device id un token contenuto nel session cookie (che e’ in formato JSON e include anche due altri token) con un altro account su un altro device, questo altro account puo’ fare streaming con la subscription del primo account, da illimitati device perche’ il 2-device limit non sembra funzionare in questo caso.
  • Risultato: 1 singola subscription condivisa tra molti accounti che possono fare streaming da unlimited device
  • Problema n.1: il session cookie e’ HttpOnly, quindi non posso accedervi con JavaScript che e’ una premessa per automatizzare l’attacco; pero’ ho trovato che il token che mi serve e’ anche ritornato nel response quandi fai una request per il login, quindi posso prenderlo da li’. Per fare questo, faccio una fetch request all’endpoint e estraggo il token che mi serve dal JSON nel response. Questa fetch request deve accadere quando si e’ sui sito target per evitare problemi con CORS.
  • Problema n.2: c’e’ un terzo cookie che dice al client se l’utente e’ loggato o no (true/false), e anche questo e’ HttpOnly.
  • Siccome questi due cookie sono HttpOnly, non posso modificarli o cancellarli cosi’ da cambiarne i valori
  • Dunque un requisito per l’exploit per funzionare e’ che l’utente, una volta aperto il sito, deve resettare data per quel sito (che richiede qualche secondo con Chrome, Firefox etc quindi non e’ un problema); in questo modo quei cookie sono assenti quando lancio l’exploit

Workflow dell’exploit:

  1. Utente con la subscription (User A) apre la console nel browser mentre e’ loggato al sito, ed esegue alcune linee di JavaScript per caricare un JavaScript file da un dominio che controllo
  2. Questo JavaScript chiede con prompt di insierire email e password dell’account, cosi’ puo’ fare una fetch request all’endpoint per il login, ed estrarre il token che mi serve; una volta ottenuto questo, un dialog compare con una textarea che contiene un po’ di JavaScript (25 linee o qualcosa del genere) generato automaticamente. Questo e’ codice che User A deve condividere con altre persone
  3. Un altra persona, User B, apre il sito, fa reset dei dai per rimuovere i cookie HttpOnly, richiede username e password per fare login indirettamente, sempre con una fetch request per estrarre informazioni dal response, e poi crea i cookie necessari con i dati manipolati. Dal momento che questi cookie erano assenti, il mio JS li puo’ ricreare tranquillamente (mentre non potrebbe modificare cookie esistenti a causa di HttpOnly)
  4. La pagina viene ricaricata automaticamente, User B e’ adesso loggato e puo’ fare streaming con la subscription di User A

Con il mio PoC exploit hai bisogno di caricare un po’ di JavaScript che e’ gia’ facile e impiega alcuni secondi soltanto, ma spendendo un po’ piu’ di tempo si puo’ rendere il tutto anche piu’ semplice.

2 Likes

Sono curioso di capire, qui ci sono 2 aree di interesse se non erro:

  • vulnerabilita’ della piattaforma da un punto di vista di sicurezza
  • anti frode da un punto di vista di non permettere di effettuare piu di 2 stream contemporaneamente in accordo coi T&C

Sulla prima mi sembra che di fatto non ci sia molto, nel senso che per poter fare qualcosa devi richiedere all’utente di fare paste di JS nella console del browser, a quel punto puoi chiedergli di passarti direttamente i cookie.

La seconda e’ interessante perche’ con questo exploit puoi commettere una frode, pero’ allo stesso tempo la soluzione non mi sembra che passi necessariamente da quello che tu hai exploitato ma magari mi sbaglio?

In sostanza la piattaforma deve determinare quanti unique device ci sono che stanno facendo streaming, e hanno mille cose da poter usare, anche banalmente controllare che non ci siano 3 stream da 3 token uguali aka 3 device uguali lato server.

Non sono sicuro di vedere una connessione tra fare questa cosa e la “sicurezza” o sbaglio?

Penso di aver capito ma credo manchi qualche parola qua

se condivido un cookie che contiene il device id un token contenuto nel session cookie

perche’ sta frase non mi sembra abbia senso :asd:

Prova a dirla in inglese se ti viene meglio

Ogni cosa che permette a qualcuno di bypassare controlli e’ tecnicamente una vulnerabilita’ e quindi in tema di sicurezza. In questo caso la vulnerabilita’ non sta nell’acquisire credenziali di altri o cose simili; in questo caso il danno non e’ verso altri utenti ma verso la piattaforma stessa, e dunque e’ tutta una frode se vogliamo vederla cosi’ ma e’ sempre una mancanza in termini di sicurezza.

manca una “e” :D

intendevo "se condivido un cookie che contiene il device id E un token contenuto nel session cookie "

1 Like

:approved: certamente ma per capirci, una delle tante possibili soluzioni da parte della piattaforma potrebbe essere di non toccare nulla di quello che tu hai trovato ma semplicemente mettere un effettivo controllo di “quanti mi stanno chiedendo questo stream contemporaneamente per queste credenziali”?

se ci fosse questo controllo a quel punto quello che tu hai trovato, non essendo in grado di triggerare nessuna frode, verrebbe cmq considerato come vulnerabilita’ di sicurezza?

Trovata un’altra race condition in 4 ore :tada: Posso usare lo stesso voucher con molti account.

cool, e’ interessante quando spieghi come comunque, se deve essere un thread “va che figo sono” diventa :yawn: in frettissima :dunnasd:

1 Like

Se pensi che scrivo in questo thread per dire che sono figo allora non scrivo piu’! Non ne ho bisogno. Gia’ ho avuto delle critiche perche’ menzionavo le somme delle ricompense (il che mi ha sorpreso perche’ la mia intenzione era soltanto quella di evidenziare come si puo’ guadagnare con bug bounties, nel caso qualcuno e’ interessato a provare).

Mi pare di aver descritto un caso simile comunque la TL;DR:

L’app richiede un pagamento con carta di credito oppure un voucher per acquistare una subscription. Normalmente un voucher dovrebbe essere usabile soltanto una volta, ma se l’applicazione e’ vulnerabile a race conditions come in questo caso, e’ possibile usare un singolo voucher per creare una subscription in molti accounts.

La vulnerabilita’ e’ spesso chiamata “limit overrun” (cioe’ bypassi un limite) basato su race condition. “Race condition” e’ una situazione che accade quando inviii molte richieste al server e il comportamento del server cambia tra l’invio di quelle richieste in parallelo e l’invio delle stesse in sequenza o comunque non allo stesso momento.

Nel caso di un voucher, l’applicazione normalmente flagga il codice come “usato” al primo utilizzo. Ma se invio richieste per fare un ordine con lo stesso voucher code e allo stesso tempo, sfrutto il delay che c’e’ tra l’applicazione del codice in un ordine, and il marking del codice come gia’ usato. Quindi c’e’ la possibilita’, se la applicazione e’ vulnerabile, di creare piu’ ordini con lo stesso voucher prima che il voucher viene markato come usato.

In questo caso, e’ stato un po’ piu’ complesso perche’ l’ordine avviene in due fasi: un ordine draft col voucher, e la conferma dello stesso che crea la subscription.

La tecnica che ho usato e’ la stessa che ho menzionato giorni fa, la “Single packet”, che significa invio tutte le richieste in un singolo TCP packet cosi’ da eliminare i delay e network jitter etc, cosi’ tutte le richieste arrivano al server allo stesso momento.

Tutto qui, e’ abbastabza semplice come concetto credo.

Per evitare questo tipo di problemi, l’applicazione dovrebbe usare qualcosa tipo il pessimistic locking di relational databases (o simile concetto in altri sistemi) cosi’ da bloccare il record di un voucher mentre viene usato per il primo ordine processato dal database, per prevenire l’accesso allo stesso da altri processi per altri ordini.

3 Likes

skylinx quante vulnerabilità trovi in un wordpress medio? :ahsisi:

cioé, io leggo ste cose e poi penso ai siti che tiro su e mi tremano i polsi :asd:

:no: male male

non so se esista l’iSite :thinking: ma probabilmente i nostri clienti non tirerebbero fuori il grano per usarlo :asd:

Scherzi a parte ma per me è una tecnologia molto superata ma resiste perché tanti continuano a venderla e cmq ha una grossa fetta di mercato quindi un po’ anche per inerzia ed ecosistema va avanti.

Secondo me però tipo 80% di chi ha un sito wordpress (cms, server side rendered) in realtà non ne ha bisogno e andrebbe meglio con roba statica che gli costa una nocciolina e si tolgono miriadi di problemi di sicurezza relativi ad avere un server.

Pero’ hey le agenzie ti devono vendere qualcosa quindi il mondo va avanti cosi…

Di solito ignoro Wordpress e normalmente non lo trovi in BB

Prima di partire a testare fai anche qualche ricerca su questi database online che riportano exploit noti? Cerchi di controllare la versione di quello che usano?

Tipo questo :asd: (@Kaya)

E poi ti trovi con un iis su winxp :asd:

WordPress va benissimo per una valanga di use cases (piccola impresa, vetrina, presenza online, sito corporate di rappresentanza, etc) il problema è quando:

  • self host e non stai dietro agli update
  • gli vuoi fare fare quello che non è pensato per fare a suon di ottomila plugin

Che caso vuole è il 90% dei siti di wordpress, ma non è colpa di wp :asd:

1 Like