Discussione Google CTF Log-Me-In [WriteUp]

Z3N0

Utente Silver
25 Ottobre 2020
79
7
64
51
Premetto che scrivo questa guida anche per vedere se qualcuno più esperto di me saprebbe darmi una spiegazione del perché il check della password viene bypassato.

Google CTF Log-Me-in
potete trovare la CTF QUI
Prima di iniziare scarichiamo la risorsa che ci viene fornita, che si rivela essere uno script express-js. Come inizio ci viene presentato un sito dove sono presenti home, about, profile, flag e login.
googleCTF.png
navigando su Flag ci viene riportato un errore che dice bisogna essere loggati per accedere a flag. Andando su Login e provando i classici admin:admin ecc si riesce ad avere accesso come admin ma comunque tornando alla pagina Flag ci viene detto che solo l'utente michelle ha accesso alla flag. Capiamo quindi che dobbiamo far in modo di identificarci come michelle , andiamo a dare un occhiata allo script che ci hanno dato:
come vediamo dal codice qualora non avessimo tentato il login con le credenziali di default admin:admin ecc..
Codice:
const targetUser = "michelle"
ci suggerisce che dobbiamo bypassare il login ed identificarci come mihcelle.
Scorrendo ancora vediamo che per il login esiste una query:


Per fare ciò andremo a giocare un pò con i parametri della richiesta POST, in quanto il bodyParser.urlencoded ha come opzione extended : true questo ci suggerisce che possiamo codificare array ed oggetti nel formato URL-Encoded come viene anche spiegato nella Doc. ufficiale di ExpressJS :
Codice:
bodyParser.urlencoded([options])
Returns middleware that only parses urlencoded bodies and only looks at requests where the Content-Type header matches the type option. This parser accepts only UTF-8 encoding of the body and supports automatic inflation of gzip and deflate encodings.

A new body object containing the parsed data is populated on the request object after the middleware (i.e. req.body). This object will contain key-value pairs, where the value can be a string or array (when extended is false), or any type (when extended is true).

Options
The urlencoded function takes an optional options object that may contain any of the following keys:

extended
The extended option allows to choose between parsing the URL-encoded data with the querystring library (when false) or the qs library (when true). The “extended” syntax allows for rich objects and arrays to be encoded into the URL-encoded format, allowing for a JSON-like experience with URL-encoded. For more information, please see the qs library.

Defaults to true, but using the default has been deprecated. Please research into the difference between qs and querystring and choose the appropriate setting.

iniziamo quindi inviando qualche richiesta con curl modificando la richiesta tenendo in mente che però l'unico user in grado di accedere alla flag è michelle andremo quindi a modificare la richiesta in questo modo:
Codice:
username=michelle&password[prova]=&csrf=
questo ci restituisce un errore : Unknown error: Error: ER_BAD_FIELD_ERROR: Unknown column 'prova' in 'where clause' da questo errore ci dice che la colonna prova non esiste nella clausola where quindi proviamo a cambiare quel prova con una colonna che sappiamo esiste ovvero username e rimandiamo la richiesta in questo modo:
Codice:
curl -X POST https://log-me-in.web.ctfcompetition.com/login -d "username=michelle" -d "password[username]="
Per qualche oscuro motivo riesce a bypassare il check della password è ci fa autenticare come michelle. Una volta loggati vediamo che la risposta che riceviamo è un 302 e non il solito 200, il 302 è un redirect inoltre nella risposta vediamo che il cookie di sessione viene risettato. La flag potete estrarla decondificando il coockie che è in base-64.

Vorrei sapere se qualcuno riesce a spiegarmi cosa accade precisamente passando quel password[username]=
sicuramente passerà username come oggetto con attributo null visto che dopo l'uguale non c'è niente, ma perché viene bypassato il check della password.

Spero la guida possa tornare utile a qualcuno anche se suggerisco sempre di usare gli WriteUp e Walkthrough come ultima spiaggia e leggere solamente la parte che vi permette di andare al passo successivo per ritornare poi ad andare avanti da soli.