OWASP Top 10 2013 - A2 Eludere l'autenticazione e gestione della sessione

Tempo di lettura: 8 minuti
Data pubblicazione: May 29, 2016

L'Open Web Application Security Project (OWASP) è una community online, un progetto open-source che offre consigli, guide, articoli e software nell’ambito della sicurezza delle applicazioni. L’OWASP Top 10 include una lista delle maggiori vulnerabilità che un’applicazione web può avere, e l’obbiettivo è quello di educare sulle conseguenze che possono avere delle implementazioni errate e facilmente vulnerabili. Altri progetti degni di nota dalla stessa community sono i Cheat Sheets, una pagina completa di guide approfondite per le maggiori vulnerabilità conosciute, e l’OWASP testing guide. In questa serie di articoli andrò ad analizzare e testare ogni vulnerabilità con esempi pratici, utilizzando Mutillidae.

Dopo aver introdotto e spiegato l'Injection, eccoci con un nuovo articolo, stavolta su come eludere l’autenticazione e sulla gestione della sessione di login.

A2 Eludere l’autenticazione e gestione della sessione

introa2Hijacking
introa2Hijacking

Uno dei controlli di sicurezza maggiori da effettuare quando si crea, progetta e programma un’applicazione è il login. Quanto potrebbe essere valido un sito se è possibile loggarsi con un qualsiasi account e sfruttare l’identità di altre persone? Pensate anche solo ad un servizio come Amazon; e se fosse possibile autenticarsi con l’account di un altra persona utilizzando i suoi dati della carta di credito?

In questo articolo verranno introdotte alcune tecniche per bypassare l’autenticazione ad applicazioni web, e come è possibile autenticarsi senza conoscere o avere i dati effettivi di login.

Enumerazione degli utenti

Già in passato avevo introdotto l'Enumerazione, questa tecnica consiste nel trovare informazioni sugli utenti e dei servizi di un sistema. In questo caso cercheremo di trovare gli utenti registrati al sito, in modo da poter successivamente tentare un attacco di forza bruta ed entrare in un account senza conoscerne la password. Utilizzerò Burp Suite, in modo da rendere automatico il processo.

Per prima cosa, guardo la sorgente della pagina di login e noto che è presente uno script in cui è presente la variabile lAuthenticationAttemptResultFlag che permette al client di capire se un utente esiste o meno. Grazie a questa variabile possiamo effettuare l’operazione. Se la variabile è 0, l’account non esiste, altrimenti (se è 1) l’account esiste.

lAuthenticationAttemptResultFlag
lAuthenticationAttemptResultFlag

Apro Burp Suite, imposto il browser e apro la pagina di login di Mutillidae. Dopo che Burp Suite ha caricato correttamente la richiesta la invio all’Intruder, il quale ci permetterà di effettuare l’attacco

Richiesta di login tramite Burp
Richiesta di login tramite Burp

Nell’Intruder evidenzio solo l’username per effettuare l’enumerazione

intruder
intruder

Seleziono la lista di nomi utenti da provare nel tab Payload, ed infine imposto il Grep Match nelle opzioni. Quest’ultima operazione ci permetterà di capire se un utente esiste o meno, poiché il browser risponderà con un TRUE se l’account esiste, FALSE altrimenti. Per impostarla basta copiare la variabile trovata prima e incollarla nell’apposito spazio.

grepmatch1
grepmatch1

Fatto ciò, clicco su Intruder->Start Attack e il software inizia ad eseguire l’operazione. Dopo pochi minuti, terminata l’operazione, noto subito gli account esistenti, i quali hanno la spunta sulla variabile impostata precedentemente

logintrue
logintrue

Ora, avendo trovato un account di nome admin, proverò a trovare la password dello stesso.

Bruteforce

Il metodo Forza Bruta è uno degli attacchi più famosi e conosciuti. Esso consiste nel provare tutte le combinazioni possibili fino a che non si trova quella corretta (l’avevo usato anche per trovare i dati di login del router). Esistono diversi software per effettuare questa tecnica, io utilizzerò Hydra.

Hydra è uno dei migliori tools per effettuare tecniche di forza bruta contro molti protocolli (HTTP, SSH, FTP, MYSQL, etc.). Per visualizzare le opzioni basta digitare, come al solito

hydra -h
hydrahelp1
hydrahelp1

L’utilizzo è abbastanza semplice, specialmente con protocolli come ssh, telnet o http-get. Nel nostro caso, Mutillidae utilizza il metodo HTTP-POST, cosa che rende un attimo le cose più complesse, ma nulla di eccezionale (per chi non sapesse la differenza post vs get, può leggere qui). La pagina che Mutillidae ci presenta è questa

mutilogin1
mutilogin1

Provando manualmente con un paio di account, si nota subito che ci avvisa se l’account non esiste, o la password è sbagliata. In questo modo possiamo focalizzarci con il nome di un solo account, piuttosto che provare molti nomi.

accountciao
accountciao
accountadmin1
accountadmin1

Il comando di hydra che andrò ad utilizzare è

hydra -l admin -P psw/wordlists-user-passwd/passwds/johnpassword.lst 127.0.0.1 http-post-form "/index.php?page=login.php:username=^USER^&password=^PASS^&login-php-submit-button=Login:Not Logged In" -V

dove:

  • -l indica il nome dell’account da utilizzare. Se non l’avessi saputo avrei utilizzato -L con una lista di nomi da testare;

  • -P si riferisce al file contenente le password (preso - come sempre - da questa lista);

  • 127.0.0.1 è l’indirizzo da attaccare;

  • http-post-form è il “protocollo” utilizzato. Se fosse stato un get, avrei utilizzato http-get-form. Nell’help di prima sono comunque elencati tutti;

  • "/index.php?page=login.php:username=^USER^&password=^PASS^&login-php-submit-button=Login:Not Logged In" si riferisce all’indirizzo da attaccare. Spiegandolo con più precisione:

    1. /index.php?page=login.php è la pagina in cui siamo, si trova nella barra degli indirizzi;
    2. username=^USER^&password=^PASS^ sono i dati che il sito invia al server per autenticarsi. Per sapere come si chiamano, è possibile analizzare la pagina vedendo la sorgente (tasto destro nel browser->vedi sorgente) oppure con un plugin come Web-Developer. Io ho utilizzato quest’ultimo, il quale evidenzia i nomi dei form in questo modo

    webdevform Si può notare l’utilizzo di username e password per i due rispettivi campi

    1. login-php-submit-button=Login:Not Logged In, come sopra, è il nome del “pulsante” Login (l’ultima riga in rosso della precedente immagine).
  • -V opzione che permette di visualizzare tutti i tentativi che il software effettuerà.

Dopo aver lanciato il comando, aspetto pochi minuti, ed ecco che ha trovato la password dell’account.

hydra bruteforce
hydra bruteforce

N.B. Come al solito questo procedimento è illegale, e qualsiasi sysadmin di un sito si accorge di un eventuale attacco di questo tipo. Vengono fatte richieste multiple, a volte migliaia nel corso di pochi minuti. Hydra permette l’utilizzo di un proxy (come tor).